Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Eigene Komponente mit TPanel erzeugt ChildControls nicht (https://www.delphipraxis.net/134646-eigene-komponente-mit-tpanel-erzeugt-childcontrols-nicht.html)

mischerr 26. Mai 2009 10:19


Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Hallo.

Ich versuche gerade eine Komponente zu schreiben, die ein TPanel als "ChildPanel" im Clientbereich besitzt in dem durch den Designer weitere Komponenten plaziert werden sollen.

Kurzum habe ich mir dazu eine neue Komponente von TCustomPanel abgeleitet, welche ein TPanel beinhaltet (protected, freigegeben über eine published property). Das ChildPanel wird im Konstruktor der Komponente erzeugt. Soweit so gut. Das Erzeugen von Komponenten zu Laufzeit und einfügen in dieses "ChildPanel" durch setzen des Parents funktioniert.

Im Designer kann ich auch zB TButtons in dieses "ChildPanel" einfügen, aber diese stehen, wie auch mein "ChildPanel", nicht im DFM-File, sodass diese zur Laufzeit nicht erzeugt werden bzw. beim Wechsel Form->Formtextansicht->Form "gefressen" werden.

Ich sehe im Moment nicht den Unterschied, wieso ich zur Designzeit ein TPanel im TPanel platzieren kann und darin bel. Komponenten aber es bei mir nicht funktioniert. Muss ich dem Designer irgendwie sagen, dass er dieses interne ChildPanel mit seinen ChildKomponenten "serialisiert"?

:gruebel:

Hat jemand einen Tip?

Michael


[Edit:]
Habe es im Moment über einen WorkAround gelöst (wahrscheinlich ähnlich wie es die TPageControl beim Erzeugen der TabSheets macht) und erzeuge im Konstuktor der Komponente das Panel welches ich über AOwner/GetParentForm/Form.Designer.Modified ins zugehörigen Formular bringe.

Pro_RJ 28. Mai 2009 11:50

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Hi,
Ich hatte auch schon hier das gleiche Problem und bin auch auf keine Lösung gekommen.
Ich habe es auch über eine extra Procedure gemacht. zwar nicht schön aber funktioniert.
mfg Jens

mischerr 28. Mai 2009 16:43

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Also ich weiß nicht wie das mit dem "AcceptControls" in deinem Thread ausschaut. Aber ich leite die "Containerkomponente" ja von TCustomPanel ab und dieses sollte das bereits gesetzt haben. In Deinem Fall denke ich, ist das setzen des Wertes im Konstruktor nach dem inherited evtl. etwas spät - vielleicht in CreateParams?

Anyway, ich hab's im Konstruktor meiner Kompo nun so gemacht (Achtung Pseudocode aus dem Kopf - hab's gerade nicht hier greifbar):

Delphi-Quellcode:
type TSlidePanel = class(TCustomPanel)
  private
    FChild: TPanel;
 ...
  published
    property ControlPanel: TPanel read FChild write SetChild;
end;                  

procedure TSlidePanel.Create(AOwner: TComponent); // override !
var f: TCustomForm;
begin
  inherited Create(AOwner);
 ...
  if (csDesigning in ComponentState) and not assigned(FChild) then begin
    f:= nil;
    if assigned(AOwner) then begin
      if AOwner.inheritsFrom(TCustomForm) then
        f:= TCustomForm(AOwner)
      else
        f:= GetParentForm(AOwner);
    end else
      f:= GetParentForm(Self);
    if assigned(f) then begin
      FChild:= TPanel.Create(f);
      FChild.Parent:= Self;
      ...
      if f.Designer<>nil then
        f.Designer.Modified;
    end;
  end;
 ...
end;
...wobei FChild über eine public published property zugänglich ist.

So geht's eigentlich ganz gut. TPageControl scheint das Hinzufügen von TTabSheets auch ähnlich zu handhaben. Beim Hinzufügen im Designer der IDE wird autom. das ChildPanel als Objekt des besitzenden Forms erzeugt und steht mit allen hinzugefügten Objekten auch im DFM.


Michael

oki 28. Mai 2009 19:06

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Sorry, aber ich versteh nicht ganz, warum du ein Panel in einer eigenen Panelkomponente haben willst. Desweiteren wird das mit deiner Owner-Zuweisung mächtig in die Hose gehen. Entweder ich hab jetzt was übersehen, aber teste mal folgendes:

1. auf ein Form dein Panel legen
2. Unit speichern und schließen
3. Unit öffnen
4. Unit speichern und schließen
5. dfm mit einem Editor ansehen und nachschauen, wie oft dein ChildPanel enthalten ist.

Gruß oki

mischerr 28. Mai 2009 20:00

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Geht nicht in die Hose! Funktioniert natürlich! ;-)


Wenn das Control auf dem Form im Designed plaziert wird, sind ist csDesigning wahr und es wird ein weiteres Panel-Objekt im Form erzeugt und meinem "ParentPanel" zugewiesen. Zur Laufzeit ist csDesigning nicht wahr und das (durch das Form) erzeugte "ChildPanel" wird über das property wieder dem "ParentPanel" zugewiesen. Natürlich ist für das Property ein passender Setter zu schreiben.

oki 28. Mai 2009 20:02

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Du weist was ich meine?

mischerr 28. Mai 2009 20:07

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Ich weiss was du meinst - ich hatte dieses Problem selbst. Daher der "Work-A-Round" (siehe mein oberes Edit).

Schau doch mal auf das TPageControl RKlick und füge eine neue Seite ein. Und wie durch Zauberhand gibts nun im Form ein TTabSheet und ActivePage des PageControl verweist drauf. Ich denke das ist ähnlich. Nur hatte ich nicht die Notwendigkeit mein "Child" so zu kapseln und abzublocken wie das Tabsheet. Ich verwende die Kompo nur selbst.

oki 28. Mai 2009 20:15

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Normalerweise tritt ja das Problem auf, dass das neue Objekt beim Speichern in die dfm gestreamt wird. Lädt man das Form neu, so wird die gestreamte Componente geladen und dann noch einmal durch den Constructor erstellt. Somit ist sie doppelt da. Bei jedem neuen Speichern und laden immer einmal mehr.
Wird das Objekt über einen Designeditor erstellt, dann passiert das natürlich nicht.

Wo und wie das bei dir unterbunden wird kann ich aber nicht erkennen. Vielleicht kannst du mir da mal auf die Sprünge helfen.

Gruß oki

mischerr 28. Mai 2009 20:21

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Ich seh gerade, dass im obigen Code noch eine Prüfung fehlt (kommt davon wenn man's aus dem Kopf ohne IDE versucht wieder herzuleiten...) ob FChild bereits assigned ist. Falls nicht wird nicht mehr neu erzeugt. Durch die Prüfung auf assigned und csDesigning wird das Child nur beim Hinzufügen im Designer erstellt, dem Property zugewiesen und zur Laufzeit übers DFM erzeugt und dem Property zugewiesen.

Ich ergänz es mal oben...

oki 28. Mai 2009 20:25

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht
 
Joop, damit hört sich das schon anders an. :-D

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Seite 1 von 2  1 2      

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