web-dev-qa-db-fra.com

Utilisation de l'instruction Case avec une chaîne

Dis que j'ai une chaîne

'SomeName'

et voulait que les valeurs retournent dans une déclaration de cas. Est-ce que ce bedone? Les chaînes peuvent-elles être utilisées dans une déclaration de cas comme ceci

Case 'SomeName' of

   'bobby' : 2;
   'tommy' :19;
   'somename' :4000;
else
   showmessage('Error');
end;
32
Glen Morse

Le Delphi Case Statement ne prend en charge que les types ordinaux. Vous ne pouvez donc pas utiliser directement des chaînes.

Mais il existe d'autres options comme

32
RRUZ

Dans la bibliothèque Jcl, vous avez la fonction StrIndex StrIndex(Index, Array Of String) qui fonctionne comme ceci:

Case StrIndex('SomeName', ['bobby', 'tommy', 'somename']) of 
  0: ..code.. ;//bobby
  1: ..code..;//tommy
  2: ..code..;//somename
else
  ShowMessage('error');
end.
35
Daniel

@ La réponse de Daniel m'a orienté dans la bonne direction, mais il m'a fallu un certain temps pour remarquer la partie "Bibliothèque Jcl" et les commentaires sur les versions standard.

Dans [au moins] XE2 et versions ultérieures, vous pouvez utiliser:

Case IndexStr('somename', ['bobby', 'tommy', 'somename', 'george']) of 
  0: ..code..;                   // bobby
  1: ..code..;                   // tommy
  2: ..code..;                   // somename
 -1: ShowMessage('Not Present'); // not present in array
else
  ShowMessage('Default Option'); // present, but not handled above
end;

Cette version est sensible à la casse, donc si le premier argument était 'SomeName', il faudrait le not present in array chemin. Utilisez IndexText pour une comparaison insensible à la casse.

Pour les anciennes versions de Delphi, utilisez AnsiIndexStr ou AnsiIndexText, respectivement.

Félicitations à @Daniel, @The_Fox et @afrazier pour la plupart des composants de cette réponse.

13
c32hedge

Fonctionne sur D7 et Delphi Seattle, utilise le système.

case AnsiIndexStr(tipo, ['E','R'] ) of 0: result := 'yes'; 1: result := 'no'; end;

3
keno