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 :

Utilisation OnCloseQuery !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut Utilisation OnCloseQuery !
    Voici mon problème, à la fermeture de ma fiche, j'ai deux instructions comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
     
     If flagmodif then canclose := ecriture(false); //1
     
     Application.CreateForm(TFormexit, Formexit); //2
     
      if Formexit.Showmodal = mrOk then
        CanClose := true
      else CanClose := False;
     
    end;
    Je me demandais si cette façon de faire était logique car je n'ai pas de bug apparent.

    Merci de votre attention.

    @+,

    Cincap

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Disons que le premier CanClose ne sert à rien au retour de Ecriture puisque tu le réassignes plus bas.

    Ne devrais-tu pas afficher TFormExit que si l'écriture à réussie?
    De plus, FormExit n'est pas libérée si l'application n'est pas terminée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      If FlagModif then CanClose := Ecriture(false);
     
      if CanClose then
        with TFormExit.Create(nil) do
        begin
           CanClose := ShowModal = mrOk;
           Free;
        end;
    end;

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut Belle erreur !
    @ AndNotOr, j'ai une erreur à la fermeture de mon application, ma fiche exit contient aussi deux Tbuttons, un annuler et l'autre Ok avec respectivement modalresult mrnone et mrok.

    @+,

    Cincap

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut
    En fait je dois pouvoir dire oui ou non pour l'enregistrement et dans les deux cas, afficher la fiche de fermeture avec aussi le choix de dire annuler ou ok

    @+,

    Cincap

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut
    Avec ceci, cela fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     Application.CreateForm(TFormexit, Formexit);
     
      if Formexit.Showmodal = mrOk then begin
     
        CanClose := true ;
        FlagModif := Ecriture(false) end
     
      else CanClose := False;
    Je vais attendre avant de mettre Résolu.

    @+,

    Cincap

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    La form n'est toujours pas libérée

    (je me permets de reprendre le code de Antnotor, pour le modifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      If FlagModif then CanClose := Ecriture(false);
     
      with TFormExit.Create(nil) do
      begin
         CanClose := (ShowModal = mrOk);
         Release;
      end;

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    je comprend pas trop l'utilité de soit tu fait un truc du genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       Application.CreateForm(TFormexit, Formexit);// on lance la fenetre de fermeture dans tout les cas 
       if Formexit.Showmodal = mrOk then 
       begin // Si on repond ok 
         CanClose := Ecriture(false) ;// on valide les ecriture 
         FlagModif := not(CanClose);// on inverse le flagModif 
                                                //si on peut fermer cela veut dire qu'il n'y a  plus de modif en cours sinon c'est toujours en modif 
      end
      else
        CanClose := False;
    @+ Phil

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Si tu avais une erreur, c'est que tu faisais FormExit.Create et non TFormExit.Create.

    Si ton code te convient, tant mieux. Personnellement, je coderais plutôt trois états:

    - Sortie en sauvant,
    - Sortie sans sauver,
    - Annuler

    PS: Free et Release, même combat

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Je suis d'accord, c'est juste une habitude de programmation

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut
    @ tous,

    Si tu avais une erreur, c'est que tu faisais FormExit.Create et non TFormExit.Create.
    Non je faisais ceci dans le onclick en ayant pris soin de le désactiver dans le projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.CreateForm(TFormexit, Formexit);//
    ma fiche exit se trouve dans l'application et je l'ai donc remise dans le projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Application.CreateForm(TForm9, Form9);
      Application.CreateForm(TFormexit, Formexit);
      Application.Run;
    pour obtenir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     if Formexit.Showmodal = mrOk then begin
     
        CanClose := true ;
        FlagModif := Ecriture(false) end
     
      else CanClose := False;
    Donc je ne vois pas pourquoi elle doit être encore libérée !

    Ecriture(false)
    est une procédure d'enregistrement.

    ceci dit, je vais tester le code d'anapurna et je vous tiens au courant.

    Merci à tous de votre attention,

    @+,

    Cincap

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    PS: Free et Release, même combat
    ô non, pas le même, il y a un grand débat autour ce sujet
    free avec TForm.creat(nil),, release avec TForm.creat(application)

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    la grosse différence réside dans le fait que le release attend que tout les événements liés à la forme soit interprétés avant de faire un free

    @+ Phil

  13. #13
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    je vais modifier ton code Andnotor,à mon gout
    Citation Envoyé par Andnotor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      CanClose :=FlagModif and Ecriture(false);
      if CanClose then
        with TFormExit.Create(application) do
        try
           CanClose := ShowModal = mrOk;
        finally
           Release;
        end;
    end;

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    le monsieur veut la fenêtre de confirmation de sortie a tous les coup
    dans ta démarche elle n'apparais que si elle est nécessaire
    c'est un choix de navigation

    @+ Phil

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    oui sa c'est vrai, mais j'ai modifier simplement le code de andnotor

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    @Edam
    J'y ai jeté un coup d'oeil, mais long débat pour pas grand chose

    Release est un Free asynchrone et ne fait strictement rien d'autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Unit Forms;
    procedure TCustomForm.Release;
    begin
      PostMessage(Handle, CM_RELEASE, 0, 0);
    end;
     
    procedure TCustomForm.CMRelease;
    begin
      Free;
    end;
    Si un composant veut se libérer lui-même, oui il doit obligatoirement passer par un Release, sinon le retour de l'événement pointera sur une adresse devenue invalide !

    Dans le cas qui nous concerne, il n'y a aucune différence puisque la destruction se fait depuis la fiche principale (ou du moins est externe à TFormExit)

    Et je ne vois vraiment pas en quoi le propriétaire est impliqué dans ce processus

  17. #17
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    j'ai dis simplement qu'il y a une différence celons, le type de création on utilisant(application ou nil),l'utilisation , ....
    et pour le code, j'ai proposé le mien car c'est ce que j'utilise tout le temps

  18. #18
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    J'aimerais bien justement que tu m'expliques cette différence .

    (PS: Et si j'étais toi, j'oublierais vite le lien que tu nous as fourni.)

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 450
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 450
    Points : 1 336
    Points
    1 336
    Par défaut Oh oh, quel débat !
    Avant tout merci à tous de prendre part à ce topic.

    @ anapurna, merci pour ta solution qui fonctionne exactement comme il se doit et aussi comme mon test (ma réponse à 11H23) peut être une différence qui ne se mesure pourtant pas mais que j'aimerai connaître si il y en a une.

    Ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     if Formexit.Showmodal = mrOk then 
       begin // Si on repond ok 
         CanClose := Ecriture(false) ;// on valide les ecriture 
         FlagModif := not(CanClose);// on inverse le flagModif 
                                                //si on peut fermer cela veut dire qu'il n'y a  plus de modif en cours sinon c'est toujours en modif 
      end
      else
        CanClose := False;
    le monsieur (peut être suis je une dame !) veut la fenêtre de confirmation de sortie a tous les coup
    dans ta démarche elle n'apparais que si elle est nécessaire
    c'est un choix de navigation
    Exactement, si je sors sans modification, ma fiche exit s'affiche et je peux annuler ou sortir.

    Si je fais une modification ma fiche exit s'affiche et je peux annuler ou sortir puis après le messagedlg me permet de sauver ou non mais quand même de fermer l'application.

    Pour :

    Application.CreateForm(TFormexit, Formexit);//
    J'affirme que ma fiche se détruit à la fermeture de l'application comme n'importe quelle autre fiche.

    Merci à tous, je marque "Résolu".

    @+,

    Cincap

    P.s, je serai absent 8 jours, sud de la Turquie dès demain matin

  20. #20
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Entièrement d'accord qu'elle se détruit si tu quittes ton application, mais pas dans le cas du CanClose := False;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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