Beenden mit 'Alt'+'F4' verhindern



  • Hello again!

    Das Beenden Fenster wird aufgerufen wenn ich den Button klicken oder im Menü.
    Im Event von OnCloseQuery steht:

    if(Beenden->ModalResult == mrCancel)
     {
      CanClose = false;
     }
    

    Den Buttons auf dem Beenden Formular habe ich das entsprechende ModalResult zugeordnet.
    Aber entweder funktioniert es nur mit Alt+F4 oder mit den beiden Beenden Buttons.
    Er gibt die Fehlermeldung aus: "Cannot make a visible window modal".
    Habe schon die Form Beenden beim Start vom Hauptfenster auf visible=false gesetzt. Dann kommt gleich ne Adressfehlermeldung.

    Wie genau muß es denn jetzt ??



  • ...auch mit

    if(Beenden->ShowModal() == mrCancel)
     {
      CanClose = false;
     }
    

    gehts nicht.

    😕



  • Hallo!

    Kann mir noch jemand einen großen Tipp geben ?!



  • Na klar.

    - neues Projekt
    - im OnCloseQuery der Form1 folgenden Code

    if (Form2->ShowModal() == mrOk)
        CanClose = true;
      else
        CanClose = false;
    

    - eine neue Form hinzufügen, die Unit2.h in Unit1.cpp einbinden
    - zwei Buttons auf die Form2
    - ModalResult des ersten Button = mrOk, ModalResult des zweiten Button = mrCancel

    Kompilieren, funktioniert.

    [ Dieser Beitrag wurde am 08.07.2003 um 16:53 Uhr von Jansen editiert. ]



  • Danke erstmal. Klappt im neuen Projekt. Aber nicht in meinem.
    Er gibt die Fehlermeldung aus: "Cannot make a visible window modal".
    Was hat das zu bedeuten ?



  • Offenbar versuchst du, ein bereits geöffnetes Fenster nochmal mit ShowModal aufzurufen.



  • Mein letzter Versuch. Vielleicht klappts jetzt.
    Wenn ich alles so mache wie beschrieben....mit Form1 OnCloseQuery usw....dann geht das mit Alt+F4. Aber ich möchte auch über den Beenden-Button die andere Form aufrufen und über das Menü. Dann muss ich doch auch ShowModal einsetzen, oder nur eben Show(geht dann auch nicht).
    Vielleicht hab ichs nicht richtig ausformuliert 😞

    Reagiert OnCloseQuery nur auf Alt+F4 ??
    Ich kriegs nich hin.
    Ein letztes Mal noch 🙄 Hilfe!



  • OnCloseQuery wird aufgerufen, wenn dein formular geschlossen werden soll, d.h. egal ob über ALt-F4 oder Close oder den Schliessen-Button im System-Menü.

    du darfst das formular zum beenden nicht vorher schon anzeigen, sondern erst wenn das programm beendet werden soll und dann mit ShowModal()... prüfe das mal!

    wenn du deinen button klickst, rufst du doch sicher Close auf um das formular zu schliessen, dann wird das ereignis OnCloseQuery generiert.

    void __fastcall TForm1::Menu1BeendenClick(TObject *Sender)
    {
      Close(); 
    }
    
    void __fastcall TForm1::BeendenButtonClick(TObject *Sender)
    {
      Close();
    }
    
    void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
    {
      if (BeendenFormular->ShowModal() == mrCancel)
        CanClose = false;
    }
    

    wenn du immer noch nicht klar kommst, poste mal deinen code zum schliessen und aufrufen des beenden-formulares!

    [ Dieser Beitrag wurde am 08.07.2003 um 17:23 Uhr von Sunday editiert. ]



  • Vielleicht stehe ich ja auf dem Schlauch. Aber wie wäre es damit, den OK-Button im Beenden-Fenster einfach im OnClick-Event

    Application->Terminate();
    

    ausführen zu lassen?



  • Terminate() beendet brutal die anwendung, wenn also irgendwo ein fenster offen ist, dass zuvor gespeichert werden soll, gehen die daten verloren!



  • Dann könnte durch den Buttonklick erst alles gespeichert werden und dann Terminate() benutzt werden..



  • wenn du eine textverarbeitung schreibst, ist (sollte) jedes fenster selbst verantwortlich sein, was mit seinem inhalt passiert und sowas nicht irgendwie hingebogen werden. das hat nix mit dem rest des programmes zu tun, zumal die hier vorgestellte lösung ja funktioniert aber Fischkop wahrscheinlich irgendwo anders einen fehler hat!



  • Na also...es funktioniert :p

    Im Nachhinein ergibt auch alles einen Sinn. Ich hatte nämlich beim MenüBeenden und ButtonBeenden Beenden->ShowModal eingesetzt, deshalb die Fehlermeldung.

    Schön wenn einem geholfen wird und dann die Lichter angehen.

    Vielen Dank nochmal 😉


Anmelden zum Antworten