Zeiger einer Form mit dem Konstruktor übergenen und dann zur Laufzeit erzeugen



  • Hallo,

    ich erzeuge zur Laufzeit Form2 und übergebe einen Zeiger auf Form3

    Form2 = new TForm2(Form3);
    

    Nun möchte ich anhand des übergebenen Zeigers Form3 erstellen.

    TForm* window;
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TForm* form)
    	: TForm(Owner)
    {
    	window = form;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    	window = new TForm(NULL);
    }
    

    Es kommt nun die Fehlermeldung "Mehrdeutigkeit zwischen Forms::TForm::TForm::(Classes::TComponent*) und Forms::TForm::TForm(void*)



  • Hallo

    du kannst den Konstruktor von TForm2 nicht so verändern! Der bestehende parameter hat schießlich eine Bedeutung.
    Das sollte funktionieren (zusätzlich must du die Deklararion von TForm2 im Header entsprechend ändern) :

    __fastcall TForm2::TForm2(TComponent* Owner, TForm* form)
        : TForm(Owner)
    {
        window = form;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
        window = new TForm(NULL);
    }
    
    Form2 = new TForm2(NULL, Form3);
    

    allerdings verstehe ich ButtonClick nicht.
    window ist doch bereits zugewiesen, warum wird dann noch einmal ein neue Zuordnung ohne Zusammenhang gemacht? Zumal du eine Instanz von TForm erzeugst. Normalerweise erzeugt man Instanzen von TForm abgeleiteten Klassen, wie dem Standardtyp TForm1.

    bis bald
    akari



  • In meiner Hauptform Form1 erzeuge ich eine Instanz Form2 der Klasse TForm2 zur Laufzeit mit dem ButtonClick, ich möchte dabei den Zeiger der Klasse TForm3
    *Form3 über den Konstruktor an Form2 übergeben.
    Das Formular Form2 erscheint.

    //Form1
    #include "Unit1.h"
    #include "Unit2.h"
    #include "Unit3.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	Form2 = new TForm2(NULL,Form3);   //Instanz der Klasse TForm2 erzeugen
    }
    //---------------------------------------------------------------------------
    

    Nun möchte ich in Form2 über den übergebenen Zeiger Form3 mit dem ButtonClick eine Instanz der Klasse TForm3 erzeugen, analog zum erzeugen des Objekts Form2 der Klasse TForm2.

    //Form2
    #include "Unit2.h"
    #include "Unit3.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm* window;
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner,TForm* form)
    	: TForm(Owner)
    {
    	window = form;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    	window = new TForm(NULL); //Instanz der Klasse TForm3 erzeugen    
    }
    //---------------------------------------------------------------------------
    

    Ich glaube allerdings irgendetwas passt da nicht.

    Ich möchte eigentlich folgendes machen.
    Über einen Menupunkt wähle ich eine Aktion aus, welche das öffnen eines
    bestimmten Formulars zur Folge hat.
    In das Formular gelangt man allerdings nur durch Eingabe eines Passwords
    ->Form2, ist das Password korrekt wird über den Zeiger das gewünschte Formular
    ->Form3 zur laufzeit erstellt.



  • Hallo

    Ich glaube allerdings irgendetwas passt da nicht.

    Das ist keine ausreichende Fehlerbeschreibung!

    Hast du die Konstruktordeklaration von Form2 im Headerdatei angepaßt?

    und hier hast du einen Schreibfehler drin :

    window = new TForm(NULL); //Instanz der Klasse TForm3 erzeugen
    

    bis bald
    akari



  • Hast du die Konstruktordeklaration von Form2 im Headerdatei angepaßt?

    Habe ich

    class TForm2 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	TButton *Button1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    
    public:		// Anwender-Deklarationen
    	__fastcall TForm2(TComponent* Owner,TForm* form);
    };
    

    und hier hast du einen Schreibfehler drin :
    C/C++ Code:
    window = new TForm(NULL); //Instanz der Klasse TForm3 erzeugen
    C/C++ Code:

    Das meine ich mit "Ich glaube allerdings irgendetwas passt da nicht".



  • Wenn du in Form2 eine Instanz von TForm3 erstellen willst, mußt du doch nichts im Konstruktor übergeben. Es reicht hier den Header von TForm3 bei der cpp von TForm2 einzubinden.



  • Ich möchte aber nicht nur Form3 sonder auch Form4 oder Form5 oder Form6 ....
    in Form2 erstellen.
    Deshalb möchte ich den Object Pointer einer Form über den Konstruktor übergeben.
    Oder anders:
    ich habe eine Klasse abc.
    Ich erstelle zwei Objekte der Klasse abc, x und y in Form1.
    Ich erstelle zur Laufzeit Form2 und übergebe im Konstruktor den Datentyp abc*.
    Nun kann ich Form2 entweder auf das Objekt x oder y der Klasse abc zugreifen.



  • Ich möchte aber nicht nur Form3 sonder auch Form4 oder Form5 oder Form6 ....
    in Form2 erstellen.

    Wo ist jetzt das Problem?

    Deshalb möchte ich den Object Pointer einer Form über den Konstruktor übergeben.

    Dann mußt du aber trotzdem die entsprechenden Header einbinden.

    Ich erstelle zur Laufzeit Form2 und übergebe im Konstruktor den Datentyp abc*.
    Nun kann ich Form2 entweder auf das Objekt x oder y der Klasse abc zugreifen.

    Warum kann Form2 die Instanzen der Klasse abc nicht selber erstellen?
    Außerdem übergibst du damit keinen Datentyp (was immer das sein mag) sondern nur einen Pointer. Bekannt machen, (Header includiern) mußt du den Typ trotzdem.


Anmelden zum Antworten