Использование оператора Case со строкой
скажем, у меня есть строка
'SomeName'
и хотел, чтобы значения возвращались в оператор case. Это может быть сделать? Можно ли использовать строки в операторе case, например so
Case 'SomeName' of
'bobby' : 2;
'tommy' :19;
'somename' :4000;
else
showmessage('Error');
end;
4 ответов
Дельфи Case Statement
поддерживает только порядковые типы. Поэтому вы не можете использовать строки напрямую.
но существуют другие параметры, такие как
- создайте функцию, которая возвращает целое число (хэш) на основе строки
- использование generics и анонимные методы ( общий случай для строк)
- используя функцию, которая получает массив строк (создание случая для строк, здравомыслящих путь)
- и так далее.
в библиотеке 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;