IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Pas d'événement OnClose quand on arrête W2K [Trucs & Astuces]


Sujet :

C++Builder

  1. #1
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut Pas d'événement OnClose quand on arrête W2K
    Sauf erreur, quand on arrête ou redémarre Windows 2000, l'application développée en BCB 5 ne reçoit pas les événements OnClose ou OnDestroy.
    Quelqu'un a-t-il été confronté à cela ? Comment résoudre le problème ? Avec un composant TApplicationEvents ?
    RAD Studio 10.3 / Ubuntu 20.04 - RYZEN 7 2700X - 24Go de RAM

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    sous windows ce n'est pas le message WM_Close qui est envoyé a la fermeture du système
    mais le message WM_QUERYENDSESSION
    a toi de définir un gestionnaire de Message

    Salutations
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Cela n'est-il pas censé être fait avec l'événement OnCloseQuery ?

    J'ajoute que sous W9x on n'a pas le problème (je vérifierai cela demain car je n'ai pas de W9x sous la main)
    RAD Studio 10.3 / Ubuntu 20.04 - RYZEN 7 2700X - 24Go de RAM

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    non ce message est traité par la couche Application et non pas par TForm
    --> pas de gestionnaire
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Avec un composant TApplicationEvents, le code suivant (événement "OnMessage") ne fonctionne pas en quittant Windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
    {
      if (Msg.message == WM_QUERYENDSESSION)
        ShowMessage("QUERYENDSESSION");
    }
    Faut-il utiliser autre chose ?
    RAD Studio 10.3 / Ubuntu 20.04 - RYZEN 7 2700X - 24Go de RAM

  6. #6
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    tu définis simplememt une méthode de gestion de message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    dans le .h
    protected:
    void __fastcall  EndSession(TMessage& msg)
     
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage, EndSession)
    END_MESSAGE_MAP(TForm)
    };
     
    dans le .c
    void __fastcall Tform1::EndSession(TMessage& msg)
     
    {
    //... ton code de fermeture
    }
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  7. #7
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    Ca marche impec. Merci.
    Ajoutons pour les lecteurs intéressés que la fonction étant un void et donc sans valeur de retour, celle-ci doit se trouver dans msg.Result :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::EndSession(TMessage& msg)
     
    {
      ....
      msg.Result = true; // au lieu de 'return TRUE' en Windows classique
    }
    Sans cette ligne, Windows ne s'arrêtera pas.
    RAD Studio 10.3 / Ubuntu 20.04 - RYZEN 7 2700X - 24Go de RAM

  8. #8
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    Votre solution m'intéresse beaucoup, mais je rencontre des problèmes pour la mettre en place.
    Voilà ce que j'ai testé:

    * Dans le fichier TForm.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    protected:
        void __fastcall  EndSession(TMessage& msg){
            BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage, EndSession)
            END_MESSAGE_MAP(TForm)
        };
    * Dans le fichier TForm.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TForm::EndSession(TMessage& msg)
    {
        // mon code
        msg.Result = true;
    }
    Mais j'ai des erreurs, notamment le corps de la fonction n'est pas accepté dans le .cpp puisque déjà défini dans le .h! Voilà les erreurs:
    [C++ Error] main.h(84): E2092 Storage class 'virtual' is not allowed here
    [C++ Error] main.h(87): E2139 Declaration missing ;
    [C++ Error] main.cpp(34): E2171 Body has already been defined for function '_fastcall TformMain::EndSession(TMessage &)'
    Voyez-vous où je fais mon erreur? Merci d'avance pour vos réponses, même après tout ce temps!
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  9. #9
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut,
    si tu regarde bien le code posté, le code suivant n'est pas dans la fonction EndSession, mais dans la classe TForm (tu as mis une acolade en trop) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage, EndSession)
    END_MESSAGE_MAP(TForm)
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  10. #10
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    OK, effectivement, je m'étais laissé tromper par l'accolade fermante en dessous de END_MESSAGE_MAP(TForm) dans le post de DjmSoftware.

    Je suis novice dans l'utilisation de ces fonctions "système". Il faut donc les mettre dans le .h, à l'intérieur de la déclaration de la classe TForm, mais à un endroit particulier? Ou n'importe où entre les déclarations de fonctions?

    Donc, si je comprends bien, ce code permet de capter l'évènement QUERYENDSESSION, c'est à dire la fermeture de session de Windows? Ou uniquement l'extinction de la machine?

    Merci!
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2010, 21h32
  2. Comment ne pas interrompre un programme quand il y a erreur
    Par chercheur3 dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 28/03/2007, 19h03
  3. Réponses: 2
    Dernier message: 07/01/2007, 12h15
  4. Lancer l'événement onChange quand la sélection change
    Par linar009 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/08/2006, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo