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 :

Supprimer les zéros à gauche du DecimalSeparator


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Supprimer les zéros à gauche du DecimalSeparator
    Bonjour à Tous

    Dans un premier temps, je tente de détecter le premier chiffre entré dans un Edit... :

    Je ne demande qu'à comprendre pour quelle raison cette méthode fonctionne impec dans une procédure "standard", mais pas en KeyPress ni en OnChange.

    Exemple qui plante direct en KeyPress :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
      var
        stt:string; // variable pour virer les zeros avant le point decimal...
      begin
        stt := Edit2.Text;            // variable chargée
        Label_Zero.Caption := stt[1]; // 1ere lettre dans ce Label
    end;
    (Je pense avoir - depuis le temps - compris que ça plante car le contenu de la variable est vide... mais pourquoi donc en KeyPress ?)



    Exemple qui ne plante pas, mais lors de l'appui sur la touche, l'affichage ne survient que lors de l'appui sur la seconde touche, snifff !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
     Label_Zero.Caption := stt;  // remarquez, j'ai viré le ==> [1]
    ...
    En fait, ce que je recherche, c'est la méthode de comment faire pour virer les zéros non significatifs à gauche du DecimalSeparator.

    Si ce n'était que de virer les zéros à la volée, cela aurait été trop facile.

    J'ajoute que pour ce cas précis, je ne souhaite pas utilser un Edit qui formate "tout seul" style CurrencyEdit.

    Merci de vos remarques et idées.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    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 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    le bout de code suivant annule la frappe d'un '0' comme premier caractère de l'Edit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure Edit2KeyPress(Sender: TObject; var Key: Char); 
    var
     i : integer;
    begin
     if (length(Edit2.Text) = 0)
     and (Key = '0')
     then Key:=#0;
    end;
    dans ton code, au KeyPress, tu gères l'événement clavier adressé à l'Edit, mais Key étant passé en var à la procédure, tu peux le modifier avant que l'Edit modifie sa propriété Text en réaction
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour tourlourou,

    Oki, oki je pige un mieux mieux.

    Pour ta méthode, très pratique ; mais si jamais l'utilisateur réalise sa saisie et... ensuite replace son curseur au début de l'Edit = les zéros sont de nouveaux ajoutés, snifff.

    Dans tous les cas, merci beaucoup de cette méthode très instructive.

    @+

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    je crois si mes souvenirs sont bon que ta premiere marchera si tu la met dans l'evenement onkeyUp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
      var 
        stt:string; // variable pour virer les zeros avant le point decimal... 
      begin 
        stt := Edit2.Text;            // variable chargée 
        Label_Zero.Caption := stt[1]; // 1ere lettre dans ce Label 
    end;
    quand tu teste ta chaine dans le onKeypress comme tu le fais , ta chaine n'est pas encore composer du caractere que tu presse.

    la solution consiste a controler si un point decimal existe , si non tu invalide tout les "0" comme le fait tourloututu

    Bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  5. #5
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir petitcoucou31 ,

    quand tu teste ta chaine dans le onKeypress comme tu le fais , ta chaine n'est pas encore composer du caractere que tu presse.
    Oki, oki, certainement pour cette raison que là, je viens de tester en affectant le résultat de mon Edit vers un MaskEdit limité à un seul caractère ; en effet ce n'est que lors de la seconde saisie que cette affectation se réalise !

    J'avais bien pensé mettre aussi mon code en procédure Edit2KeyUp, mais je me suis dit que ça allait être du même tonneau.

    Hé bien non !

    Tu as raison et je t'en remercie, super !

    Sauf un truc qui fait planter = lorsque l'utilisateur efface tout... le contenu de cet Edit.

    Sinon c'est ce que j'ai cherché depuis... plus que ça

    @+

  6. #6
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    De rien et en effet il faut aussi tester un champ vide ..

    bye et bon courage.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    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 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    ne pas oublier si tu veux être exhaustif de tester CarretPos par rapport à Pos(DecimalSeparator, Edit2.Text) et si sélection de texte, au cas où l'utilisateur sélectionne '.23' s'il y a '.2354' dans l'Edit et tape un zéro à la place !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,


    tourlourou écrivait :
    ne pas oublier si tu veux être exhaustif de tester CarretPos par rapport à Pos(DecimalSeparator, Edit2.Text) et si sélection de texte, au cas où l'utilisateur sélectionne '.23' s'il y a '.2354' dans l'Edit et tape un zéro à la place !
    Oui oui, c'est prévu ;o)


    petitcoucou31 écrivait :
    De rien et en effet il faut aussi tester un champ vide.
    Donc s'il est vide : le remplir avant que ça plante, non ?

    Ce soir je n'ai plus tellement les idées claires, demain je vais continuer et ensuite vous donner des nouvelles.


    Encore merci et @ +

  9. #9
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    en fait il faut que tu tienne comptes de toutes les manipulations qui peuvent etre faite par l'utilisateur sur ton Tedit et etre sur que çà marche a chaque fois ! champs vide , selection , les touche de suppression ....

    voila bye !
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  10. #10
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Avant d'aller au lit...

    petitcoucou31 écrivait :
    en fait il faut que tu tienne comptes de toutes les manipulations qui peuvent etre faite par l'utilisateur sur ton Tedit et etre sur que çà marche a chaque fois ! champs vide , selection , les touche de suppression ....
    Merci, oui, je pense que de ce côté ; c'est ok !


    Reste ce blème de zéros si en début de saisie, seulement ça.


    Je viens d'échanger le Edit contre un Memo afin d'avoir la propriété Lines

    (C'est inscrit Edit mais en réalité c'est un Memo... ;o)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Edit2Change(Sender: TObject);
    begin
        if not (Edit2.Lines.Count<>0) then
        ShowMessage('Oupssss, plantage en vue ! ;o))');
    end;
    Bon... ça plante plus, ouffff, car le ShowMessage évite le plantage, super technique hein ?

    En fait après le then je ne sais que mettre, si je place un chiffre dans le Edit/Memo de saisie afin de "boucher" le trou ; ce sera pas une solution.

    Bonne nuit à Tous.

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 856
    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 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    finalement, le plus simple est pê d'utiliser le KeyPress pour stocker Edit.Text dans une variable globale (état avant modification), et tester grâce à une fonction IsValide(Edit.Text) : Boolean la modification dans le OnChange pour revenir à la version antérieure si modification pas bonne !

    il est certainement beaucoup plus aisé d'écrire une fonction qui teste le format une fois la modif effectuée, que de prévoir tous les cas possibles ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    tourlourou tu as absolument raison, mais ne pas perdre de vue que je suis débutant en que j'aime bien apprendre en butant sur un blème afin d'en approfondir les causes et non de sauter cette épreuve

    Alors pour l'instant les fonctions, oupssss !

    J'explore comment éviter ce plantage si l'utilsateur efface l'Edit.

    Sinon le reste je peux m'en débrouiller.

    Je vais chercher précisement du côté de "museler" cette BoxInsulte lors de la détection du champ vide.

    Chacun ses possibilités ; si j'avais plus de temps à consacrer à Delphin ce serait l'idéal.

    Amicalement

  13. #13
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    resalut , JP , si çà te dit je peux te passer le source d'un tit composant que j'ai fais qui gere un tedit en notation diverse normale , reelle , scientifique qui a quelque bugg de design mais qui pourra te donner quelque idées ! si oui dit moi ou te l'envoyer pour apprendre ...

    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  14. #14
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re salut petitcoucou31,

    Tu es super sympa, merci beaucoup, mais là je risque encore à brúler des étapes et me retouver bloqué sur un problème tout "basic" mais j'apprécie beaucoup !


    Tiens..., là j'ai tenté de "museler" ce fichu message d'erreur sur la ligne capricieuse en question :
    Label_Zero.Caption := stt[1];

    En :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    {$I-}
    Label_Zero.Caption := stt[1];  // c'est ici que : si effacement du champ = plantage direct !
    {$I+}
    if IOResult<>0
    then
    MessageDlg('Bla, bla, bla...', mtError,[mbOK],0);
    ...
    Mais que dalle, toujours cette BoxInsulte

    J'avais pourtant lu que ces directives de compilations {$I-} et {$I+} étaient à même de neutraliser les messages d'erreurs si j'entoure la ligne de code qui fait planter sous certaines conditions (Champ vide Edit ) ?

    J'ai certainement mal lu ou rien compris du tout.

    Mais c'est en patinant dans la choucroute que l'on devient un bon cuistot, non ?

  15. #15
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    YAAAOOuuu !!!

    J'ai trouvé une parade :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    try
    Label_Zero.Caption := stt[1];     // 1ere lettre dans ce Label
    except
    //finally
    //ShowMessage('Oupssss, cela évite une BoxInsulte  ;o)');
    end;
    Aucun message d'erreur si je lance hors de l'EDI cet exe !

    Pas mal hein ?

    Oui je me doute ; pas très avancée comme manip, mais ça devrait me dépanner pour ensuite tester le premier chiffre de saisie = si c'est un zéro, alors remplacement par #0 !



    Merci de vos remarques et améliorations.

  16. #16
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Peut etre que cela t'aidera un peu..

    Une chaine peut etre consideré comme un tableau de x elements , ou chaques elements representent les caracteres qui compose ta chaine.

    Donc quand tu teste le caractere[1] de ta chaine , çà reviens a lire un element du tableau de caractere qui compose ta chaine , mais quand elle est vide , tu lis un element qui n'existe pas et donc tu plante.

    Il te suffit de tester que la chaine n'est pas vide et continuer ou pas ton process

    par exemple au debut de ta procedure de test :

    If edit1.text='' then exit ;


    il ne faut pas essayer de supprimer les message d'erreur , masi en trouver la source lol .
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  17. #17
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Une autre technique qui ne passe pas par les appuis sur les touches , mais par le Onchange du Tedit , ça a l'aventage de marcher pour toutes les action sur le tedit.

    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
     
    procedure TForm1.InibZero(chaine:string);
    var st:string;
        i:integer;
        recopie:boolean;
    begin
        st:='';
        recopie:=false;
        for i:=1 to length(chaine) do
        begin
            if (recopie=false) then
            begin
               if chaine[i]<>'0' then
               begin
                    st:=st+chaine[i];
                    recopie:=true;
               end;
            end
            else st:=st+chaine[i];
        end;
        edit1.Text:=st;
    end;
     
     
    procedure TForm1.Edit1Change(Sender: TObject);
    begin
          InibZero(edit1.Text);
    end;
    bye.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  18. #18
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Merci petitcoucou31,

    Je vais voir tout ça tranquillement, je reviendrai ici pour donner le des nouvelles

    Tiens... j'avais trouvé une méthode pas mal, mais lorsqu'un zéro était detecté tout à gauche du nombre, ça le virait, oupssss, enfin... ça virait tous les zéros, snifff !
    En OnChange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        // pour remplacer le zero pas "rien"... ?
    {St := Edit2.Text;//(Edit_Zero.Text);
    for X := 1 to Length(st) do
    if st[X] = '0' then st[X] := '';
    Edit2.Text := st;}
    Bref, à oublier, mais c'est en forgeant...
    Et en plus ça ajoutait un espace à la place des zéros.

    Oui tu as encore raison pour mon message d'erreur, pas le masquer, pas bien ça JP

    Merci, @+

  19. #19
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re petitcoucou31,

    Youpssssss... tu sais je vais en apprendre avec toi, rien que pour tester si un Edit est vide ou non. Moi fallait que je passe par un Memo pour avoir la propriété Lines.

    Sans parler de ta procédure procedure TForm1.InibZero(chaine:string) !

    Elle fonctionne nickel de chez béton !

    Je vais la décortiquer pour en tirer des futures applications. En effet elle fonctionne sans passer par le KeyPress, ce qui est super pratique.

    J'en suis bluffé.

    Je suis loin de ton niveau tu sais, mais je m'accroche, peut-être que dans dix ans...

    Merci et bravo pour toutes ces bonnes méthodes et bonne progr'

    Vive le forum !

  20. #20
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Mais non , mais non !! lol si çà peut te rassurer il y a un commencement a tous et on apprends tout les jours meme moi !!

    Aller bon courage.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

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

Discussions similaires

  1. Supprimer les zéros au début d'une chaine
    Par HULK dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/11/2012, 18h13
  2. [AC-2003] supprimer les zéros à gauche d'un champ texte
    Par Noirb dans le forum Access
    Réponses: 5
    Dernier message: 19/10/2009, 11h53
  3. Supprimer les zéro après la virgule
    Par Analfabete dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2007, 12h41
  4. Réponses: 3
    Dernier message: 26/03/2007, 09h46
  5. Réponses: 7
    Dernier message: 20/12/2006, 18h18

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