![]() |
Insert einer Komponente in einem TWinControl erkennen
Hallo zusammen,
ich würde gerne in meinem Panel erkennen, wenn sich ein Control darin ablegt. Also quasi wenn der Parent auf mein Panel gesetzt wird. Ich hab ein Panel, worin ein Button liegt. Dieser soll immer oben liegen. Ich finde leider keine Botschaft, die das melden könnte. Die Notification wird auch nur beim Erzeugen des Controls erzeigt. Ich möchte gerne, dass nachdem ein Control in mein Panel gelegt wurde, FButton.BringToFront aufrufen. Vielleicht gibts ja auch nen anderen Lösungsansatz. Danke Oliver |
Re: Insert einer Komponente in einem TWinControl erkennen
Delphi-Quellcode:
Schon mal hiermit probiert?
TOperation = (
opInsert, opRemove); procedure Notification(AComponent: TComponent; Operation: TOperation); virtual; |
Re: Insert einer Komponente in einem TWinControl erkennen
Jo, der wird nur beim Create des Controls ausgeführt, nicht, wenn ich den Parent setze...
Delphi-Quellcode:
Ich such aber ne Möglichkeit den Parent := ... zu erkennen und zwar im MyPanel.with TMyControl.Create(Self) do begin Parent := MyPanel; end; |
Re: Insert einer Komponente in einem TWinControl erkennen
Was du machen könntest ist, dir von dem jeweiligen Control eine ableitung schreiben und die SetParent funktion überschreiben. Und dort dann gucken ob der Parent dein Panel ist und wenn ja rufst du eine Funktion von dem Panel auf
//edit:
Delphi-Quellcode:
Oder die Message CM_CONTROLLISTCHANGE abfangen
procedure TWinControl.InsertControl(AControl: TControl);
var Item: TControlListItem; begin AControl.ValidateContainer(Self); Item.Control := AControl; Item.Parent := Self; {$IF DEFINED(CLR)} ControlListChanging(True, Item); if Item.Parent <> Self then Exit; ControlListChange(True, AControl); {$ELSE} Perform(CM_CONTROLLISTCHANGING, Integer(@Item), Integer(True)); if Item.Parent <> Self then Exit; Perform(CM_CONTROLLISTCHANGE, Integer(AControl), Integer(True)); {$IFEND} Insert(AControl); if not (csReading in AControl.ComponentState) then begin AControl.Perform(CM_PARENTCOLORCHANGED, 0, 0); AControl.Perform(CM_PARENTFONTCHANGED, 0, 0); AControl.Perform(CM_PARENTSHOWHINTCHANGED, 0, 0); AControl.Perform(CM_PARENTBIDIMODECHANGED, 0, 0); AControl.Perform(CM_PARENTDOUBLEBUFFEREDCHANGED, 0, 0); AControl.Perform(CM_PARENTTABLETOPTIONSCHANGED, 0, 0); if AControl is TWinControl then begin AControl.Perform(CM_PARENTCTL3DCHANGED, 0, 0); UpdateControlState; end else if HandleAllocated then AControl.Invalidate; AlignControl(AControl); end; {$IF DEFINED(CLR)} ControlChange(True, AControl); {$ELSE} Perform(CM_CONTROLCHANGE, Integer(AControl), Integer(True)); {$IFEND} end; |
Re: Insert einer Komponente in einem TWinControl erkennen
Das war auch meine einzige Idee bis jetzt. Es geht aber um jedes Control, die kann ich ja nicht alle ableiten ...
Ich sage ja, vielleicht gibts ja auch nen anderen Ansatz ... |
Re: Insert einer Komponente in einem TWinControl erkennen
Zitat:
Delphi-Quellcode:
Bringt aber nix. Ggf wird es aufgerufen, bevor mein Objekt nach vorne gelegt wird.
procedure TMyPanel.CMControlListChange(var Message: TCMControlListChange);
begin if Assigned(FButton) then begin FButton.BringToFront; end; end; Oder ist BringToFront falsch? |
Re: Insert einer Komponente in einem TWinControl erkennen
Wenn ich CM_CONTROLCHANGE abfange, dann gehts...
Vielen Dank für die Hilfe ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz