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.
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!
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.