web-dev-qa-db-ja.com

文字列でのCaseステートメントの使用

文字列を持っていると言う

'SomeName'

そして、case文で値が返されることを望んでいました。この寝ることができますか?文字列は次のようにcase文で使用できますか

Case 'SomeName' of

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

Delphi Case Statement は順序型のみをサポートします。したがって、文字列を直接使用することはできません。

しかし、次のような別のオプションが存在します

32
RRUZ

Jclライブラリには、次のように機能するStrIndex関数StrIndex(Index, Array Of String)があります。

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

@Danielの答えは正しい方向を示してくれましたが、「Jclライブラリ」の部分と標準バージョンに関するコメントに気付くまでに少し時間がかかりました。

[少なくとも] XE2以降では、次を使用できます。

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;

このバージョンでは大文字と小文字が区別されるため、最初の引数が 'SomeName'の場合、not present in arrayパス。大文字と小文字を区別しない比較には、IndexTextを使用します。

古いDelphiバージョンの場合は、それぞれAnsiIndexStrまたはAnsiIndexTextを使用します。

この回答のほとんどのコンポーネントについて、@ Daniel、@ The_Fox、および@afrazierに称賛を送ります。

13
c32hedge

D7およびDelphi Seattleで動作し、system.Ansistringを使用します

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

3
keno