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és24Date d'inscriptionmardi 8 février 2005StatutMembreDernière intervention12 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és1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 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és285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 31 janv. 2004 à 14:44
3 sept. 2007 à 00:31
14 mars 2007 à 11:51
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;
3 mars 2005 à 20:33
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.
4 janv. 2005 à 15:44
Bravo Caribensila.
Ca merite un joli 10/10.
Bonne prog,
JMP77.
31 janv. 2004 à 14:44
efficace parceque simple!