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 :

Montant enregistré dans Edit qui double à la réouverture du programme ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut Montant enregistré dans Edit qui double à la réouverture du programme ?
    Bonsoir

    Je viens vous soumettre un problème que je n'arrive pas à résoudre.

    J'ai un Tedit avec un montant que j'ajoute à un autre Tedit en bas de fiche pour faire un total et que je sauvegarde dans un fichier ini. (voir image écran en pièces jointes)
    Si je coche le checkbox à coté du montant, je déclenche la procédure Check2.click (ci-dessous) qui elle même simule le click sur le bouton pour réactualiser d'autres calculs

    La procédure se fait bien sauf que si je ferme et réouvre le programme, le montant affiché dans à été multiplié par 2 ??
    J'ai beau retourner le problème dans tous les sens, je ne vois pas où ça cloche ...

    Pour info : l'edit qui contient le montant initial 39,90 se nomme Edmont1 et celui qui recoit le mauvais total 79,80 se nomme EdTampon

    Merci d'avance pour votre aide
    Cordialement
    Beauserge

    code pour checkbox
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    procedure TForm1.Check2Click(Sender: TObject);
    var
    EchTampon,AddEch:real;
    begin
    Ech1:=StrToFloat(Edmont1.text);
    Ech2:=StrToFloat(Edmont2.text);
    Ech3:=StrToFloat(Edmont3.text);
    Ech4:=StrToFloat(Edmont4.text);
    Ech5:=StrToFloat(Edmont5.text);
    Ech6:=StrToFloat(Edmont6.text);
    Ech7:=StrToFloat(Edmont7.text);
    Ech8:=StrToFloat(Edmont8.text);
    Ech9:=StrToFloat(Edmont9.text);
    Ech10:=StrToFloat(Edmont10.text);
    Ech11:=StrToFloat(Edmont11.text);
    Ech12:=StrToFloat(Edmont12.text);
    TotalEch:=Ech1+Ech2+Ech3+Ech4+Ech5+Ech6+Ech7+Ech8+Ech9+Ech10+Ech11+Ech12;
     
    if check2.checked then
       begin
        Edmont2.Color:=clsilver;
     
        EchTampon:=StrToFloat(EdTampon.text);
        AddEch:=EchTampon+Ech2;
        EdTampon.Text:=FloatToStr(AddEch);
        Edbudgetmois.text:=(Format('%8.2f',[TotalEch-AddEch]));
     
         SpdBtnbudgetClick(Self)
       end
          else
            if check2.checked=false then
              begin
               Edmont2.Color:=clwindow;
     
               EchTampon:=StrToFloat(EdTampon.text);
               AddEch:=EchTampon-Ech2;
               EdTampon.Text:=FloatToStr(AddEch);
               Edbudgetmois.text:=(Format('%8.2f',[TotalEch-AddEch]));
     
               SpdBtnbudgetClick(Self)  // simule click sur le bouton pour remettre à jour les totaux
            end;
    end;

    code pour autres calculs
    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
    // affiche ou cache le panel Estimation Budget
    procedure TForm1.SpdBtnbudgetClick(Sender: TObject);
    var
    Soldereel, Depmois, Diff:real;
    begin
        panelbudget.visible:=true; // on affiche le panel
     
       // code ci-après pour valider l'estimation trésorerie
      if Trim (Edbudgetmois.text) <>'' then // si vide alors rien ne se passe
         begin
      Edsoldereel.text:=Edsolde.text;  // le solde réel est égal au solde en cours
      Soldereel:=StrToFloat(Edsoldereel.text);
      Depmois:=StrToFloat(Edbudgetmois.text);
      Diff:=Soldereel-Depmois;  // calcul de la différence entre solde et budget
     
      Eddiff.text:=(Format('%8.2f',[Diff])); //  affichage de la différence entre solde et budget
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 869
    Points : 11 346
    Points
    11 346
    Billets dans le blog
    6
    Par défaut
    Je me demande si le Click sur une CkeckBox n'intervient pas avant que sa coche ne bascule, ce qui expliquerait pê le doublement quand tu testes if Checked.

    Après, tu calcules TotalEch qui ne sert pas ensuite et n'est pas déclaré dans la procédure (mais c'est pê un extrait de ton code). dans le else du if check2.checked, on a forcément check2.checked=false : pas la peine de retester.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Bonsoir Tourlourou

    Pour ce qui est de la variable TotalEch, elle est déclarée dans l'unité (avant implémentation) étant donné qu'elle revient dans plusieurs procédure, cela m'évite de la redéclarer x fois.

    Concernant le else du if check2.checked=false, j'ai rectifié -tu as raison) - merci

    Si quelqu'un pouvait me confirmer tes dires - à savoir "Je me demande si le Click sur une CkeckBox n'intervient pas avant que sa coche ne bascule, ce qui expliquerait pê le doublement quand tu testes if Checked"

    Cela étant dit, je ne comprends pas quand même car j'ai vérifié dans le fichier ini avant de relancer le programme et le montant enregistré est bon (39,90)
    mais quand je le réouvre, celui ci à doublé pourtant à aucun moment je ne clicke sur le checkbox pour redéclencher la procédure qui pourrait expliquer ce hic !!!

    Cordialement
    Beauserge

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    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 097
    Points : 41 092
    Points
    41 092
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pour moi ce code est beaucoup trop complexe et certainement largement simplifiable !

    AMHA On a à faire à une "calculatrice" plutôt simple, mais je me trompe peut-être à cause de la complexité de lecture du code
    en tout cas, je ferais deux fonctions de ce style (fait à la volée, hors EDI donc sans contrôle)

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    function TForm1.CalcTotal : real;
    // calcul montant total
    var i : word;
         AEdit : TEdit;
    begin
    result:=0.00;
    for i:=1 to 12 do
      begin
         AEdit:=FindComponent('edmont'+inttostr(i));
         if assigned(AEdit) then result:=result+StrToFloatDef(AEdit.text,0);
      end;  
    end;
     
    function TForm1.MontantCoches : real;
    // calcul montant coches (tampon ?)
    var i : word;
         AEdit : TEdit;
         ACb : TCheckBox;
    begin
    result:=0.00;
    for i:=1 to 12 do
      begin
         ACb:=FindComponent('check'+inttostr(i));   
         if Assigned(ACB) AND ACB.Checked then   // composant existe et est coché
          begin 
            AEdit:=FindComponent('edmont'+inttostr(i));
           if assigned(AEdit) then result:=result+StrToFloatDef(AEdit.text,0);
         end;
      end;  
    end;
    je n'ai pas trop compris ensuite ce qu'il faut faire, il semble à la fois y avoir
    • une partie Interface utilisateur (modifier la couleur du TEdit)
    • faire des calculs
    • Afficher un résultat


    une seul événement pourrait suffire pour toutes les cases à cocher, s'il s'agit bien de ça (je crains qu'il y ait dans le programme les mêmes procédures pour chaque
    checkbox !)

    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
    procedure TForm1.toutCheckClick(Sender: TObject);
    var c : string; // numéro du composant, utiliser le tag serait plus facile 
         AEdit : TEdit; // Edit associé
    begin
    c:=Copy(Sender.Name,6,Length(Sender.name)-6); // 6 : longueur de check+1
    AEdit:=Findcomponent('edmont'+c);
    if Assigned(AEdit) then 
      begin
         if TCheckBox(Sender).checked then AEdit.Color:=clsilver else AEdit.Color:=clWindow;  // voilà pour la partie UI avec les checkboxs
         // autres .....
      end;
      // il ne reste plus qu'à appeler les fonctions 
      // et faire ce qui semble se trouver dans le process du bouton (d'ailleurs, si ce n'est que ça pas besoin de bouton !)
      // affichage  
      Eddiff.text:=Format('%8.2f',[Calctotal-MontantCoches]);   
    end;

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Merci SergioMaster pour ton éclairage et tes propositions.
    Sans nul doute, mon code peut être simplifié et allégé ...

    J'ai pensé à une autre solution en remplaçant les cases à cocher par 2 boutons bien distinct (reliés à chaque Edit) et déclenchant ainsi les évènements de calculs et de changement de couleur de manière séparés évitant tout conflit et redondance....

    Sinon comme tu le sous entends, ce module avec les cases à cocher pour totaliser les Edit et ceux ci qui changent de couleur sont une partie du programme en effet.
    il y a d'autres calculs rattachés au fameux bouton (self) qui découlent d'une autre interface - et les 2 sont en partie reliés mais il est sans doute possible de mieux gérer cela.

    Bref, pour ce qui est de ton code j'ai testé mais j'obtiens des erreurs de types incompatibles et indicateur "name" non déclaré (voir image iointe)
    Peux tu m'aider à les solutionner ?


    Merci
    Beauserge

    Nom : erreur compilation code SergioMaster.jpg
Affichages : 275
Taille : 247,4 Ko

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    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 097
    Points : 41 092
    Points
    41 092
    Billets dans le blog
    62
    Par défaut
    Re,

    Comme je l'avais écrit, ça a été fait "à la volée"
    Corriger le problème est simple, il faut typer :

    ACb:=FindComponent('check'+inttostr(i)); devient ACb:=TCheckBox(FindComponent('check'+inttostr(i)));
    AEdit:=Findcomponent('edmont'+c); devient AEdit:=TEdit(Findcomponent('edmont'+c));

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Merci SergioMaster pour ton aide précieuse et toutes tes explications

    Je vais essayer d'adapter ton code à mon programme.

    Cordialement
    Beauserge

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/03/2009, 16h07
  2. Réponses: 2
    Dernier message: 20/02/2008, 12h24
  3. Réponses: 5
    Dernier message: 01/10/2007, 15h48
  4. Réponses: 2
    Dernier message: 17/08/2007, 09h54
  5. bouton qui ajoute un enregistrement dans une table
    Par petitours dans le forum Access
    Réponses: 1
    Dernier message: 06/12/2006, 13h33

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