Von TFrame ableiten
-
Hallo,
Ich wollte ein DocView-Syystem mit Hilfe einer Dokumentenklasse und einem TFrame als View aufbauen. Die View-Basisklasse ist hierzu von TFrame abgeleitet und der konkrete Frame sollte dann davon abgeleitet werden. Leider scheint dann aber die Anwendung nicht mehr zu funktionieren. Ich kann einen derartig abegleiteten Frame nicht mehr zur Designtime auf meinem Formular platzieren.
Ist das generell unmöglich oder kann man das irgendwie umgehen?
-
Hi,
Braunstein schrieb:
Ich kann einen derartig abegleiteten Frame nicht mehr zur Designtime auf meinem Formular platzieren.
Das muß ja dann eine registrierte Komponente sein, oder wie bist du vorgegangen.
Bei mir habe ich ein neues Frame erstellen lassen, hab es registriert und in ein neues Package getan.Läuft in Design u. Run.
Es gibt eigentlich keinen Haken.mfg
kpeter
-
Ich habe zuerst einen neuen Frame erstellt. Dann im Nachhinein die Basisklasse von TFrame auf eine von TFrame abgeleitete Klasse geändert.
-
Hmm,
wann wird die Instanz des neuen Frame gebildet?
Die dfm-Datei wird eingebunden?
Was spricht gegen eine Komponente?
-
Die Instanz des Frames sollte im Konstruktor gebildet werden. Ich mache es jedenfalls nicht selbst. Das wäre sicherlich auch möglich, ich wollte mir eigentlich die Anwendung vereinfachen.
Gegen eine Komponente spricht eigentlich nichts weiter bis auf die Tatsache, dass ich
1. ein wenig mit Frames experimentieren wollte und
2. mir die ganze Sache so einfach wie nur irgend möglich machen wollte.Wahrscheinlich werde ich aber letztendlich doch einen Satz Komponenten mit der ViewKlasse als Basisklasse erstellen. Mal schauen.
-
Datei|Neu...|C++Builder-Dateien|Frame, dann Datei|Neu...|Vererbbare Elemente|<FrameName>.
Allerdings kann es ganz ratsam sein, die abgeleiteten Frames dennoch zur Laufzeit zu instantiieren; meiner Erfahrung nach neigen die Formulardesigner der verschiedenen Units bei VFI dazu, einander zu blockieren.
-
Hi,
@Braunstein, es geht so wie du es möchtest.
Das Frame muss nicht zwingend zur Entwurfszeit auf dem Formular liegen.
Wenn man es wie ein Formular betrachtet( separate Unit und DFM-Datei) kann man es auch so bearbeiten.
Soll es zur Laufzeit dynamisch erzeugt werden, Projektoptionen so einstellen. Bei Instanziierung im Konstruktor
das übliche mit new, Parent...Der andere Weg ist das Ablegen der Frame-Kompo auf dem Formular, dann ist es aber kein ausgesprochener Container mehr.
mfg
kpeter
-
Ich wollte den Frame eben nicht erst zur Laufzeit erzeugen damit ich eine visuelle Kontrolle über die zu erstellenden Dialoge habe.
Ich habe das jetzt erstmal so gelöst, dass ich wieder direkt von TFrame abgeleitet habe und eine neue Dokumentenklasse erzeugt habe. Dort ist der View als Template definiert. Das ist nicht sehr schön und ich muss dort auf die reale Viewklasse casten aber es funktioniert erstmal.
@audacia
Das war genau mein Problem. Zuerst hat mit dem abgeleiteten Frame auch alles funktioniert. Nachdem ich den Builder dann geschlossen und wieder geöffnet hatt wurde er einfach nicht mehr vom Formulardesigner erkannt und somit auch die dfm-datei nicht mehr geladen.
-
Hi,
wenn deine Klassenableitung in separaten Units ist ( sagen wir frame.cpp/frame.h/frame.dfm),
müssen diese dem Projekt hinzugefügt werden (#include "frame.h") und unter Proj./Opt. frame.cpp.mfg
kpeter
-
Das ist bereits der Fall.