Ich wollte generell mal nachfrfagen, ob es sowas iwe eine 3. Axe für componenten gibt, auf die ich dynamisch zugreifen kann.
Ich stelle mir das inetwa so vor
Weil ich so etwas in meinem Projekt verwende, kann ich Dir etwas Code posten. Ich habe verschiebbare und größenveränderliche Panels auf meinem Hauptformular (eine Art MDI-Anwendung, die auch unter Linux funktioniert) und da ist es nicht sinnvoll, wenn größere Panels kleinere überdecken. Deshalb löst das Panel ein Event (OnSortPanel) aus, wenn die Maustaste losgelassen resp. OnMouseUp) wird. Dieses Event verbinde ich dynamisch mit folgendem Code.
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;