« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
    Популярное
Краткое описание SSI

Функция AccessResource

Как избежать кеширования CSS

Соединение XML и Java с XML-компонентами (XMLBeans) в коммерческой деятельности

Интервью со Страуструпом

Диалоговое окно Advanced

Создание калькулятора с командной строкой в Delphi

Глава. 6 ОБОБЩЕНИЕ ДАННЫХ С ПОМОЩЬЮ АГРЕГАТНЫХ ФУНКЦИЙ

Общие Рекомендации Защиты (MySQL и SQL Web-интерфейс)

Управляемое приведение типов




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 96
Пользователей: 0

Статьи:: Delphi :: Разные статьи :: Массив из элементов - как с ним бороться или как с ним дружить



отправить ссылку другу версия для печати  Обсудить на форуме

Массив из элементов - как с ним бороться или как с ним дружить



Автор: Ижогин Ян Валерьевич

  Однажды я опубликовал на статью, в которой создавались массивы из различных компонентов, вплоть до форм. Письма, полученные мною после опубликования, были посвящены зачастую не основной теме статьи, а вопросам по созданию массивов из объектов. Здесь я постараюсь ответить на задаваемые вопросы «оптом». Я не претендую на истину в последней инстанции, но, думаю, что этот материал может быть кому-то полезен:). Здесь информация о

Создание массива

  Ну тут всё просто. Объявляем

var Arr: array[1..n] of TEdit; //к примеру
и можно работать!
Так-же можно объявить и многомерный и даже динамический массив.
var Arr1: array [1..7, 1..5] of TEdit;
  var Arr2: array of TEdit;

Работа с массивом

Опасно не падать, а биться о землю, скалы и другие твёрдые предметы.
(альпинистско - парашютистская мудрость).

  Итак, с созданным массивом надо что-то делать. Ну, для начала, чем-то заполнить. А, в отличие от чисел и строк, которые задаются в виде констант и выражений, объекты, помещаемые в наш массив, нужно создавать. Т.е. если мы описали

var ByteArr: array[1..2] of byte;
то можно написать
ByteArr[1]:=3;

  Что же писать после := для массива из объектов? Их же как-то создать надо? (из форума)
Здесь у нас есть два пути - создавать объекты с помощью Create во время работы программы или использовать объекты, созданные во время проектирования формы. Каждый путь имеет своих путников (почти по Мао - дзе -дуну).

Заполнение массива во время работы программы.

  Этот способ удобен в том случае, когда нужно создать много объектов или число и свойства их заранее неизвестны (в одной программе мне нужно было разбросать по экрану случайным образом все буквы алфавита, а потом еще что-то с ними делать). Действия довольно стандартны. В цикле создаём объекты и присваиваем их элементам массива с помощью следующей конструкции.

   For i:=<начальное значение> to<конечное значение> do begin
    <имя массива>[i]:=<имя класса>.Create(Self);
    <имя массива>[i].Parent:=Self; //за объект ответит форма, на которой он создан
    //<присвоение других свойств - по необходимости>
   end; 
После этих действий у нас на форме появятся необходимые компоненты, к которым можно обращаться, используя индекс массива, например так: <имя массива>[i].

  В следующем примере по щелчку по кнопке будет предложено ввести требуемое количество полей, которое и будет создано в центре формы.

procedure TForm1.Button1Click(Sender: TObject);
var c: string;
     i,n:integer;
begin
 c := InputBox('Введите','число:','7');
 try
  n := StrToInt(c);
 except
  on EConvertError do ShowMessage('Что-то не срослось...');
 end;//Try
 SetLength(Arr2, n);
  for i:=0 to n-1 do begin
   Arr2[i] := TEdit.Create(Self);
   Arr2[i].Parent := Self;
   //Эти две строки создают компонент, далее произвольные действия.
   Arr2[i].Top:=i*Arr2[i].Height;
   Arr2[i].Left:=(ClientWidth-Arr2[i].Width)div 2 ;
   Arr2[i].Text:='Поле '+IntToStr(i);
  end;//for
 Button1.Visible:=FormArraylse;
end;

  При заполнении многомерного массива компонентов таким способом никаких подводных камней нет - организуем несколько циклов.

