Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Insert einer Komponente in einem TWinControl erkennen (https://www.delphipraxis.net/150993-insert-einer-komponente-einem-twincontrol-erkennen.html)

backdraft 2. Mai 2010 17:55


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

daywalker9 2. Mai 2010 18:06

Re: Insert einer Komponente in einem TWinControl erkennen
 
Delphi-Quellcode:
TOperation = (
   opInsert,
   opRemove);

    procedure Notification(AComponent: TComponent;
      Operation: TOperation); virtual;
Schon mal hiermit probiert?

backdraft 2. Mai 2010 18:08

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:
   
with TMyControl.Create(Self) do
  begin
    Parent := MyPanel;
  end;
Ich such aber ne Möglichkeit den Parent := ... zu erkennen und zwar im MyPanel.

daywalker9 2. Mai 2010 18:20

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:
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;
Oder die Message CM_CONTROLLISTCHANGE abfangen

backdraft 2. Mai 2010 18:24

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 ...

backdraft 2. Mai 2010 18:29

Re: Insert einer Komponente in einem TWinControl erkennen
 
Zitat:

Zitat von daywalker9
Oder die Message CM_CONTROLLISTCHANGE abfangen

hmmm, also das wird ausgelöst.

Delphi-Quellcode:
procedure TMyPanel.CMControlListChange(var Message: TCMControlListChange);
begin
  if Assigned(FButton) then
    begin
      FButton.BringToFront;
    end;
end;
Bringt aber nix. Ggf wird es aufgerufen, bevor mein Objekt nach vorne gelegt wird.
Oder ist BringToFront falsch?

backdraft 2. Mai 2010 18:35

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 04:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz