Utiliser case of avec des chaines

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 933 fois - Téléchargée 26 fois

Contenu du snippet

L'instruction Case Of ne fonctionne qu'avec une variable scalaire. Voici un moyen de l'utiliser avec des chaines.

-Créer une Form avec 1 bouton et 2 Edits (propriétés Text='').
-tapez le code suivant en réponse à l'événement Button1Click du Bouton:

Source / Exemple :


procedure TForm1.Button1Click(Sender: TObject);
var
  ListeDesCas : TStrings;

begin
  ListeDesCas := TstringList.create;

  try
    ListeDesCas.Add ('cas1');
    ListeDesCas.Add ('cas2');
    ListeDesCas.Add ('cas3');

    Case ListeDesCas.IndexOf(Edit1.Text) of
      0: Edit2.Text := 'Opération 1';
      1: Edit2.Text := 'Opération 2';
      2: Edit2.Text := 'Opération 3';
      else Edit2.Text := '';
    end;
  finally ListeDesCas.Free;
  end;
end;

Conclusion :


Dans Edit1, entrez "cas1" ou "cas2" ou "cas3"...
Cliquez le bouton.
Edit2 se mettra à jour en fonction de la chaine entrée dans Edit1.

Remarquez que, grâce à TStringList, le résultat est insensible à la casse de la chaine entrée.

Si vous en faites un usage intensif, vous avez tout intérêt à en faire une fonction. Par exemple, envoyer la chaine à traiter en paramètre, et en retour recevoir un entier. Ensuite utiliser Case Of normalement.

A voir également

Ajouter un commentaire

Commentaires

craftsystem
Messages postés
146
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
7 mars 2009
-
sa déchire sa me seras bien utiles pour mon prochain projet
dmapps
Messages postés
7
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
14 mars 2007
-
Bonjour,

certe avec du retard, j'apporte ma petite contribution à votre sujet... Voici comme il est également possible de procéder :

uses StrUtils;
...
const AListeDesCas : array [0..2] of string = ('Cas1', 'Cas2', 'Cas3');
...
case AnsiIndexStr(Str, AListeDesCas) of
0 : Resultat := 'Opération 1';
1 : Resultat := 'Opération 2';
2 : Resultat := 'Opération 3';
else Resultat := '';
end;

Il existe également la fonction AnsiIndexText qui est version de AnsiIndexStr non sensible à la case.

Dans le cas ou, dans votre version de Delphi vous n'avez pas accès aux fonctions AnsiIndexStr et AnsiIndexText, voici une façon de les coder :

function AnsiIndexStr(AText: string; const AValues: array of string): integer;
begin
Result := 0;
while (Result <= High(AValues)) do
begin
if (AnsiStrComp(PAnsiChar(AValues[Result]), PAnsiChar(AText)) = 0) then Exit
else Inc(Result);
end;
Result := -1;
end;

function AnsiIndexText(AText: string; const AValues: array of string): integer;
begin
Result := 0;
while (Result <= High(AValues)) do
begin
if (AnsiStrIComp(PAnsiChar(AValues[Result]), PAnsiChar(AText)) = 0) then Exit
else Inc(Result);
end;
Result := -1;
end;
aafi
Messages postés
24
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
12 janvier 2011
-
La formule de Caribensila est effectivement celle que j'utilise lorsque les valeurs à tester sont chargées depuis un fichier (genre fichier texte Ascii , ou INI )

mais lorsque les valeurs sont codées dans le programme, je préfère une formulation du style suivant
const MA_LISTE : '01Janvier 02Février 03Mars 04Avril 05Mai ...etc .. 12Décembre' ;

X := pos(Edit1.text , MA_LISTE) ;
if X >= 3 then begin
Y := StrToInt(copy(MY_LIST, X-2, 2)) ;
case Y of
1 : faire ceci
2 : faire cela ;
etc
end ;
end ;

Lorsqu'une telle routine doit être exécutée, non pas sur un Edit1 , mais sur un champ d'un fichier ayant 1 million de records, la performance est à mon avis N fois supérieure.
jmp77
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
4 -
Ca a l'air tellement simple quand on voit le code lol mais c'est tellement bien trouvé.
Bravo Caribensila.

Ca merite un joli 10/10.

Bonne prog,
JMP77.
Debiars
Messages postés
289
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
11 février 2018
-
Simple mais efficace;
efficace parceque simple!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.