2013-01-25 3 views
30

Скажут у меня есть строкаИспользования саза с Последовательностью

'SomeName' 

и хотел значение вернуться в сазе. Может ли это быть? Может использоваться строки в сазе как так

Case 'SomeName' of 

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

кажется, что FreePascal (FPC) уже реализовали эту функцию языка, я хочу Delphi будет следить! [http://forum.lazarus.freepascal.org/index.php?topic=17983.0] –

ответ

31

Delphi Case Statement поддерживает только порядковые типы. Таким образом, вы не можете напрямую использовать строки.

Но существуют еще варианты, как

  • строить функцию, которая возвращает целое число (хэш), на основании строки
  • с использованием дженериков и анонимные методы (A generic case for strings)
  • используя функцию, которая возвращает массив (Making a case for Strings, the sane way)
  • и так далее.
+3

вы бы подумали по версии xe2, они добавили бы что-то .. –

31

В библиотеке JCL у вас есть функция StrIndex(Index, Array Of String) StrIndex, которая работает следующим образом:

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

Или просто используйте стандартную функцию AnsiIndexStr. –

+14

Или просто 'IndexStr' в более поздних версиях Delphi. (Существуют также версии '-Text', если вы хотите сравнивать без учета регистра.) – afrazier

8

@ ответ Дэниела указал мне в правильном направлении, но мне потребовалось некоторое время, чтобы заметить «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 для большинства компонентов этого ответа.

2

Работы по D7 и Delphi Сиэтле, использует system.Ansistring

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

Смежные вопросы