Beenden mit 'Alt'+'F4' verhindern



  • Morgens!

    Bevor einer was sagt zu dem Beispiel in der FAQ muss ich sagen, dass genau das bei mir nicht funzt. Ich rufe zum Beenden ne eigene Form auf und steuer das über diese. Aber wenn ich in der Hauptform im CanClose-Event false eingebe, kann ich das Programm überhaupt nicht mehr schließen. ??

    Hab schon ne Menge versucht. Jetzt benötige ich einen Rat.

    Wer kann helfen ?



  • wann wird die extra-form aufgerufen? sobald im hauptformular versucht wird, es zu schliessen (d.h. im FormCloseQuery)?

    dann kannste doch einfach den rückgabe-wert des formulares auswerten. du hast doch sicher schaltflächen auf dem formular. denen verpasst du ein ModalResult, welches vom formular beim schliessen zurückgegeben wird (wenn diese mit ShowModal()) angezeigt wird. diesen rückgabe-wert wertest du aus und beendest dein programm oder halt nicht .



  • 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