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

Langage Delphi Discussion :

Enregistrement puis fermeture


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut Enregistrement puis fermeture
    Bonjour,

    J'ai une application, lorsqu'on modifie le formulaire de l'application, Je passe une variable "ModifForm" à True (boolean).
    De ce fait, lors de la fermeture de l'application, je voudrais controler cette variable, et SI ModifForm=True alors on Propose via un MsgBOX d'enregistrer les modifications ou non...

    J'ai fait le code le soucis c'est que je ne sais pas ou le palcer, car j'ai le message "Debordement de pile".

    Voici mon code :
    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
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    If ModifForm=True then
      If MessageDLG('Voulez-vous enregistrer les Modifications???',mtConfirmation,[mbYes,mbNo],0)= mrYes then
      begin
        Enregistrement;
        CanClose:=True;
        Close;
        end
      else begin
      CanClose:=True;
      close;
        end
    else begin
    CanClose:=True;
    close;
      end;
    end;
    Merci de votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    je pense déjà que cela peut beaucoup se simplifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    If ModifForm AND MessageDLG('Voulez-vous enregistrer les Modifications???',mtConfirmation,[mbYes,mbNo],0)= mrYes then
        Enregistrement;
    CanClose:=True;
    end;
    de plus il ne faut pas , du moins a mon avis, envoyer un close dans un évenement closequery , c'est déjà en cours

    PS . je ne sais même pas si le Canclose:=true est nécessaire puisque par défaut
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Close va rappeler CloseQuery => boucle infinie jusqu'au débordement de pile.
    CanClose est TRUE par défaut. Tu n'as besoin de le setter que dans le cas où tu veux aborter la sortie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      If ModifForm then
        case MessageDlg('Voulez-vous enregistrer les Modifications???', mtConfirmation, [mbYes,mbNo,mbCancel], 0) of
          mrYes    : Enregistrement;
          mrCancel : CanClose := FALSE;
        end;
    end;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Dans votre code original les close pose problème (j'ai recopier et marquer votre code pour indiquer les emplacement des closes).

    En faite cela revient a détruire le forme qui gère l'événement, cela est impossible.

    il est a noter que mettre "canclose" à "true" est inutile si vous ne l'avez pas modifier. C'est la valeur par défaut. Vous pouvez donc encore simplifier le code de SergioMaster.

    Ajout à postériori : Désolé, j'ai été trop long à entre mon message et je fais double emploi avec le message précédent.

    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
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    If ModifForm=True then
      If MessageDLG('Voulez-vous enregistrer les Modifications???',mtConfirmation,[mbYes,mbNo],0)= mrYes then
      begin
        Enregistrement;
        CanClose:=True;
        Close; <---------------------------------------------- Close  dans un close ?
        end
      else begin
      CanClose:=True;
      close; <------------------------------------------------ Close  dans un close ?
        end
    else begin
    CanClose:=True;
    close;
      end;
    end;

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Close va rappeler CloseQuery => boucle infinie jusqu'au débordement de pile.
    CanClose est TRUE par défaut. Tu n'as besoin de le setter que dans le cas où tu veux aborter la sortie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      If ModifForm then
        case MessageDlg('Voulez-vous enregistrer les Modifications???', mtConfirmation, [mbYes,mbNo,mbCancel], 0) of
          mrYes    : Enregistrement;
          mrCancel : CanClose := FALSE;
        end;
    end;
    Ok, Super sa marche, mais je ne comprend pas "Case", je n'ai pas l'habitude de l'utiliser et j'aimerais comprendre comment ça fonctionne... Merci de m'éxpliquer.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    le Case permet de simplifier l'écriture de If imbriqués si le test renvoi des constantes connues à la compilation.

    Ainsi dans ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case Message(...) of
      mrYes    : ...
      mrNo     : ...
      mrCancel : ...
    end;
    est une autre façon d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      i := Message(...);
     
      if i = mrYes then ...
      else if i = mrNo then ...
      else if i = mrCancel then ...

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Le case se traduit par selon

    Prenons un exemple simple, l'affichage du mois selon son "numéro" :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A, M, J: Word;
    begin
      // On décode la date actuelle et on mets dans A, l'année, dans M, le mois, et dans J, le jour
      DecodeDate(Date, A, M, J);
      // Selon le mois
      case M of
      // il vaut 01 => On affiche Janvier
      01:ShowMessage('Janvier');
      // il vaut 02 => On affiche Février
      02:ShowMessage('Février');
      //...
      end;
    end;
    Voilà.Ca évite des if imbriqué donc ça rend le code plus lisible et plus performant.
    Si tu veux mettre plus d'une ligne selon le cas, il faut entourer le traitement par un begin end :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A, M, J: Word;
    begin
      // On décode la date actuelle et on mets dans A, l'année, dans M, le mois, et dans J, le jour
      DecodeDate(Date, A, M, J);
      // Selon le mois
      case M of
      // il vaut 01 => On affiche Janvier
      01:begin
              ShowMessage('Janvier');
              ShowMessage('C''est le mois de la galette');
         end;
      // il vaut 02 => On affiche Février
      02:ShowMessage('Février');
      //...
      end;
    end;
    En espérant avoir pu t'aider et t'éclairer.
    A+

    Edit :
    Grilled

  8. #8
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci beaucoup pour toutes ces info, donc, (pour vérifier que j'ai bien compri) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case M of
      // il vaut 01 => On affiche Janvier
      01:begin
    Revien à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    If M=01 then
    begin
        showmessage ('Janvier')
        end
    else if M=02 then
    begin
        showmessage ('Fevrier')
        end;
    end;
    C'est sa??? Ou j'ai encore rien compris???

    Vraiment, merci beaucoup à tous !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Correct

  10. #10
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Ok...

    Et dans une situation comme celle ci est-ce qu'on peut utiliser case pour simplifier? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If MaConditionBoolean then
    begin
      MaVariable:=UneValeur;
      end
    else begin
      MaVariable:=UneAutreValeur;
      end;
    Je pense qu'on ne peut pas, mais peut être que je me trompe...

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    En fait, le case attend un Integer ...
    Ca ne fonctionne pas pour un type autre qu'un entier.

    Cependant, rien n'empêche de faire un case avec des string en utilisant l'astuce dans la FAQ.

  12. #12
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Ok...

    Mais le souci, c'est que dans mon cas, MaVariable serait de type :Real ;

    Donc je pense que je vais laisser comme sa !!!

    Merci encore à tous pour votre aide !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Un case sur un booléen fonctionne parfaitement .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case TestBool of
      TRUE  : ...;
      FALSE : ...;
    end;
    Mais l'écriture n'en est pas simplifiée par rapport à un if.

    Le case peut être utilisé dans beaucoup de cas: entiers, caractères, ensembles, etc. pourvu qu'il s'agisse de types ordinaux

  14. #14
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    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 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Si c'est juste une affectation de variable, on peut utiliser IfThen (unité Math ou StrUtils, en fonction du type de la variable).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaVariable := IfThen(MaConditionBoolean,UneValeur,UneAutreValeur);
    et petite précision pour le case, on peut aussi écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    case MaVariable of
      01:begin
    end;
      02:begin
    end
    // Toutes les autres valeurs
    else
    begin
    end;
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  15. #15
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Merci Andnotor pour la précision sur les booléens, j'avais pas tester n'ayant pas Delphi sous la main
    Comme le dit Linkin, on peut mettre un else dans le case of.
    Ca a pour but de toujours renvoyer une valeur par défaut.

    Si tu reprends l'exemple des dates que je t'ai montré, si peut faire :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A, M, J: Word;
    begin
      // On décode la date actuelle et on mets dans A, l'année, dans M, le mois, et dans J, le jour
      DecodeDate(Date, A, M, J);
      // Selon le mois
      case M of
      // il vaut 01 => On affiche Janvier
      01:ShowMessage('Janvier');
      // il vaut 02 => On affiche Février
      02:ShowMessage('Février');
      //...
      12:ShowMessage('Décembre');
      else
        ShowMessage('Immpossible d''indiquer le mois! La valeur doit être entre 1 et 12');
      end;
    end;
    Voilà, je pense qu'on a fait le tour de la question

  16. #16
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Super !!!

    Merci beaucoup à tous !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/08/2007, 17h01
  2. Enregistrements et Fermeture formulaire
    Par ThieBEN dans le forum IHM
    Réponses: 3
    Dernier message: 01/08/2007, 14h37
  3. Réponses: 6
    Dernier message: 12/01/2007, 14h33
  4. Réponses: 6
    Dernier message: 02/05/2006, 14h24
  5. Réponses: 7
    Dernier message: 02/02/2005, 08h04

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