So, hier mal meine Lösung, wobei mich mal eure Meinung interessieren würde:
Ich nehme die Properties Tag und TabOrder der Panel zu Hilfe, um die Position auf dem Hauptpanel zu ermitteln. Somit werden die Panel horizontal und vertikal richtig aufgeteilt.
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
var w,l,d,tl,wd,i,j, hgt:integer;
pnl: TPanel;
maxTag, maxTabOrder:integer;
aMaxTaborder:array of array of Integer;
begin
d:=24; //Abstand zwischen den Panels
l:=24; //Rand zum Panel5
maxTag:=-1;
for i := 0 to Panel5.ControlCount - 1 do
begin
if Panel5.Controls[i] is TPanel then begin
pnl := TPanel(Panel5.Controls[i]);
if maxTag<pnl.Tag then Begin
maxtag:=pnl.Tag;
setlength(aMaxTabOrder,maxTag+1,2);
aMaxTaborder[pnl.Tag,0]:=pnl.Tag;
aMaxTaborder[pnl.Tag,1]:=1;
end
else aMaxTaborder[pnl.Tag,1]:=aMaxTaborder[pnl.Tag,1]+1;
End;
end;
// Horizontale Ausrichtung *************************************
if maxTag>0 then Begin
wd:=trunc(((panel5.Width)-(2*l)-((maxtag)*d))/(maxTag+1));
for i := 0 to Panel5.ControlCount - 1 do
begin
if Panel5.Controls[i] is TPanel then begin
pnl := TPanel(Panel5.Controls[i]);
pnl.width := wd;
pnl.Left:= l+((wd+d)*pnl.Tag);
pnl.Top:=l;
pnl.Height:=panel5.Height-2*l;
end; //if
End;//for
end; //if maxTag
//***************************************************************
// Vertikale Ausrichtung*****************************************
maxTabOrder:=0;
For j:=0 to High(aMaxTabOrder) do
if aMaxTabOrder[j,1]>1 then Begin
hgt:=trunc(((panel5.height)-(2*l)-((aMaxTabOrder[j,1]-1)*d))/((aMaxTabOrder[j,1]-1)+1));
for i := 0 to Panel5.ControlCount - 1 do begin
if ((Panel5.Controls[i] is TPanel) and (Panel5.Controls[i].Tag=aMaxTabOrder[j,0])) then begin
pnl := TPanel(Panel5.Controls[i]);
pnl.height := hgt;
pnl.top:= l+((hgt+d)*pnl.TabOrder-1);
end; //if
End;//for
End;//if
//***************************************************************
end;
Wie sieht es dabei mit der Ressourcennutzung aus, oder anders ausgedrückt: Ist das russisch?