В VCL получить список дочерних контролов у контрола можно с использованием цикла по массиву дочерних контролов TWinControl. Так как некоторые контролы сами могут быть контейнерами для контролов, то метод получения списка контролов на всех уровнях вложенности должен вызываться рекурсивно. В Delphi 12 эту задачу облегчили добавлением TControl Enumerator.
Сделаем процедуру, которая перебирает все дочерние контролы и добавляет их названия в Memo:
Сделаем процедуру, которая перебирает все дочерние контролы и добавляет их названия в Memo:
procedure TForm1.GetChildControls(AControl: TWinControl);
var
ctrl: TControl;
begin
for var i := 0 to AControl.ControlCount - 1 do
begin
ctrl := AControl.Controls[i];
Memo1.Lines.Add(ctrl.Parent.Name + ' - ' + ctrl.Name);
if ctrl is TWinControl then
GetChildControls(ctrl as TWinControl)
end;
end;
На Delphi 12 с использованием TControl Enumerator код будет значительно проще:
for ctrl in AControl.GetControls(AMyFilter) do Memo1.Lines.Add(ctrl.Parent.Name + ' - ' + ctrl.Name);где параметр AMyFilter – это фильтр контролов, который представляет собой комбинацию элементов типа TControlEnumeratorFilterType:
- ceftAll – все контролы, включая контролы дочерних контролов (рекурсивный обход);
- ceftEnabled – контрол должен иметь состояние "Enabled = True";
- ceftDisabled – контрол должен иметь состояние "Enabled = False";
- ceftVisible – контрол должен иметь состояние " Visible = True";
- ceftInvisible – контрол должен иметь состояние " Visible = False";
- ceftCustom – будет использоваться событие OnEnumerateControl.
procedure TForm1.GetChildControls(AControl: TWinControl);
begin
for var ctrl in AControl.GetControls([ceftAll]) do
Memo1.Lines.Add(ctrl.Parent.Name + ' - ' + ctrl.Name);
end;
Очевидно, что такой вариант проще.
Комментариев нет:
Отправить комментарий