UTILISER CASE OF AVEC DES CHAINES

Signaler
Messages postés
285
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
11 février 2018
-
Messages postés
143
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
7 mars 2009
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/19844-utiliser-case-of-avec-des-chaines

Messages postés
143
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
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;
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.
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
7
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.
Messages postés
285
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
11 février 2018

Simple mais efficace;
efficace parceque simple!