В современных программах на одной форме находится большое количество компонентов, которые постоянно реагируют на работу пользователя. Из-за этого возникает сложность в написании кода для каждого компонента в отдельности или для группы компонентов.
Для примера представим ситуацию, при которой пользователь нажимает кнопку и на форме в 10 компонентах Label случайным образом меняется значение свойства Caption. С первого взгляда достаточно не сложная задача. Но если программировать на прямую, то придется прописывать код генерации случайного значения для каждого Label. Это получится из-за того, что цикл задать не получится. В цикле мы не сможем менять компонент, у которого необходимо менять значение.
Второй способ – это все же задать цикл, но в нем организовать отдельный блок, который по шагу цикла выбирает нужный компонент. Например, так:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
For i:=1 to 10 do Begin S:=Inttostr(random(100)); If i=1 then Label1.caption:=s; If i=2 then Label2.caption:=s; . . . . . . . . End; |
Но этот способ также не очень удобен. Для того, чтобы упростить код необходимо организовать поиск нужных компонентов на форме.
Для начал создадим форму с 10 компонентами Label и 1 компонентом Button. Для удобного поиска имена компонентов должны быть цикличны, то есть например в конце имени должна стоять цифра, дающая номер компонента. Иначе будет сложно перебирать компоненты. В нашем случае сохраним стандартные имена, так удобнее всего.
Вот наша форма:
Теперь создаем обработчик событий для кнопки. В обработчике описываем две переменные: i,s и MyCom. I, s – даем целочисленный тип, i будет служить для цикла, а s для случайного значения. MyCom будет иметь тип TComponent, в этой переменной мы будем хранить наши компоненты при переборе.
Теперь задаем цикл и первым действием в цикле будет:
1 |
MyCom:=Form1.FindComponent('Label'+Inttostr(i)); |
Мы переменной присваиваем значение функции FindComponent, которая ищет на форме Form1 компонент с именем ‘Label’+Inttostr(i). Такое имя означает, что при первом шаге цикла i=1 и имя будет Label1 и при последующих шагах будет меняться только цифра.
Следующая строка кода не обязательна, но желательна. Это проверка переменной MyCom. Бываут ситуации когда нужный компонент не найдет и что бы не создавать ошибок необходимо проверить пустая ли переменная:
1 2 3 |
if MyCom<>nil then - То есть если MyCom не пустая то выполняем следующие действия. s:=random(50); - задаем случайные значения. |
TLabel(MyCom).Caption:=IntToStr(s); -теперь компоненту TLabel даем конкретное значение MyCom и свойству Caption присваиваем случайно значение из переменной s.
Все! Теперь цикл перебирет 10 компонентов и если все эти компоненты не пустые и Label, то им присвоиться случайное значение. Полный код обработчика событий кнопки:
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 |
procedure TForm1.Button1Click(Sender: TObject); var MyCom:TComponent; i,s:integer; begin for i:=1 to 10 do begin MyCom:=Form1.FindComponent('Label'+Inttostr(i)); if MyCom<>nil then begin s:=random(50); TLabel(MyCom).Caption:=IntToStr(s); end; end; end; |
Этот код намного удобнее других вариантов, главное его достоинство – это отсутствие повторяющегося кода типа:
1 2 3 |
If i=1 then Label1.caption:=s; If i=2 then Label2.caption:=s; |
А вот окно рабочей программы:
Об авторе