UTILISER CASE OF AVEC DES CHAINES

Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018 - 31 janv. 2004 à 14:44
craftsystem Messages postés 143 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 7 mars 2009 - 3 sept. 2007 à 00:31
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

craftsystem Messages postés 143 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 7 mars 2009
3 sept. 2007 à 00:31
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
14 mars 2007 à 11:51
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
3 mars 2005 à 20:33
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 7
4 janv. 2005 à 15:44
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 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
31 janv. 2004 à 14:44
Simple mais efficace;
efficace parceque simple!
Rejoignez-nous