葵花宝典中有这样的回答:
回答:
Delphi中的 CASE 语句限制只能用顺序的(ordinal)类型,以至于不能在其中直接使用字符串,这不能不说是个遗憾。
解决它的根本思想是将字符串列转化成可比较的顺序类型。最简单的方法是将这些字符串作为一个字符串数组,它们在数组中的索引即代表它们各自的顺序。
首先建立 CaseString 函数,用于获取某字符串在一个字符串数组中的顺序:
function CaseString (const s: string
const x: array of string): Integer
var i: Integer
begin
Result:= -1
// Default return parameter
for i:= Low (x) to High (x) do begin
if s = x then begin Result:= i
Exit
end
end
end
Low() 提供第一个数组成员(通常是0),High() 则返回最后一个。因为 CaseString 返回的是待查字符串在字符串数组中的位置,因此,它可以被直接用到 CASE 语句中:
search:= 'delphi3000'
case CaseString (search, ['delphi3000',
'delphipages',
'Torry's']) of
0: s:= 'Excellent!'
1: s:= 'Good source'
2: s:= 'Not bad!'
end
这里我介绍另一种使用 TStringList 的解决方法。
示例1:
var
SelectStrings: TStringList
...
{ Initialization }
SelectStrings := TStringList.Create
SelectStrings.Add('First')
(*1*)
SelectStrings.Add('Second')
(*2*)
SelectStrings.Add('Third')
(*3*)
...
{ Use it }
case SelectStrings.IndexOf(sPassedString) of (*4*)
0: //First
begin
<do something>
end
1: //Second
begin
<do something>
end
2: //Third
begin
<do something>
end
end
...
{ Finalization }
SelectStrings.Free
上面是大小写敏感的比较,如果要对大小写不敏感则改用下面的比较方法:
SelectStrings.Add(AnsiUpperCase('First'))
(*1*)
SelectStrings.Add(AnsiUpperCase('Second'))
(*2*)
SelectStrings.Add(AnsiUpperCase('Third'))
(*3*)
case SelectStrings.IndexOf(AnsiUpperCase(sPassedString)) of (*4*)
(注意:不要使用 UpperCase, 应使用 AnsiUpperCase, 否则你的程序将在国际化中工作不正常。)