Ich stelle mir das inetwa so vor
Code: Alles auswählen
AComponent.Deep:=8;
BComponent.Deep:=9;
Damit wäre A vor B, und nicht, wenn man sie nacheinander dynamisch erstellt B vor A
Code: Alles auswählen
AComponent.Deep:=8;
BComponent.Deep:=9;
Code: Alles auswählen
pn2D:=TMoveablePanel.Create(...
pn2D.OnSortPanel:=@DoApplyZOrder;
...
procedure TfmMain.DoApplyZOrder(Sender: TObject); //Sender=MoveablePanels.SortPanels
var aSizeOrder:array of TSizeOrder; //utypes (siehe unten)
begin
if not (gsLoading in Scrabble.GameState) then
begin
setlength(aSizeOrder,4);
try
with aSizeOrder[0] do begin Panel:=pn2D.Target; Size:=pn2D.Size; end;
with aSizeOrder[1] do begin Panel:=pn3D.Target; Size:=pn3D.Size; end;
with aSizeOrder[2] do begin Panel:=pnPieces.Target; Size:=pnPieces.Size; end;
with aSizeOrder[3] do begin Panel:=pnMessages.Target; Size:=pnMessages.Size; end;
SortWindowZOrder(aSizeOrder);//utypes
finally
Setlength(aSizeOrder,0);
end;
end;
end;
--------
type TSizeOrder=record
Size : integer;
Panel : TControl;
end;
function DoSort(Item1:Pointer;Item2: Pointer):Integer;
begin
if TSizeOrder(Item1^).Size=TSizeOrder(Item2^).Size then
Result:=0 else
if TSizeOrder(Item1^).Size>TSizeOrder(Item2^).Size then
Result:=-1 else
Result:=1;
end;
procedure SortWindowZOrder(aValue: array of TSizeOrder);
var SizeOrder : ^TSizeOrder;
i : integer;
begin
with TList.Create do
try
for i:=0 to length(aValue)-1 do
begin
New(SizeOrder);
SizeOrder^.Panel:=aValue[i].Panel;
SizeOrder^.Size:=aValue[i].Size;
Add(SizeOrder);
end;
Sort(@DoSort);
while Count>0 do
begin
SizeOrder:=Items[0];
SizeOrder^.Panel.BringToFront;
Dispose(SizeOrder);
Delete(0);
end;
finally
Free;
end;
end;