如何获得容器控件上的所有可视子控件? 150分(150分)

X

XuQing

Unregistered / Unconfirmed
GUEST, unregistred user!
当前Form上有一个Panel,如何获取该Panel上的所有可视控件(TControl类型),并将所有子
控件的Name放到TStringList中?注意Panel上的控件中可能还有类似Panel的容器控件.
 
作一个函数用来获取一个容器控件上的所有控件(需要递归调用)
例如:
function GetAllControls(WinCtrl:TWincontrol;...其他参数):boolean;
var
i :integer;
begin
if WinCtrl.controlstyle<>[csAcceptsControls] then //判断是否是容器控件
begin
Result := false;
exit;
end
else
begin
for i:=0 to WinCtrl.ControlCount-1 do
begin
if WinCtrl.Controls.controlstyle=[csAcceptsControls] then
begin
GetAllControls(WinCtrl.Controls);//如果是容器控件,再调用函数本身
end
else
begin
。。。。
//如果不是容器控件,执行写入到TStringList中
end;
end;
end;
end;
//随手写的,没调试,逻辑应该没问题
 
procedure getname(panel:twincontrol;strlist:tstringlist);
var i:integer;
begin
for i:=0 to panel.controlcount-1 do
begin
strlist.add(panel.controls.name);
if panel.controls is twincontrol then
getname(twincontrol(panel.controls),strlist);
end;
end;
 
调试程序!
var strlist :tstringlist;
begin
strlist:=tstringlist.Create ;
getname(panel1,strlist );
memo2.Lines.Assign (strlist);
strlist.Free ;
end;
 
给钱!!!
 
是给分!
 
procedure FillComObjToInspector(ContainComp: TWinControl);
var
i: Integer;
begin
for i := 0 to ContainComp.ControlCount - 1 do
begin
cbInspector.Items.AddObject(ContainComp.Controls.Hint, ContainComp.Controls);
TControl(ContainComp.Controls).ShowHint := True;
//判断是否是容器控件
if (csAcceptsControls in ContainComp.Controls.ControlStyle) then
AddLargeTwoLevelComObj(TWinControl(ContainComp.Controls));
end;
if cbInspector.Items.Count > 0 then
cbInspector.ItemIndex := 0;
end;

procedure AddLargeTwoLevelComObj(ContainerCom: TWinControl);
var
i: Integer;
begin
for i := 0 to ContainerCom.ControlCount - 1 do
begin
cbInspector.Items.AddObject(ContainerCom.Controls.Hint, ContainerCom.Controls);
TControl(ContainerCom.Controls).ShowHint := True;
if (csAcceptsControls in ContainerCom.Controls.ControlStyle) then
AddLargeTwoLevelComObj(TWinControl(ContainerCom.Controls));
end;
end;

//测试通过
 
接受答案了.
 
顶部