Non sono sicuro di aver capito la domanda, comunque:
var Idx:Integer;
begin
with Form1 do begin
for Idx:=0 to ControlCount - 1 do begin
Memo1.Lines.Add(Controls[Idx].Name);
Memo1.Lines.Add(IntToStr(Controls[Idx].Top));
Memo1.Lines.Add(IntToStr(Controls[Idx].Left));
Memo1.Lines.Add('');
end;
end;
end;
Ciao, Mario
Semplicemente all'interno del ciclo metti il codice per controllare se il componente corrente sia un TPanel. Una volta trovato, bisognerà solamente riutilizzare il codice usato per il form.
Questo è un esempio veloce. :)
procedure TForm1.ListFormControls;
procedure CheckControls(Comp: TCustomControl);
var
idx: integer;
begin
for Idx:=0 to Comp.ControlCount - 1 do
begin
Memo1.Lines.Add(Format('%s - top%s left%s',[Comp.Controls[Idx].Name,
IntToStr(Comp.Controls[Idx].Top),
IntToStr(Comp.Controls[Idx].Left)]));
if Comp.Controls[idx] is TPanel then
CheckControls(TPanel(Comp.Controls[idx]));
end;
end;
begin
CheckControls(Self);
end;
procedure CheckControls(Comp: TCustomControl);
var
idx: integer;
begin
for Idx:=0 to Comp.ControlCount - 1 do
begin
Memo1.Lines.Add(Format('%s - top%s left%s',[Comp.Controls[Idx].Name,
IntToStr(Comp.Controls[Idx].Top),
IntToStr(Comp.Controls[Idx].Left)]));
if Comp.Controls[idx] is TPanel then
CheckControls(TPanel(Comp.Controls[idx]));
end;
end;
xinyiman ... ti hanno postato questo codice ... è questo che non funziona?
Edit:
Letto così mi sembra corretto... e non controlla 2 volte il nodo.
procedure lista(comp: TComponent);
var
i: integer;
begin
for i := 0 to comp.ComponentCount - 1 do
begin
Memo1.Lines.Add(comp.Components[i].Name);
lista(comp.Components[i]);
end;
end;
Ti conviene mettere il codice utilizzando il tag (code), altrimenti perdi i vari [ i ] quando crei il post sul forum. :)