weitere Form anzeigen ?



  • Tach,

    habe ein kleines Problem, ich möchte bei Programmstart eine weitere Form2 öffnen, aber leider kommt da dann immer eine Exception, mit der Meldung lesen bei Adresse 0x00000000 aufgetreten.

    Da mein Programm auch Parameter beim Start verarbeiten soll und ich bei bestimmten Paramtern eine Form2 anzeigen lassen will komme ich nun in Schwierigkeiten da das Öffnen der Form2 nicht funktioniert.

    so siehts im test aus, das funktioniert aber nicht (die Form2 ist aber vorhanden)

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
          Form2->ShowModal();
    }
    


  • Deine Form2 musst Du auch mit CreateForm erzeugen.

    Du kannst in der IDE einstellen welche Deiner formen automatisch erzeugt werden sollen.
    Wenn das Createform für Form2 in der main fehlt dann zeigt form2 auf 0x00000000. Das sagt Dir auch dei Runtime 😃



  • Warum so umständlich mit CreateForm arbeiten, wenn ein new es genau so tut,
    bzw. mehr c++ konform ist.



  • Weil seine Form1 sicher auch mit CreateForm erzeugt wurde. Und warum Ihn dann mit dem new noch mehr verwirren.

    Außerdem macht CreateForm noch ein paar Dinge mehr.



  • Hallo,

    also ich bekomm das leider nicht hin, im Project stehen beide Formen auf autoerzeugen und in der main steht dann natürlich auch folgendes drin:

    Application->Initialize();
    	Application->MainFormOnTaskBar = true;
    	Application->CreateForm(__classid(TForm1), &Form1);
    	Application->CreateForm(__classid(TForm2), &Form2);
    	Application->Run();
    

    es geht soweit ich das jetzt geteste habe nur in dieser Methode hier:

    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
    	Form2->ShowModal();
    }
    

    stellt das in irgendeiner Weise ein Problem dar wenn ich es in der Form1 OnActivate Funktion so aufrufe ?


  • Mod

    Hallo

    vermutlich ist deine Form2 noch nicht vorhanden
    wenn du sie anzeigen (ShowModal) willst

    einfache Moeglichkeit - tausche Form1 gegen Form2 beim Erstellen
    (ist nicht besondes toll aber sollte gehen)

    oder starte einen Timer um die 2te Form anzuzeigen
    (pruefen ob schon vorhanden)

    oder .....
    gibt viele Moeglichkeiten

    Ist die Frage wieviel Zeit du reinstecken willst

    Mfg
    Klaus



  • Im Konstruktor von Form1 gibt es die Form2 noch nicht.

    Wenn Du abhängig von einem Startparameter Form1 oder Form2 anzeigen möchtest, dann kannst Du auch einfach die Reihenfolge des Erzeugens ändern.
    Die als erstes mit CreateForm erzeugte Form ist die Mainform der Anwendung.

    if (StartWithForm1)
    {
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->CreateForm(__classid(TForm2), &Form2);
    }
    else
    {
        Application->CreateForm(__classid(TForm1), &Form2);
        Application->CreateForm(__classid(TForm2), &Form1);
    }
    


  • Hallo,

    also ich hab es nicht ausprobiert aber es müssen immer beide Formen sichtbar sein, wobei Form2 Modal angezeigt werden soll.

    Es geht mit einem Timer aber auch so:

    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
        Form2->ShowModal();
    }
    

    Nur weis ich nicht ob es an dieser Stelle angebracht ist, aber es geht.


Anmelden zum Antworten