[x] Schaltfläche



  • hallo,


    danke



  • Hallo

    Dann must du den Event TForm::OnCloseQuery verwenden, um einerseits das automatische Schließen zu verhindern und andereseits deine eigene Aktion auszuführen.
    Allerdings must du darauf achten in dem Event auch irgendwann das Form und damit die Anwendung wirklich schließen lassen zu können.

    bis bald
    akari



  • danke es hat geklappt:

    bool bgDontClose = false;//Globale Varialbe
    //------
    void __fastcall TAppForm::Exit1Click(TObject *Sender)
    {
     //hier wird das Programm beendet
     bgDontClose = true;
     Close();
    }
    //-------
    void __fastcall TAppForm::FormCloseQuery(TObject *Sender,
          bool &CanClose)
    {
      //hier wir das Programm minimiert über die [x] Schaltfläche, BorderStyle ist bsSizeToolWin
      CanClose = bgDontClose;
      WindowState = wsMinimized;
      TrayIcon1->Hide = true;
      TrayIcon1->Minimize();
      TrayIcon1->Update();
    }
    //--------------------
    

    danke schön und frohe Pfingsten



  • Hallo

    statt der globalen Variable solltest du diese lieber als Member des Forms deklarieren.

    bis bald
    akari



  • meinst du in den Header:

    private:	// User declarations
    bool bgDontClose;
    

    der pc lässt sich nicht runterfahren wenn das Programm active im systemtray ist. hast du ne Idee warum?



  • Hallo

    meinst du in den Header:

    Ja

    der pc lässt sich nicht runterfahren wenn das Programm active im systemtray ist. hast du ne Idee warum?

    Ist ja auch klar, weil auch Windows beim Beenden versucht alle Programme zu schließen. Dein Programm verweigert das und Windows bricht das herunterfahren ab.

    /Edit : Als einfachte Lösung sehe ich, den [x]-Button zum Schließen im Form ganz zu entfernen, und somit auch kein OnCloseQuery zu benötigen.

    bis bald
    akari



  • der pc lässt sich nicht runterfahren wenn das Programm active im systemtray ist. hast du ne Idee warum?

    dies hat sich erledigt.



  • aber warum soll die bool Variable in den Header geschrieben werden?



  • Hallo

    Die Frage würde sich mit Grundkenntnissen erübrigen.
    Um es kurz zu machen : eine globale Variable ist genau einmal vorhanden. Eine Membervariable ist genau für jede Instanz der Klasse vorhanden.
    Da auch von Form-Klassen zur Laufzeit mehrere dynamische Instanzen erzeugt werden könnten, würden bei globalen Variablen mehrere Forms auf die selbe Variable zugreifen, was in deinem Kontext schlecht wäre.

    Dieses Problem mag in deinem Ablauf noch nicht akut werden, aber besser du gewöhnst dir gleich an, keine globalen Variablen zu benutzen, es sei denn du weißt genau was du tust und das du diese brauchst.

    bis bald
    akari



  • danke für dein Antwort,
    zu dem Herunterfahren des Rechners habe ich was zusammen gebastelt, und es funktioniert ohne Ärger.
    Header:

    protected:
      BEGIN_MESSAGE_MAP
         VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION, TMessage, OnShutdown)
      END_MESSAGE_MAP(TForm)
      void __fastcall OnShutdown(TMessage & Msg);
    

    Cpp:

    void __fastcall TAppForm::OnShutdown(TMessage &Msg)
    {
     bgDontClose = true;
     TObject:: Dispatch(&Msg);
     Close();
    }
    

    das Programm fängt den Runterfahren von Windows ab und zwingt sich selbt zu schliessen, dann läuft das Windows Runterfahren ohne Problem.



  • Hallo

    ja das ist in Ordnung.

    Allerdings finde ich die Namensgebung der Variable bgDontClose nicht gelungen. Du setzt bgDontClose auf wahr, wenn das Fenster geschlossen werden kann... die Variable sollte besser bgCanClose heißen, um Verwechlung mit der Wertebelegung auszuschließen.

    bis bald
    akari


Anmelden zum Antworten