Objekt eines Formulars?!



  • Mal ne Frage...

    Wie kann ich es verwirklichen, dass ich ein Formular habe so zu sagen ein Muster... Dieses aber mit verschiedenen Parametern aufrufe?
    Also so in der Art wie ICQ das macht (MSG Fenster). Also praktisch dynamisches erstellen von Formularen.

    Oder kann ich gar einfach ein Objekt meines Forulars anlegen?? Das währe natürlich Ideal...

    Danke im vorraus! 😃



  • Hi
    gestalte ein Formular, Speicher es in ein extra dafür vorgesehenen Ordner und kicke mir rechter Maustaste auf das Formular. Wähle im Kontexmenue "Der Objektablage hinzufügen".
    Fülle das Formualr aus.

    Dann mach ein neues Projekt. Gehe dann auf Neu...

    und wähle die Registerseitem, auf du du das Vormular abgelegt hast. Wähle die Option "vererben". Schon hast du ein Formular auf Basis der Vorlage.
    (lese die Hilfe zum Thema Objektablage)

    Wenn du das Vormular nicht vererben (als Vorlage) verwenden willst, sonder direkt benutzen möchtest. So binde die Header des Formulars ein und erstelle mit new eine Instanz des Formulars. Zeige das Formualar an und zerstöre es später wieder. Parameter kannst du übergeben, in dem du Eigenschaften oder Methoden zur Verfügung stellst oder den Konstruktor überschreibst



  • Ab BCB5 bietet sich für sowas ggf. auch TFrame an.



  • Danke erst einmal...
    Also das mit dem TFrame.... ist das nicht dann so in der Art wie mIRC das aucht mach, also Formular in Formular?



  • Frames sind keine eigenständigen Fenster sondern "nur" Container für andere Komponenten, die man dann aber als "Gesamtkunstwerk" wiederverwenden kann.
    Auf eine Form gezogen ist vom Frame selbst nichts zu sehen, nur die auf dem Frame befindlichen Komponenten.



  • @AndreasW

    irgendwie bekomme ich das mit der neuen instanz nicht hin, Wenn ich versuche es so auf zu rufen:

    TfrmMsg *myTfrmMsg = new TfrmMsg(this);
    

    dann bekomme ich leider nur diese Fehler:

    Erzeugen
    [C++ Warnung] FormularCallU.cpp(20): W8004 'myTfrmMsg' wurde ein Wert zugewiesen, der nie verwendet wird
    [Linker Fehler] Unresolved external 'TfrmMsg::' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\TMP005\FORMULARCALLU.OBJ
    [Linker Fehler] Unresolved external '__fastcall TfrmMsg::TfrmMsg(Classes::TComponent *)' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\TMP005\FORMULARCALLU.OBJ

    könntest du das vieleicht näher beschreiben wie das ghen soll

    mfg LordPsycho 😋



  • hallo,

    includen alleine reicht nicht.
    Mit der Direktive:

    #include "frmMsg.h"

    wird nur die Header eingebunden. Dem Compiler reicht das aus, da er nicht überprüft, ob die Implementierung zu finden ist. Der Linker hingegen, der die Implementierung zum Projekt "hinzulinken" soll, weiss nicht, wo er die Implementierung finden kann.
    Deshalb muss man entweder:

    1. Die cpp dem Projekt hinzufügen oder
    2. Die *.obj- Datei einbinden. Beispiel:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h" // Header Einbinden
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    #pragma link "unit2.obj" // Implementierung einbinden 
              // pragma link beduetet: Hi Linker, linke gefälligst diese Datei zum Projekt, da hier notwendige implementierungen stehen
    
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    TForm2* F=new TForm2(this);
    }
    //---------------------------------------------------------------------------
    

    als 3. Möglichkeit käme infrage, das Formualr in eine Dll oder in ein Package zu packen und diese Dll/bpl (bpl ist letzendlich auch nur eine dll) hinzulinken. Ist aber prinzipiell das selbe vorgehen.



  • danke, so gehts.
    Habs mit den Dll's auch mal probiert das klapt aber nicht weil er das Formular zwar erstellt, aber beim zugriff darauf gibt es eine speicherzugriffsverletzung


Anmelden zum Antworten