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

Composants VCL Delphi Discussion :

Comment créer un compteur alphanumérique ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut Comment créer un compteur alphanumérique ?
    Bonjour à tous,
    J'ai un soucis qui semble simple mais que je n'arrive pas à coder...

    Il s'agit d'incrémenter un compteur alphanumérique (0...Z)
    - Ce compteur à une longueur déterminée par l'utilisateur (donc de longueur inconnue au départ).
    - Le compteur contient systématiquement le nombre de caractère défini par sa longueur : si on a un compteur de 3 caractères, le comptage sera 000, 001, ... 009, 00A ... 00Z, 010,011 ...//... ZZZ pour la dernière valeur.
    - Ce compteur peut déjà contenir une valeur, et il faut donc continuer le comptage à partir de la valeur présente.

    Je me suis dis que je pouvais partir d'un tableau déclaré en type puis variable
    comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type TbxAlphaNum = Array[0..35] Of String ;
    puis en variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TbxAlphaNum1:TbxAlphaNum=('0','1','2','3','4','5','6','7','8','9',
                                'a','b','c','d','e','f','g','h','i','j',
                                'k','l','m','n','o','p','q','r','s','t',
                                'u','v','w','x','y','z');
    Mais après ... je patauge dans la gestion du tableau
    Peut être que le tableau n'est pas la meilleure idée ...
    Si quelqu'un peut m'aider ...
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'ai eu un cas un peu similaire (c'était pour du découpage et renommage de fichiers). Mon compteur ne devait être qu'alphabétique (pas de caractères numériques) mais voici la solution que j'ai utilisée en l'adaptant un peu pour votre besoin.
    On a une Form avec un TEdit nommé edit1 qui contient le nombre à convertir, un TEdit nommé edit2 qui contiendra le résultat de la conversion et un TButton qui effectuera la conversion.
    Dans l'exemple, j'ai une variable tableau de type TStringList qui contient la liste des caractères admis pour notre compteur.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // Initialisation du tableau des caractères accéptés dans le compteur
      tableau := TStringList.Create;
      tableau.add('0');
      tableau.add('1');
      tableau.add('2');
      tableau.add('3');
      tableau.add('4');
      tableau.add('5');
      tableau.add('6');
      tableau.add('7');
      tableau.add('8');
      tableau.add('9');
      tableau.add('a');
      tableau.add('b');
      tableau.add('c');
      tableau.add('d');
      tableau.add('e');
      tableau.add('f');
      tableau.add('g');
      tableau.add('h');
      tableau.add('i');
      tableau.add('j');
      tableau.add('k');
      tableau.add('l');
      tableau.add('m');
      tableau.add('n');
      tableau.add('o');
      tableau.add('p');
      tableau.add('q');
      tableau.add('r');
      tableau.add('s');
      tableau.add('t');
      tableau.add('u');
      tableau.add('v');
      tableau.add('w');
      tableau.add('x');
      tableau.add('y');
      tableau.add('z');
     
      // On lance la conversion. Le second paramètre est arbitrairement à 5 car en fait c'est le nombre de caractères que vous souhaitez en sortie pour le compteur
      edit2.text := CalculerSuffixe(strtoint(edit1.text),5);
      tableau.Free;
    end;
     
    function TForm1.CalculerSuffixe(indice, nbCar : integer):string;
    var
      quotient, modulo, i : integer;
      resultat : string;
    begin
      resultat := '';
     
      // Au premier coup, on effectue les calculs avec le paramètre indice
      quotient := indice div tableau.Count;
      modulo :=  indice mod tableau.Count;
      // le modulo correspond à l'indice dans notre tableau du caractère qui sera renvoyé
      // la chaine resultat est construite de droite à gauche
      resultat := tableau[modulo];
     
      // Ensuite on fait les calculs avec les valeurs quotient et modulo trouvées à l'itération précédente
      for I := 1 to nbCar-1 do
      begin
        modulo :=  quotient mod tableau.Count;
        quotient := quotient div tableau.Count;
        resultat := tableau[modulo]+resultat;
      end;
     
      result := resultat;
    end;
    Je pense que ce bout de code correspond à ce que vous souhaitez faire.

    Ma fonction s'appelle CalculerSuffixe car je l'ai reprise d'un code existant gérant les suffixes des noms de fichiers... Je ne l'ai pas renommée.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    gbegreg, j'ai mis le code dans un nouveau projet simple (2 edit, 1 bouton)
    Mais ... je ne vois pas de compteur => quand je mets 1 dans Edit1, il ressort 00001 dans Edit2 ...
    Ou alors il y a quelque chose qui m'échappe ?

    Si je reprends mon cahier des charges :
    - Ce compteur à une longueur déterminée par l'utilisateur (donc de longueur inconnue au départ).
    - Le compteur contient systématiquement le nombre de caractère défini par sa longueur : si on a un compteur de 3 caractères, le comptage sera 000, 001, ... 009, 00A ... 00Z, 010,011 ...//... ZZZ pour la dernière valeur.
    - Ce compteur peut déjà contenir une valeur, et il faut donc continuer le comptage à partir de la valeur présente.
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    La fonction CalculerSuffixe convertit un entier en une chaine de caractères sur nbCar caractères.

    Ce compteur à une longueur déterminée par l'utilisateur (donc de longueur inconnue au départ).
    Donc c'est l'utilisateur qui le détermine : c'est pour cela qu'il y a le paramètre nbCar...

    si on a un compteur de 3 caractères, le comptage sera 000, 001, ... 009, 00A ... 00Z, 010,011 ...//... ZZZ pour la dernière valeur.
    CalculerSuffixe(0,3) retourne 000
    CalculerSuffixe(1,3) retourne 001
    CalculerSuffixe(2,3) retourne 002
    CalculerSuffixe(9,3) retourne 009
    CalculerSuffixe(10,3) retourne 00a
    CalculerSuffixe(35,3) retourne 00z
    CalculerSuffixe(36,3) retourne 010
    CalculerSuffixe(37,3) retourne 011
    CalculerSuffixe(46655,3) retourne zzz

    Tu gères en interne dans ton code un compteur de type entier et la fonction CalculerSuffixe te permet de convertir cet entier dans le format que tu souhaites en fonction de sa longueur (nbCar).

    Ce compteur peut déjà contenir une valeur, et il faut donc continuer le comptage à partir de la valeur présente.
    En gérant un compteur de type entier aucun problème.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    gbegreg, c'est tout simplement brillant!
    et gérer un nombre entier devient ainsi extrêmement facile ...
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    mêm si c'est résolu, pour le fun, autre version plus courte :

    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
    // Uses StrUtils
    { ======================================================================== }
    procedure TForm1.Button5Click(Sender: TObject);
    Var
      Nombre, Longueur, Base : Integer ;
    begin
      Nombre   := StrToIntdef(E_Nombre.Text  , 0) ;
      Base     := StrToIntdef(E_Base.Text    , 10) ;
      Longueur := StrToIntdef(E_Longueur.Text, 6) ;
      E_Resultat.Text:=DecToBase(Nombre, Longueur, Base);
    end;
    { ======================================================================== }
    Function TForm1.DecToBase(Decimal:LongInt; NbChiffres:Integer; Const Base:Byte): String;
      const Symboles: String = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    Var nom: String;
      a: Byte;
    begin
      Nom:= '';
      repeat a:=Decimal mod Base;
        Nom:=Symboles[a+1]+nom;
        Decimal := Decimal div Base;
      until(Decimal=0);
      Nom := RightStr(StringOfChar('0',NbChiffres) + Nom, NbChiffres );
      Result := Nom;
    end;
    { ======================================================================== }
    il faudrait blinder un peu :
    base <36
    NbChifres > nombre de chiffres du résultat brut

    A+
    Charly

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

Discussions similaires

  1. [AC-2010] Comment peut-on créer un compteur dans une Zone de texte
    Par CLASSIQUE dans le forum IHM
    Réponses: 20
    Dernier message: 30/05/2015, 19h13
  2. Comment utiliser une macro pour créer un compteur
    Par PetitChris dans le forum Macros Access
    Réponses: 8
    Dernier message: 12/12/2014, 03h21
  3. Comment créer un compteur numérique
    Par fmr130 dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2009, 13h20
  4. comment créer un compteur d'intervention ?
    Par Bouom771 dans le forum Access
    Réponses: 5
    Dernier message: 28/01/2007, 18h53
  5. Réponses: 5
    Dernier message: 29/09/2005, 14h37

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