Announcement

Collapse
No announcement yet.

mehrere TFrames mit einer Basisklasse ??

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

  • mehrere TFrames mit einer Basisklasse ??

    Hallo !

    Ich habe ein Problem: Ich benötige mehrere unterschiedliche TFrames zum Einfügen in ein Formular um unterschiedliche Infos anzuzeigen. Weiterhin benötige ich aber teilweise gleiche Methoden für die Steuerung dieser TFrames - klar, eine Schnittstelle mit virtuellen Methoden muss her....
    Leider kann ich ja zu VCL-Komponenten nicht weitere Basisklassen hinzufügen, also brauche ich eine gemeinsame Basisklasse für alle TFrames, die eben diese Schnittstelle haben sollen. Wenn ich nun ein neues TFrame erzeuge (Basisframe) und die anderen davon ableite (anstatt von TFrame) dann geht es zunächst ! Ich kann mit dem Designer in den Frames herummalen, compilieren etc... Wenn ich aber deb BCB6 schließe und das Projekt neu öffne, kann ich immer noch compilieren und starten, ABER: wenn ich den Designer für die abgeleiteten TFrames aufrufe kommt die Fehlermeldung:

    Fehler beim Lesen von xxxxxxFrame->TabOrder:
    Eigenschaft TabOrder existiert nicht.

    Wenn ich dann "abbrechen" drücke, kann ich das Frame garnicht mehr designen (als wäre es kein Formular) aber ich kann immerhin compilieren und starten.... Wenn ich "ignorieren" drücke, wird die Eigenschaft "OldCreateOrder" auf TRUE gesetzt und das Frame lässt sich zwar designen, aber während der Laufzeit bricht die Anwendung mit einem Fehler in der Basisklasse ab.

    Also, normalerweise werde ich in C++ doch wohl in der Lage sein, Klassen abzuleiten, oder ist der Designer einfach nur zu dämlich, zu raffen, dass ich die Klasse abgeleitet habe ?? Wie könnte man das denn sonst machen ? Oder habe ich irgendwas vergessen ?

    Vielen Dank für Antworten und Grüß,

    André

  • #2
    Wir verwenden diese Technik in unserem Delphi5-Projekt, und es funktioniert bis auf einige harmlose "Problemchen" in der IDE gut. Aber frage mich jetzt nicht, wie wir unsere abgeleiteten Frames ursprünglich erzeugt haben. :-) Vermutlich so: Menüpunkt "Datei" -> "Neu" und dann auf den Reiter <Projektname>. Dort Doppelklick auf die Basisklasse und voila.
    <p>Dein Problem mit TabOrder klingt so, als hättest du die Ableitung nachträglich manuell im Quelltext vorgenommen - das geht manchmal schief. Wenn das der Fall war, schließe den betreffenden Frame doch in Delphi und öffne die *.dfm in einem externen Editor (notfalls Notepad).
    Die erste Zeile muss so<pre>
    inherited FrameAbgeleitet: TFrameAbgeleitet
    </pre>aussehen. Ändere sie ggfs. so ab und schau dir dann den Frame wieder in der IDE an.
    <p>HTH, Uli

    Comment


    • #3
      Hi !
      Also erstmal Danke für die Antwort !
      Ich verwende übrigens C++-Builder 6 und nicht Delphi.... das ist da zwar alles ziehmlich ähnlich, aber eben nicht ganz.

      Sicher - wenn ich ein neues Frame erzeugen will, kann ich dies von vorhandenen ableitet - das habe ich auch noch garnicht gesehen, werde ich also gleich mal austesten - danke !

      Ich habe selbst eine Basisklasse ohne Assistenten gemacht, diese von TFrame abgeleitet. Dann habe ich bei den beiden Frames, die per Assistent erzeugt wurden die Basisklasse entsprechend geändert, so geht es zumindest bis zum Neustart des C++-Builders auch. Kompilieren kann ich sowieso.
      Offenbar hat der Designer aber Probleme damit, weil die Frames dann nicht von TFrame abgeleitet sind und im die andere Basisklasse ja unbekannt ist. Wenn ich kurzzeitig im Header der Frames wieder TFrame schreibe gehts übrigens (designen kann ich, aber nicht kompilieren...;-)

      Ich werde Deine beschriebene Sache mal austesten - vielleicht kann man es auch über die DFM-Date machen - danke !

      Gruß, Andr&#233

      Comment


      • #4
        Hallo André,

        zwar etwas spät, dennoch möchte ich zu diesem Thema auch noch meine Erfahrungen berichten.

        Genau dasselbe Problem hatte ich auch. Offensichtlich kann C++Builder mit abgeleiteten Frames im Designer tatsächlich nicht so recht umgehen. Alles mögliche, C++Builder zu überlisten, war ohne zufriedenstellenden Erfolg. Compilieren und Ausführen OK, in derselben Sitzung designen OK, Nach Neustart nur Probleme.

        Ich habe mir dann wie folgt geholfen: Ich erzeuge die benötigten Frames ganz normal und versehe sie mit den benötigen Komponenten quasi als gemeinsame Obermenge. Diese Frames sind dann meine Basis-Frames, die ich weiterhin mit einem Schwarm von virtuellen Methoden ausgestattet habe. Unter Berücksichtigung der Ähnlichkeit erzeuge ich dann Ableitungen von diesen Basis-Frames, modifiziere in den Konstruktoren dieser Ableitungen, das Aussehen und Verhalten derselben, indem ich nicht benötigte Komponenten aus der Basis ausblende oder Komponenten aus der Basis nach Bedarf neu anordne und überschreibe bei Bedarf virtuelle Methoden aus der jeweiligen Basisklasse. Bei Bedarf erzeuge ich in den Ableitungen auch zusätzliche Komponenten oder komplett neue Menüs.

        Zur Laufzeit erzeuge ich dann nur noch Instanzen von den abgeleiteten Frame-Klassen ausschließich dynamisch.

        Ich weiß, dies ist nicht unbedingt der saubere, objektorientierte Lösungsansatz, aber C++Builder bietet mir keine andere Möglichkeit. Zumindest kann ich meine Frames global an der Basis zur Designzeit manipulieren und diese globalen Veränderungen werden zwangsläufig an meine Nachfahren vererbt.

        Viele Grüß

        Comment

        Working...
        X