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 Komponente verschiebt sich zur Laufzeit (https://www.delphipraxis.net/172510-komponente-verschiebt-sich-zur-laufzeit.html)

Neutral General 8. Jan 2013 11:21

Komponente verschiebt sich zur Laufzeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Im Anhang ist mal ein Bild von einem Formular mit einer eigenen Komponente auf einem Panel (Panel ist mit Color=clCream hervorgehoben).

Zur Laufzeit verschiebt sich die Komponente allerdings, bzw. sie scheint den Parent zu ändern (vom Panel auf die Form).
Die Top und Left-Werte bleiben nämlich erhalten. Interessanterweise bleibt auch das Parent erhalten.
Im constructor habe ich als Parent für die eingebetteten Controls entweder Self, oder eines der eingebetteten Controls genommen.

Hat jemand eine Idee was da passiert?

Ich könnte etwas Quelltext liefern aber das ist nur ein Constructor in dem jede Menge Controls erzeugt werden.

Bummi 8. Jan 2013 11:48

AW: Komponente verschiebt sich zur Laufzeit
 
Nur ein Verdacht, im Konstruktor Code in der Art

Parent := TWinControl(Owner );

Neutral General 8. Jan 2013 11:58

AW: Komponente verschiebt sich zur Laufzeit
 
Nein das Parent wird im constructor nicht gesetzt.
Hab mal debuggt und das Parent wird auch nach dem constructor nochmal beim Lesen aus der DFM auf das Panel1 gesetzt.

Wenn ich im Nachhinein (per Button) das Parent auf das Panel ändere, dann siehts wieder richtig aus.

Delphi-Quellcode:
constructor THTMLEditor.Create(AOwner: TComponent);

  function CreateToolPanel(AParent: TWinControl; AWidth: Integer): TPanel;
  begin
    Result := TPanel.Create(Self);
    Result.Parent := AParent;
    Result.Align := alLeft;
    Result.Left := MaxInt;
    Result.Width := AWidth;
    Result.BevelOuter := bvNone;
    Result.Caption := '';
    Result.BevelKind := bkFlat;
    Result.BevelEdges := [beRight];
  end;

begin
  inherited Create(AOwner);

  DoubleBuffered := true;

  FImageOptions := THTMLImageOptions.Create(Self); // = class(TPersistent)

  FToolbarVisible := true;
  FToolbarControls := ToolbarAllControls;

  Width := 300;
  Height := 200;

  // ... Panels und Controls werden erstellt. (Panels per CreateToolPanel)
  // Parent wird nirgendwo auf AOwner gesetzt, maximal auf Self.
end;

Uwe Raabe 8. Jan 2013 12:23

AW: Komponente verschiebt sich zur Laufzeit
 
Wenn deine Komponente eigene Unter-Komponenten erstellt und auch wieder freigibt, dann solltest du diese per SetSubComponent(true) auch als solche kennzeichnen. Andernfalls kommt eventuell das Streaming aus der DFM durcheinander.

Man kann sich das in der VCL bei dem TLabeledEdit ansehen.

stahli 8. Jan 2013 13:12

AW: Komponente verschiebt sich zur Laufzeit
 
@Uwe
Wenn die SubControls alle auf Self oder anderen SubControls platziert werden glaube ich das eher nicht. Die Eigenschaften der SubControls werden ohne SetSubComponent nicht in der dfm gespeichert. Aber das ist ja vorliegend scheinbar auch nicht notwendig.

Es wäre sicher mal sinnvoll, den Contructor zu debugen und genau zu schauen, was da wirklich passiert. Ist die Komponente auch in der aktuellen Version in der IDE installiert?
Es könnte sein, dass eine alte (funktionsfähige) Version installiert ist und zur Designtime erstellt wird und zur Laufzeit wird eine fehlerhafte Version (mit falschen Parents) erzeugt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 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