在 Delphi 中動態檢查、操作視窗上的所有控件(包含巢狀容器內的子控件)是常見需求。本文提供一個通用遞歸函數 GetCtrls,能完整遍歷任意 TWinControl 及其子孫控件,並輸出控件名稱列表。
function GetCtrls(Control: TWinControl; List: TStringList): Boolean;
var
I: Integer;
Child: TWinControl;
begin
Result := False;
if Control = nil then Exit;
for I := 0 to Control.ControlCount - 1 do
begin
Child := TWinControl(Control.Controls[I]);
List.Add(Child.Name); { 記錄控件名稱 }
{ 若為容器控件,遞歸遍歷其子控件 }
if Child.ControlCount > 0 then
GetCtrls(Child, List);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
begin
List := TStringList.Create;
try
GetCtrls(Self, List); { Self = 當前表單 }
ShowMessage(List.Text); { 顯示所有控件名稱,含巢狀子控件 }
finally
List.Free;
end;
end;
ControlCount = 0 時不再遞歸,天然結束。Controls[I] 返回 TControl,轉為 TWinControl 才能存取 ControlCount/Controls。若確定只有 TWinControl 子類可直接轉型;嚴謹代碼可加 if Controls[I] is TWinControl then 守衛。TStringList,函數僅負責填充。Controls[0] 為最底層)。function GetCtrlsOfType(Control: TWinControl; List: TStringList; TargetClass: TClass): Boolean;
var
I: Integer;
Child: TControl;
begin
Result := False;
if Control = nil then Exit;
for I := 0 to Control.ControlCount - 1 do
begin
Child := Control.Controls[I];
if Child.InheritsFrom(TargetClass) then
List.Add(Child.Name);
if Child is TWinControl then
GetCtrlsOfType(TWinControl(Child), List, TargetClass);
end;
Result := True;
end;
// 使用:僅收集所有 TEdit
var Edits: TStringList;
GetCtrlsOfType(Self, Edits, TEdit);
TEdit/TComboBox 檢查必填項。Caption/Text 屬性的控件載入翻譯。TabOrder 等問題。這個簡單的遞歸函數是 Delphi 視窗元編程的基礎工具,掌握後可輕鬆實現各種批量控件操作需求。