Hallo zusammen,
ich möchte zusammengesetzte Komponenten entwickeln, um so bestimmte wiederkehrende Funktionalitäten zu kapseln.
Da ein als Komponente registriertes TFrame-Derivat eine *.dfm enthält, kommt es zu Problemen beim Streaming mit dem Schreibe- und Lesevorgang in Clientformularen.
Beispiel ( TPageControlExample = class(TBasisFrame) ):
Das von mir verwendete Streamingverfahren nutzt die Überschreibung von TComponent.GetChildren, in der alle Subkomponenten der komponierten Komponente traversiert und gestreamt werden.
Das Ergebnis für TPageControlExample sieht so aus:
Das Problem ist nun, dass bei der Deserialisierung die Instanz PageControl: TPageControl zweifach angelegt wird,
einmal aus der Komponenten- *.dfm und aus der Formular-*.dfm.
Ändert man über einen Texteditor die Formular-*.dfm (analog zu als Templates verwendeten Frames) in
funktioniert zwar das Lesen aus der *.dfm, ohne das mehrfache Erzeugen der PageControl: TPageControl, allerdings ist die Reihenfolge der Komponenten in der Strukturansicht nicht korrekterweise:
sondern:
Meine Fragen sind nun:
mfg und Danke
A.Ebert
ich möchte zusammengesetzte Komponenten entwickeln, um so bestimmte wiederkehrende Funktionalitäten zu kapseln.
- Dazu verwende ich eine von TFrame abgeleitete Basisklasse, um so
- Grundlegende Funktionalität zu kapseln
- abgeleitete Komponenten visuell gestalten zu können
- zur Entwurfszeit in den konsumierenden Client-Formularen über den Strukturbaum Zugriff auf die einzelnen Subkomponenten zu erhalten, damit z.B. die Entwurfsassistenten komplexerer Komponenten verfügbar sind (Bsp. PageControl).
Da ein als Komponente registriertes TFrame-Derivat eine *.dfm enthält, kommt es zu Problemen beim Streaming mit dem Schreibe- und Lesevorgang in Clientformularen.
Beispiel ( TPageControlExample = class(TBasisFrame) ):
- Die Komponente enthält ein TPageControl
- Auf einem Clientformular wird diese Komponente verwendet und es werden eine/mehrere Pages hinzugefügt.
Das von mir verwendete Streamingverfahren nutzt die Überschreibung von TComponent.GetChildren, in der alle Subkomponenten der komponierten Komponente traversiert und gestreamt werden.
Das Ergebnis für TPageControlExample sieht so aus:
Code:
object FormMain: TFormMain ... object PageControlExample1: TPageControlExample ... object PageControl: TPageControl ... object TabSheet1: TabSheet ... end end end end
einmal aus der Komponenten- *.dfm und aus der Formular-*.dfm.
Ändert man über einen Texteditor die Formular-*.dfm (analog zu als Templates verwendeten Frames) in
Code:
object FormMain: TFormMain ... inline PageControlExample1: TPageControlExample // <<---- ... inherited PageControl: TPageControl // <<---- ... object TabSheet1: TabSheet ... end end end end
funktioniert zwar das Lesen aus der *.dfm, ohne das mehrfache Erzeugen der PageControl: TPageControl, allerdings ist die Reihenfolge der Komponenten in der Strukturansicht nicht korrekterweise:
Code:
FormMain PageControlExample1 PageControl TabSheet1
Code:
FormMain TabSheet1 PageControlExample1 PageControl
- Bin ich mit der Frame-Lösung auf dem falschen Weg? Wenn ja,
- wie erhält man in nicht-Frame-Komponenten zur Entwurfszeit Zugriff auf die Subkomponenten, um so z.B. einem PageControl weitere Seiten hinzufügen zu können?
- wie kann dann das Streaming implementiert werden?
- Wenn die Frame-Lösung gangbar ist,
- wie erreiche ich, dass der Komponentenbaum in der Strukturansicht korrekt dargestellt wird?
- wie erreicht man, dass beim Streaming die Subkomponenten entweder nur bei Änderungen/Erweiterungen (PageControl + nachträglich hinzugefügter Seite) geschrieben werden, in jedem Fall jedoch mit der Deklaration "inherited" versehen werden, um ihre redundante Erzeugung zu verhindern?
- Die Deklaration "inline" konnte ich beim Schreiben an geeigneter Stelle bereits "erzwingen".
A.Ebert