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

 Delphi Discussion :

Close dans FormShow --> Bizzare


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Par défaut Close dans FormShow --> Bizzare
    Bonjour tout le monde,

    J'ai une bizzarerie que je n'arrive pas à expliquer.

    Dans mon programme, il m'arrive de devoir fermer la fenêtre principale dans le formshow car certaines conditions ne sont pas remplies. J'appelle donc la fonction à l'intérieur de la fonction "FormShow". Jusqu'à aujourd'hi, ça fonctionnait parfaitement bien.

    J'ai installé mon application sur un PC en Windows 7 32 bits (Chose que j'ai déjà fait auparavant et qui fonctionnait très bien) et le close n'est pas exécuté, ma fenêtre reste ouverte.

    Ce qui est étrange c'est que si, juste après le close, je fais :

    Alors là, la fenêtre se ferme. Par contre, le showmessage n'affiche rien du tout

    J'ai essayé plusieurs variantes comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      - postmessage(self.Handle, WM_CLOSE, 0, 0);
      - Application.Terminate
      - Delay(100) //Après le close
    Rien de tout ça ne fonctionne.

    J'ai essayé de faire deux close à la suite. ça fonctionne mais ça pose des problèmes sur tous les autres PC qui fonctionnaient très bien avant.

    Est-ce que quelqu'un y comprend quelque chose? Y a-t-il un moyen de régler ça?

    Sur le même PC, j'ai d'autres application qui font un close dans le formshow et ça fonctionne très bien

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Par défaut
    J'essayerais en créant une procédure PostShow... histoire de laisser le temps qu'il faut à Windows pour qu'il fasse tout ce dont il a besoin...

    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
    18
    19
    const
      WM_AFTER_SHOW  = WM_USER + 1;
     
    private
        procedure PostShow(var Msg: TMessage); message WM_AFTER_SHOW;
     
    ...
     
    procedure TfrmMain.FormShow(Sender: TObject);
    begin
      // ...
     
      PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
    end;
     
    procedure TfrmMain.PostShow(Sender: TObject);
    begin
      Self.Close;
    end;

  3. #3
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Par défaut
    Salut Whiler,

    Merci de ta réponse.

    Entre temps j'ai fais encore quelques essais et si je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ProcessMessages
    Tout à la fin de mon FormClose, ça résous mon problème.

    histoire de laisser le temps qu'il faut à Windows pour qu'il fasse tout ce dont il a besoin...
    Tu penses que c'est parce que cet ordinateur en particulier ne laisse pas le temps à Windows d'exécuter tout ce qu'il faut? je n'ai pas tout compris les causes de ce problème.

  4. #4
    Membre chevronné
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Par défaut
    Sous 7, il fait plus de trucs qu'avant... création du bouton dans la barre des tâche, de le prévisualisation, ...

    Et du coup, il n'a pas encore fini lorsque tu demandes le close...

    Et donc, le ProcessMessages lui laisse le temps de faire ce qu'il a à faire et résout le pb... c'est clair que c'est plus simple que ma solution

  5. #5
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Par défaut
    Merci beaucoup pour ces précisions.

    je peux donc écarter la thèse du PC hanté ou de l'usine du client construite sur un ancien cimetière indien (J'en étais presque réduite à ça).

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Nono23 Voir le message
    Merci beaucoup pour ces précisions.

    je peux donc écarter la thèse du PC hanté ou de l'usine du client construite sur un ancien cimetière indien (J'en étais presque réduite à ça).
    attends de trouver la bonne réponse avant d'écarter d'autres solutions
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Citation Envoyé par Whiler Voir le message
    Sous 7, il fait plus de trucs qu'avant... création du bouton dans la barre des tâche, de le prévisualisation, ...

    Et du coup, il n'a pas encore fini lorsque tu demandes le close...

    Et donc, le ProcessMessages lui laisse le temps de faire ce qu'il a à faire et résout le pb... c'est clair que c'est plus simple que ma solution
    Un simple "Application.Terminate" devrait suffir. Si mes souvenirs sont bons, cette fonction set juste le flag "Terminated' a true, et ce terminated est verifié a chaque message, dans la boucle principale. Donc ton exe devrait arreter de boucler et terminer !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //structure de la boucle de message de l'application (il me semble)
    procedure Application.WndProc(...);
    begin
      while not Terminated do
        processMessage(PopMessage(...));
    end;

  8. #8
    Membre chevronné
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Un simple "Application.Terminate" devrait suffir. Si mes souvenirs sont bons, cette fonction set juste le flag "Terminated' a true, et ce terminated est verifié a chaque message, dans la boucle principale. Donc ton exe devrait arreter de boucler et terminer !
    Perso, j'n'aime pas parce que s'il y a du code fonctionnel dans d'autres événements, ils ne seront pas appelés (close, closequery, ..).
    Mais si ce n'est pas le cas, c'est clair que c'est le plus rapide (sans modifier le dpr).

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 101
    Par défaut
    Le mieux est de procéder différemment : c'est de ne pas lancer le Run de Application si le contexte n'est pas complet !

    Si ton programme est correctement architecturé, tu as des objets systèmes et métiers que tu peux contrôler avant de faire CreateForm et Run, si echec, tu ne fais ni l'un ni l'autre !

    Si tout est bon, tu fais un CreateForm, le constructeur du MainForm fait d'autre contrôle et déclenche une exception que tu captureras sans lancer le Run

    utilise un SplashScreen durant les controles permettra de faire patienter l'utilisateur !

    Si tu ne veux pas te prendre la tête, détecte la version de Window et si c'est supérieur à 6.1, tu lance un WM_CLOSE en plus ou le ProcessMessages !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Problème folder.close dans javamail
    Par riadhhwajdii dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 29/01/2014, 15h21
  2. [XL-2010] Fichier.close dans Worksheet_BeforeDoubleClick plante Excel
    Par EstelleG dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/10/2012, 10h56
  3. Close dans le destructeur de la classe file ?
    Par sopsag dans le forum Général Python
    Réponses: 3
    Dernier message: 04/04/2009, 16h23
  4. ActiveWorkbook.close dans ThisWorkbook
    Par unfcool dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 25/05/2007, 15h05
  5. [VS2005] winform -> Close dans un load.
    Par dacid dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 18/01/2007, 10h17

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