Announcement

Collapse
No announcement yet.

Komponentenentwicklung in Delphi 2007 win32

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Komponentenentwicklung in Delphi 2007 win32

    Hallo zusammen,

    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
    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
    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
    sondern:

    Code:
    FormMain
        TabSheet1
        PageControlExample1
           PageControl
    Meine Fragen sind nun:
    • 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".
    mfg und Danke
    A.Ebert
Working...
X