Fenster zur Benutzeranmeldung macht nicht was es soll



  • Ich möchte in meinem Programm die Benutzung nur nach Anmeldung ermöglichen. Somit habe ich in der im Create von Form1 ein Form2->ShowModal(); drin. Bei der Ausführung erscheint nur Form2 und erst nach der "Abarbeitung" der Anmeldung die Form1. Setze ich vor den Aufruf der Form2.. noch Form1->Show(); kommt eine Fehlermeldung. Was mache ich falsch?



  • Alles 😉

    Du machst den Aufruf Form2->Show() in der TForm1::Create() Methode, das heisst, dass das Form1 zu diesem Zeitpunkt noch nicht vollständig erzeugt worden ist und damit auch nicht angezeigt werden kann. Daher erscheint nur Form2 und erst nach dem Schliessen von Form2 wird Form1 korrekterweise angezeigt (weil dann die Create Methode verlassen werden kann).
    Der Aufruf von Form1->Show in TForm1::Create() funktioniert aus den gleichen Gründen nicht, Form1 ist noch nicht vollständig konstruiert und daher ist die Pointervariable Form1 auch noch ungültig und erzeugt wahrscheinlich einen ungültiger Speicherzugriff.
    Ich vermisse ein Event, das ausgelöst wird, wenn ein Formular das erste Mal angezeigt wird (bei MFC: OnInitDialog(), im .NET Framework: OnLoadForm()), damit man auf das erste Anzeigen des Formulars irgendwie reagieren kann. Bisher habe ich da nur eine Notlösung, bei der ich eine bool Variable FirstTimeVisible als Member der Formularklasse anlegen und sie mit true initialisiere. Im OnShow() Ereignishandler frage ich diesen Wert ab, wenn er true ist wird das Formular zum ersten Mal angezeigt und ich kann entsprechende Massnahmen durchführen und das Flag auf false setzen. Das funktioniert allerdings nur, wenn das Formular nicht automatisch vom Framework erzeugt wird, sondern manuell eine neue Instanz erzeugt wird:

    void SomeClass::somefunc()
    {
       // neues Formular erzeugen
       TForm1* pForm = new TForm1( SomeOwner );
       pForm->ShowModal();
       delete pForm;
    }
    
    void TForm1::OnShow( TObejct* Sender )
    {
       if( true == FirstTimeVisible )
       {
          FirstTimeVisible = false;
    
          TForm2* pForm = new TForm2( this );
          pForm2->ShowModal();
          delete pForm2;
       }
    }
    

    Auf Chromleisten wie smart pointer habe ich mal verzichtet.


Anmelden zum Antworten