The Unofficial Newsletter of Delphi Users - by Robert Vivrette

УРА , массив !!

By John Ellison - john.ellison@which.net

Перевод Руденко Е.В.   janer@newmail.ru    май 2001 года

 

Когда я начал серьезный проект на Delphi примерно  3 года назад, то столкнулся с необходимостью использования массивов компонентов. Если у вас есть форма с целым рядом компонентов одного типа  - например, скажем, ползунковых регуляторов - то они могут быть оформлены в массив и доступ к ним может быть по индексу , а не по имени каждого компонента. 

Итак, скажем у вас есть  4 ползунковых регулятора (trackbars) на вашей форме и вы хотите установить их все в позицию 0 и присвоить уникальный номер  Tag . Если использовать имена компонентов , то можно написать такой код:

Trackbar1.Position := 0;
Trackbar1.Tag := 1;
Trackbar2.Position := 0;
Trackbar2.Tag := 2;
Trackbar3.Position := 0;
Trackbar3.Tag := 4;
Trackbar4.Position := 0;
Trackbar4.Tag := 4;

Теперь, если использовать массив , можно написать такой код:

Var
  TBArray:  Array[1..4] of TTrackbar;

For X := 1 to 4 do
Begin
  TBArray[X].Position := 0;
  TBArray[X].Tag := X;
end;

В данном случае отличие небольшое - но что, если у вас будет  20 регуляторов - в этом случае будет намного легче управляться с массивом компонентов, чем с каждым в отдельности. Для этого случая код такой:

For X := 1 to 20 do
Begin
  TBArray[X].Position := 0;
  TBArray[X].Tag := X;
end;

Итак, если у вас есть доступ к свойствам компонентов массива, то можно ли получить доступ также к методам и событиям?  Это очень просто. Допустим , мы используем вышеприведенный пример и хотим установить число меток (tick marks) на ползунках   (это уникальный метод для компонента  TTrackbar) , мы должны сделать следующее:

For X := 1 to 20 do
Begin
  TBArray[X].SetTick(30);
  TBArray[X].SetTick(60);
  TBArray[X].SetTick(90);
end;

Таким образом установятся одинаковые метки на всех ползунках.
Для Событий необходимо создать одну процедуру, которую затем распространить на все компоненты, например, так :

Procedure Tform1.TrackbarChange(Sender: TObject);
Begin
  With Sender as TTrackbar do
  Begin
    Label1.Caption := IntToStr(TBArray[Tag].Position);

    // Или любой другой процесс по вашему желанию
  end;
end;

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

Конечно у всего этого должна быть и обратная сторона?  При старте вашего приложения массив должен быть заполнен. Простой и примитивный путь написать в разделе инициализации подобные строки кода:

TBArray[1] := Trackbar1;
TBArray[2] := Trackbar2;
TBArray[3] := Trackbar3;   // и так далее .........

Это хорошо , если у вас мало компонентов - но должен же быть более легкий путь?  Вот к чему я пришел:

// Эта процедура сканирует все компоненты на основной форме. При нахождении компонента
// процедура проверяет его имя и размещает его в предварительно заданном массиве элементов
Procedure Tform1.FillArrays;
Var
  C,                                                 // Index компонентов формы
  A: Integer;                                        // Index массива
Begin
  For C := 0 to Componentcount-1 do                  // Для всех компонентов на форме
  Begin
    If (Components[C] is TTrackBar) then             // Если этот компонент - TrackBar 
      For A := 1 to 20 do                            // Проверка на соответствие имени массиву индексов
        If TTrackBar(Components[C]).Name='TrackBar'+Inttostr(A) then
          TBArray[A] := TTrackBar(Components[C]);    // Занесение в массив
  end;
end;

Эта процедура работает с простыми именами компонентов  (Trackbar1, Trackbar2 и т.д.) и может быть применена к любому числу массивов любого типа компонентов. В зависимости от числа компонентов в вашем массиве вы можете использовать либо простые способы, либо данную процедуру. Массив компонентов может быть и динамическим , опять же , в зависимости от числа компонентов. 

Для демонстрации вышеописанного я написал небольшой пример. Вы можете скачать его  здесь.

Возврат в Tips&Tricks