这个找到所有控件,也嵌套在框架等中,并通过列表指向它们。请注意之后释放列表。
Function AllControls(form : tForm) : tList<tControl>;
Procedure Add(Control : tControl );
var i : integer;
begin
if Control is TWinControl then
with TWinControl(Control) do
for i := 0 to Controlcount-1 do
Add(Controls[i]);
if Control <> form then
result.Add(Control);
end;
begin
result := tlist<tControl>.create;
add(form);
end;
var contrls : tlist<tcontrol>;
c : tcontrol;
begin
try
contrls := AllControls(form1);
for c in ctrls do Visit(c); // Do something
finally
contrls.free;
end;
end;
如果你想要一个通用版本,你可以要求一个特定的控件类型,你可以使用这个:
Procedure TForm1.Addcontrols( control : tcontrol; list : tlist<tcontrol>);
var i : integer;
begin
if control is twincontrol then
with twincontrol(control) do
for i := 0 to controlcount-1 do
addControl(controls[i], list);
list.Add(control)
end;
Function TForm1.GetControls<T>(f : tform) : tlist<T>;
var list : tlist<tcontrol>;
c : tcontrol;
begin
list := tlist<tcontrol>.Create;
addControls(f, list);
result := tlist<t>.create;
for c in list do
if c <> f then
if c is t then
result.Add(c);
list.free;
end;
procedure TForm1.FormCreate(Sender: TObject);
VAR List : TList<TRadioButton>;
begin
List := GetControls<TRadioButton>(self);
end;
end.
采用
List := GetControls<TControl>(self);
获得所有控制..