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 :

Application->Terminate et OnClose, OnCloseQuery


Sujet :

C++Builder

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut Application->Terminate et OnClose, OnCloseQuery
    Bonjour à tous,

    je rencontre un "petit" problème avec C++ Builder.
    Sur ma fenêtre j'ai un bouton qui permet de quitter
    gestionnaire OnClick :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->Terminate();
    J'ai aussi écris du code dans le gestionnaire OnClose. Or si j'éxécute en pas-à-pas et que je met un point d'arrêt dans le code de ce gestionnaire je n'y passe jamais !!! (bien entendu j'ai essayé en quittant l'application via mon bouton).

    Suite à certains posts que j'avais lu j'ai tenté de déplacer ce code dans OnCloseQuery.
    Idem je n'y passe jamais.

    Du coup j'ai tenté de forcer la fermeture, le code de mon bouton quitter est donc devenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MainForm->Close();
    Application->Terminate();
    .
    Dans ce cas je passe bien par le code qui doit être executé à la fermeture, mais j'ai un access violation dans Forms.hpp sur la ligne du destructeur de TForm...

    J'avoue y perdre mon C++....quelqu'un a-t-il déjà rencontré un problème similaire ?

    Merci d'avance pour votre aide !
    Neilos

  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
    Bonjour,
    phénomène étrange
    en principe il suffut simplement d'un appel a
    le resultat sera l'appel de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FormCloseQuery
    // la variable CanClose permet de déterminer la suite de l'action
    // Valeur possible false --> pas de fermeture,
    //                 true ---->poursuite de la destruction de la Form
    //     
    FormClose() // si CanClose =true;
    Cordialement
    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 éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Ben oui je sais tout ça...d'où mon incompréhension du probème !
    Est ce que c'est le pas-à-pas qui bug ? Les points d'arrêts ?
    Neilos

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    A priori il vaudrait mieux fermer la fenêtre principale (qui est celle sur laquelle je travaille) plutôt que de faire un Application->Terminate();

    J'ai donc fait cela, mis le programme me plante toujours à la fermeture sur cette ligne de Forms.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
    Il me fait un access violation à une adresse du style 0x000000C25.
    Je ne comprend pas ça marchait bien...et là plus
    Neilos

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    La form que tu veux fermer dans ton programme est-elle ouverte dans l'IDE quand tu débuggues ??
    Le problème pourrait venir de là, Borland se mélangeant (peut-être) les pinceaux dans la fermeture de la form.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Citation Envoyé par Neilos
    A priori il vaudrait mieux fermer la fenêtre principale (qui est celle sur laquelle je travaille) plutôt que de faire un Application->Terminate();
    Je crois Application->Terminate() ne s'utilise qu'exceptionnellement, c'est une sortie brutale dont on a besoin dans certains cas de rupture immédiate, on utilise pour une sortie normale Close() ou Form1->Close() si vous êtes à l'extérieur de la classe principale.

    Dans votre cas, il doit y avoir une erreur ailleurs mais comme on ne connaît pas la structure de votre application ni ses fonctions principales, il est difficile de vous aider.

    À bientôt
    Gilles

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Eh beh moi qui utilisait avec plaisirs le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->Terminate();
    Par contre pour ce qui est de décrire mon application, ben c'est le PowerBench qui est dans ma signature. Je le fais évoluer là et depuis peu j'ai ce problème.

    Ce qui m'embête c'est que j'ai un Access Violation mais que Code Guard ne dit rien

    Edit : une petite piste.
    Il faut savoir que l'exception intervient APRES l'execution de la ligne
    du fichier principal du projet (celui généré et géré par Borland).

    De plus dans ma fenêtre principal j'ai une barre de titre virtuelle, donc j'ai cela dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER ( WM_NCHITTEST, TMessage, WMNCHITTEST );
       END_MESSAGE_MAP ( TForm );
    Par contre mettre le code ci-dessus en commentaire ne résoud pas le problème.

    Et le pire c'est qu'après l'execution du
    return 0; il passe encore une ou deux fois par le BEGIN_MESSAGE_MAP...avant de finir sur la ligne où ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
    Neilos

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Bon apparement ça proviens d'une modif faite par une fonction appelée par mon code dans le OnClose. Je n'ais pas encore trouvé laquelle mais que je met l'appel à cette fonction en commentaire ça marche.

    Merci encore pour votre aide, je marque ce sujet résolu puisque le problème est maintenant quasiement identifé.
    Neilos

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

Discussions similaires

  1. Communication entre application et terminal
    Par JaroBx dans le forum Général Java
    Réponses: 2
    Dernier message: 01/07/2010, 11h18
  2. Ma première application est terminée
    Par cad13 dans le forum Mon application mobile
    Réponses: 6
    Dernier message: 01/03/2010, 22h46
  3. thread terminate destroy onclose onclosequery
    Par ouiouioui dans le forum Langage
    Réponses: 7
    Dernier message: 13/01/2010, 20h11
  4. Réponses: 3
    Dernier message: 14/06/2008, 22h36
  5. Réponses: 3
    Dernier message: 07/12/2006, 11h16

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