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 :

case avec string


Sujet :

Langage Delphi

  1. #1
    Membre actif
    case avec string
    bon soir
    ya t'il une fonction en delphi ressemble à la fonction selectcase de vb.
    car je veut que l'element de choix soit un string,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button2Click(Sender: TObject);
    var m :string;
    begin
    m:=edit1.Text;
    begin
    case  m of
     
    'janvier': showmessage('janvier');
    'fevrier': showmessage('fevrier');
     
    end;
    end;


    mais le message d'erreur "ordinal type required"

  2. #2
    Membre émérite
    salut;

    ben oui et voici ça syntaxe

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
         v :integer;
         m : string;
     
    case v of
       1 : m := 'Janvier';
       2 : m := 'Février'
       .
       .
       .  
     else 
       m := 'n''importe quoi ....'
    end;


    Tout ça est bien détailler dans l'aide, n'hésites pas à faire un tour "F1 très utile"
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre éprouvé
    Il n'y a pas de case avec string en Pascal... la variable doit être de type scalaire (entier, caractère, ensemble, etc.).

    Éventuellement tu peux utiliser des tableaux de chaînes et écrire une boucle.

  4. #4
    Membre émérite
    Très juste mais on peut toujours contourne le problème comme dans l'exemple que je viens de donner. L'important c'est dans la finalité de ce que l'on cherche.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Membre confirmé
    Voiulà une petite astuce pour ton pb
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    m:=edit1.Text;
    case  m[1] of
       'j','J': showmessage('janvier');
       'f','F': showmessage('fevrier');
       'm','M' :  case m[3] of
                        'r','R' : showmessage('Mars');
                        'i','I' : showmessag('Mai');
                     end;
     
     end;
    end;


    Je pense que tu résoudras sans problème le cas de janvier (juin, juillet), et de avril (aout).

    Je l'ai testé : ca fonctionne

    Bon code
    A+
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  6. #6
    Membre confirmé
    Voici une autre astuce:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case AnsiIndexStr(Edit1.Text, ['janvier', 'février', 'mars']) of
          0: showmessage('janvier');
          1: showmessage('février');
          2: showmessage('mars');
         -1: showmessage('J''sais pô');
       end;


    André
    Ils ne savaient pas que c'était impossible, alors ils l'ont fait !

  7. #7
    Expert confirmé
    salut

    tu peut aussi utilise un TStringList


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    case StrLst.indexOf(MonMois) of
          0: showmessage('janvier');
          1: showmessage('février');
          2: showmessage('mars');
         -1: showmessage('J''sais pô');
       end;


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Modérateur

    Bonjour,

    Tiens voiçi deux autres façons de faire un Case Of avec des String :

    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
    Comment faire un Case Of avec des String ? 
     
    auteur : sjrd 
    Etant donné que la structure Case Of requiert une donnée de type ordinal, il est impossible de faire un Case Of directement avec des String.
    L'astuce consiste à utiliser la fonction AnsiIndexStr de l'unité StrUtils : 
    uses StrUtils;
    ...
    case AnsiIndexStr(Str, ['Chaîne1', 'Chaîne2', 'Chaîne3']) of
      0 : // Str = 'Chaîne1'
      1 : // Str = 'Chaîne2'
      2 : // Str = 'Chaîne3'
      -1 : // Str ne vaut aucune de ces trois chaînes
    end;
     
     
    Si votre version de Delphi ne propose pas cette fonction, elle peut être implémentée comme suit : 
    function AnsiIndexStr(AText : string; const AValues : array of string) : integer;
    begin
      Result := 0;
      while Result <= High(AValues) do
        if AValues[Result] = AText then exit
        else inc(Result);
      Result := -1;
    end;
     
     
    Une autre idée, dans le cas d'un Case Of dynamique, est d'utiliser un objet de type TStrings et sa méthode IndexOf


    ... et voiçi une solution que j'ai récupérée un jour sur le site torry :

    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
    ...use Strings in Case statements? Ok marche	
    Author: RaverJK 	
     
    {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     
    CaseOfString: Diese Funktion ermöglicht es einem, einen case-Verteiler
    mit Strings zu realisieren.
     
    CaseOfString: This function enables you to realize a case block
    using strings.
     
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
     
    function CaseOfString(s: string; a: array of string): Integer;
    begin
    Result := 0;
    while (Result < Length(a)) and (a[Result] <> s) do
    Inc(Result);
    if a[Result] <> s then
    Result := -1;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    case CaseOfString(Edit1.Text, ['42', '23', 'nerd alert', 'hello world']) of
    0: Label1.Caption := 'What is six times nine?';
    1: Label1.Caption := 'Nichts ist, wie es scheint...';
    2: Label1.Caption := 'BATMAAAAAAAN!';
    3: Label1.Caption := 'Hello people.';
    else
    Label1.Caption := '?';
    end;
    end;


    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre actif
    remereciment aux camarades

    salus camarades ,je suis trés heureus de votres participations et votre proposotions .
    je passe mes salutation a tous les amis . c'est resolus