procedure TForm1.FormCreate(Sender: TObject);
var i, j: byte;
begin
  for i:=1 to 7 do
   for j:=1 to 5 do begin
   Arr1[i,j]:=TEdit.Create(Self);
   Arr1[i,j].Parent := Self;
  //Эти две строки создают компонент, далее произвольные действия.
   Arr1[i,j].Top:=(i-1)*Arr1[i,j].Height;
   Arr1[i,j].Left:=(j-1)*Arr1[i,j].Width;
   Arr1[i,j].Text:='Поле '+ IntToStr(i*j);
  end;//for j
 end;

  Результат - таблица из Edit`ов, с индексированными ячейками.

  Таким образом можно создать даже массив из форм. Разместим форму для создаваемого массива в Unit2.

uses Unit2;//задействуем его
var FormArray: array [1..5] of TForm2;
 //Теперь нам нужно создать массив FormArray, разместить его на главной форме и заполнить его изображениями.
 //Делать это лучше не во время создания формы, а например во время активации.
 procedure TForm1.FormActivate(Sender: TObject);
 var i: byte;
 begin
  for i:=1 to 5 do begin
   FormArray[i]:=TForm2.Create(Self);
   FormArray[i].Parent:=Self;// Создание формы
   // и что-то с ней делаем
   FormArray[i].Visible:=True; //Вывод формы на экран
   FormArray[i].Top:=i*50//Выбор места расположения (здесь ставятся ваши значения)
  end;//for
 end;

  Данный способ подойдёт тем, кто не боится большого кода - ведь все требующиеся свойства создаваемых объектов придётся определять вручную и представляет себе как расположатся на форме созданные объекты. В противном случае придётся потратить немало времени на подбор различных свойств. Впрочем, есть и другой путь...

Использование объектов, созданных во время проектирования формы

  Раньше как было - код, компиляция, запуск, а лицо невесты можно увидеть только после свадьбы. Сейчас всё намного гуманнее. Есть проект, в нём форма, а на форму ставишь компоненты. И почему бы их не «объединить» в массиве?

  Итак, на вашу форму во время проектирования помещено несколько Edit`ов, и вы хотите присвоить их элементам массива Arr.
