Использование оператора Case со строкой

скажем, у меня есть строка

'SomeName'

и хотел, чтобы значения возвращались в оператор case. Это может быть сделать? Можно ли использовать строки в операторе case, например so

Case 'SomeName' of

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

4 ответов


Дельфи Case Statement поддерживает только порядковые типы. Поэтому вы не можете использовать строки напрямую.

но существуют другие параметры, такие как


в библиотеке 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.

ответ@Daniel указал мне в правильном направлении, но мне потребовалось некоторое время, чтобы заметить часть "JCL Library" и комментарии о стандартных версиях.

В [по крайней мере] 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 для большинства компонентов этого ответа.


работает на D7 и Delphi Seattle, использует систему.Ansistring

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