AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigene Komponente mit TPanel erzeugt ChildControls nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente mit TPanel erzeugt ChildControls nicht

Ein Thema von mischerr · begonnen am 26. Mai 2009 · letzter Beitrag vom 28. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#1

Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 26. Mai 2009, 11:19
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"?



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.
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#2

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 12:50
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
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#3

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 17:43
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 20:06
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
42
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#5

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 21:00
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.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 21:02
Du weist was ich meine?
42
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#7

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 21:07
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.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 21:15
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
42
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#9

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 21:21
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...
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Eigene Komponente mit TPanel erzeugt ChildControls nicht

  Alt 28. Mai 2009, 21:25
Joop, damit hört sich das schon anders an.

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 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