Можно конечно написать Arr[1]:=Edit1; Arr[2]:=Edit2; и т.д., но это как-то не хорошо:(.
Значительно лучше просмотреть существующие компоненты и, если компонент - TEdit, поместить его в массив. Вот так:

   procedure TForm1.FormCreate(Sender: TObject);
   var i, j: byte;
   begin
    j:=1;
    for i:=0 to ComponentCount-1 do //просматриваем
     if (Components[i] is TEdit) then begin //если подходит
      Arr[j]:=(Components[i] as TEdit);//помещаем
      j:=j+1;
     end;//if
   // а теперь посмотрим, в каком порядке они попали в массив
    for i:=1 to 5 do
     Arr[i].Text:='Arr['+IntToStr(i)+']';
   end;

  На самом деле, такой способ не намного менее коряв, чем присваивание «напрямую». В массив попадут все Edit`ы, присутствующие на форме, причём в порядке их создания. А как быть, если хочется поместить их не все и в своём порядке?
Очевидно, надо указать где-то, кого и в каком порядке мы хотим видеть принятым в члены массива. Под это где-то хорошо заточено свойство Tag - есть у любого компонента, целое число, используется «без вопросов». На этапе проектирования укажите в Tag`е, на каком месте в массиве вы хотите видеть данный компонент. Затем используйте следующий код:

   procedure TForm1.FormCreate(Sender: TObject);
   var i: byte;
   begin
    for i:=0 to ComponentCount-1 do
     if Components[i].Tag>0 then //Tag больше нуля
      Arr[Components[i].Tag]:=(Components[i] as TEdit);//Значит клиент наш!
   end.

  Смотрится значительно лучше. Для организации двух массивов пронумеруйте (протагируйте) компоненты, предназначенные для помещения в первый из массивов как обычно, а во второй, например, с десяти (или с любого другого числа, желательно с круглого - проще считать). Затем напишите что нибудь вроде

var Arr1: array [1..3] of TEdit;
    Arr2: array [1..3] of TEdit;
   procedure TForm1.FormCreate(Sender: TObject);
   var i: byte;
   begin
    for i:=0 to ComponentCount-1 do
     if Components[i].Tag>0 then 
      if Components[i].Tag<10 then
       Arr1[Components[i].Tag]:=(Components[i] as TEdit)
                                          else
       Arr2[Components[i].Tag-10]:=(Components[i] as TEdit);
    end;

  При создании многомерного массива используем тот-же приём - немного поработаем с тагом. Edit`ы протагированы 11.12.13.21.22.23:

var Arr1: array [1..3,1..2] of TEdit;

procedure TForm1.FormCreate(Sender: TObject);
var i, j: byte;
begin
 for i:=0 to ComponentCount-1 do
  if Components[i].Tag>0  then
   Arr1[Components[i].Tag mod 10,Components[i].Tag div 10 ]:=(Components[i] as TEdit);
//убедимся,  что всё получилось
for i:=1 to 3 do
 for j:=1 to 2 do
  arr1[i,j].text := IntToStr(i)+' '+IntToStr(j);
end;

  Если вам надо создать два массива из разных компонентов, то не напрягайтесь со сложным извлечением индекса из тага, а организуйте проверку типа.

var ArrE: array [1..3] of TEdit;
     ArrC: array [1..8] of TComboBox;
procedure TForm1.FormCreate(Sender: TObject);
var i: byte;
begin
for i:=0 to ComponentCount-1 do
if Components[i].Tag>0 then begin
 if (Components[i] is TEdit)
  then ArrE[Components[i].Tag]:=(Components[i] as TEdit);
 if (Components[i] is TComboBox)
  then  ArrC[Components[i].Tag]:=(Components[i] as TComboBox);
end;//if
end;

  При необходимости создания более сложных массивов - комбинируйте эти способы.

  Лирическое отступление. Присвоение объектов происходит не совсем так, как у «обычных» переменных. Если у переменных присваивние не отоджествляет переменные т.е. после a:=3;b:=a;a:=5; в переменной b находится 3, а не 5, то с объектами всё наоборот. После ArrL[1]:=Label1; ArrL[1] и Label1 cтановятся одним объектом, и например ArrL[1].Caption:='Вася'; изменит надпись Label1. В некоторых языках для разруливания этой ситуации для блондинок введён специальный оператор присваивания объектов (Vb, set). Ну мы то, Дельфийцы, народ умный...

Получение номера элемента массива в процедуре обработки события

  Чтобы узнать индекс элемента массива, с которым произошло событие придётся придётся сравнить переменную Sender, использующуюся обработчиком события, со всеми элементами массива и при совпадении извлечь индекс. Похоже только так... Впрочем, может кто знает и лучший способ.

var ArrB: array [1..3] of TButton;
    n: byte;// Здесь будет храниться индекс
procedure TForm1.Clicker(Sender:TObject);
var i: byte;
begin
 for i:=1 to 3 do
  if Sender = ArrB[i] then n:=i;
  //находим индекс компонента, к которому относится событие
 ShowMessage('Нажата кнопка '+IntToStr(n)); //что-то делаем
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: byte;
begin
 for i:=0 to ComponentCount-1 do
  if Components[i].Tag > 0
   then ArrB[Components[i].Tag]:=(Components[i] as TButton);//наполняем массив
 for i:=1 to 3 do
  ArrB[i].OnClick:=Clicker; //устанавливаем обработчик
end;

Ну, как говорится, спасибо за внимание. Ижогин Ян Валерьевич.




Рубрика: Разные статьи




Вышел MySQL 5.1.30, первый стабильный рели....

MySQL

После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:


Подробнее... | Рубрика: MySQL | Добавлено: 28.11.2008

Тестирование параллельных программ.

Тестирование

Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.


Подробнее... | Рубрика: Тестирование | Добавлено: 28.11.2008

Архитектура AMD64 (EM64T).

Архитектура AMD

Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.


Подробнее... | Рубрика: Архитектура AMD | Добавлено: 27.11.2008

Остальные статьи:

Платформа 2009. Определяя будущее
Windows Vista Bridge Sample Library - упра...
Оптимизация 64-битных программ
Подгрузка через AJAX HTML-кода, содержащег...
Обзор нового релиза самой мощной Ajax библ...
Firebug 1.3 и 1.4 alpha — что нового и инт...
Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новы...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейс...
Генераторы отчетов FastReport 4 и QuickRep...


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия