Звертання до довільного компоненту за його номером
Кожний компонент на формі має порядковий номер (нумерація починається з 0). Для звертання до компонента по його номеру використовують властивість:
tтип_компонента(controls[i])
де i – номер компонента. Наприклад:
tedit(controls[0]) – звертання до першого компонента, який є текстовим полем;
tbutton(controls[3]) – звертання до четвертого компонента, який є кнопкою;
tlistbox(controls[4]) – звертання до п'ятого компонента, який є списком.
Розпізнавання типу компонента
Обов'язково стежте за тим, щоб тип компонента з конкретним номером був вірним, а якщо ні, то буде видаватися повідомлення про помилку. Наприклад, ви вирішили очистити перший компонент на формі за допомогою команди:
tedit(controls[0]).text:=’’;
Якщо першим компонентом виявиться не текстове поле, а, наприклад, кнопка button, то видається помилка. Це відбувається тому, що кнопка не має властивості text. Для вирішення цієї проблеми необхідно перш ніж звертатися до компоненту, перевірити його тип за допомогою команди:
if controls[i].classname='TТип_компонента' then
Зверніть увагу, що верхній регістр при зазначенні типу компонента обов'язковий.
В нашому прикладі для звертання до поля можна ввести код:
if controls[0].classname='TEdit' then
tedit(controls[0]).text:=’’;
Якщо перший компонент на формі виявиться текстовим полем, то його буде очищено. Якщо ж перший компонент на формі виявиться не текстовим полем, то код не спрацює, і помилка не виникне.
Обробка набору полів у циклі
При написанні коду часто доводиться обробляти декілька компонентів на формі. В цьому випадку можна використовувати цикл:
for i:=0 to controlcount-1 do
. . .controls[i]. . .
У циклі використовується властивість форми controlcount, яка зберігає кількість усіх компонентів на формі. Так як компоненти на формі нумеруються з 0, то цикл виконується до controlcount-1.
Наведений цикл пройде по всіх компонентах на формі, але серед компонентів може бути багато різнотитпних: написи, текстові поля, прапорці і т.і. Тому, якщо треба пройти по всіх компонентах, але обробити тільки компоненти потрібного класу, то у циклі використовують оператор if.
for i:=0 to controlcount-1 do
if controls[i].classname='ТТип_компонента' then
. . .controls[i]. . .
Приклад. Нехай є форма вигляду:
Для кнопки "Очистити" напишемо код, який очищае всі текстові поля на формі.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=0 to controlcount-1 do
if controls[i].classname='TEdit' then
tedit(controls[i]).Text:='';
end;
Помітка компонентів
Іноді при написанні універсального коду треба серед однотипних компонентів відокремити деякі з них. Наприклад, нехай на попередній формі поле з результатом очищати не потрібно. Для цього це поле треба якось помітити. Для помітки можна використовувати властивість Tag, яку має кожний компонент. Ця властивість може зберігати довільне ціле значення і за замовченням завжди дорівнює 0. Якщо у цю властивість вводити значення, відмінне від 0, і потім перевіряти значення властивості у коді, то відповідний компонент можна виключати із обробки.
Для звернення до цієї властивості у коді використовують запис:
controls[i].tag
В нашому випадку можна для поля з результатом у властивості Tag зазначити значення 1. Тоді код для кнопки "Очистити" буде мати вигляд:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=0 to controlcount-1 do
if controls[i].classname='TEdit' then
if controls[i].tag<>1 then
tedit(controls[i]).Text:='';
end;