При разработке приложений на Delphi нередко возникает необходимость создать несколько элементов управления, таких как кнопки, в Runtime. Вопрос, который часто задают разработчики, заключается в том, как можно изменить свойства созданных элементов, если для их создания использовалась всего одна переменная. В данной статье мы рассмотрим, как изменить свойство Caption первой кнопки, созданной в Runtime, без использования массивов или списков.
Проблема
Рассмотрим следующий код, который создает четыре кнопки на форме в Runtime:
procedure TfrmTest.CreateFourButtons(Sender: TObject);
var
i: Integer;
B: TButton;
begin
for i := 1 to 4 do
begin
B := TButton.Create(frmTest);
B.Parent := frmTest;
B.SetBounds(250, (70 + (30 * i)), 75, 25);
B.Caption := 'Button' + IntToStr(i);
B.Visible := True;
end;
end;
После создания кнопок возникает вопрос: как изменить Caption первой кнопки, если мы использовали только одну переменную B для их создания?
Решение
Форма в Delphi сама по себе является контейнером для управления, и она поддерживает список дочерних элементов. Это означает, что если мы поместим кнопки непосредственно на форму, то форма будет отслеживать их. Таким образом, мы можем перебрать дочерние элементы формы и найти нужную кнопку.
for var C in frmTest.Controls do begin // 10.3 синтаксис
if (C is TButton) and (C.Caption = 'Button1') then begin
C.Caption := 'HotPotato';
break; // Выходим из цикла, так как нашли нужную кнопку
end;
end;
Также можно использовать свойство Tag для каждой кнопки, чтобы уникально идентифицировать их:
for i := 1 to 4 do begin
B := TButton.Create(frmTest);
B.Parent := frmTest;
B.Tag := i; // Устанавливаем уникальный идентификатор
// ...
end;
// Изменение Caption первой кнопки
for var C in frmTest.Controls do begin
if (C is TButton) and (C.Tag = 1) then begin
C.Caption := 'HotPotato';
end;
end;
Альтернативные способы
Если кнопки помещены в дочерние контейнеры, такие как TPanel, то перебор дочерних элементов формы не даст результата. В таком случае, использование массива или списка для хранения ссылок на кнопки может быть более предпочтительным.
Также можно использовать метод FindChildControl для поиска элемента управления по имени, если у него установлено уникальное имя. Однако, стоит помнить, что FindChildControl находит только непосредственных детей элемента.
Заключение
Хотя использование массивов или списков является стандартным подходом для хранения ссылок на элементы управления, созданные в Runtime, в некоторых случаях можно обойтись без них, используя свойства формы и элементы управления, такие как свойство Tag. Важно помнить, что без ссылки на элемент управления, будь то в массиве, списке или отдельной переменной, напрямую обратиться к нему не получится. Но если элементы управления расположены непосредственно на форме, то форма сама будет отслеживать их, и можно использовать перебор дочерних элементов для их поиска и изменения свойств.
Вопрос заключается в том, как изменить свойство `Caption` первой кнопки, созданной в Runtime в среде Delphi, без использования массивов и списков.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS