Delphi在case语句中使⽤字符串
在case语句中使⽤字符串
(**** 转载敬请注明-本⽂出处:南⼭古桃(nsgtao)的百度空间:hi.baidu/nsgtao/ ****)
在 case 语句中使⽤字符串 --- by 熊恒(beta)
我今天要介绍的是⼀个⽐较另类的⽅法。⼤家都知道,case 语句只能对顺序类型
(ordinal type)管⽤,那么我们先看⼀下顺序类型到底有那些呢:1)整型;2)字
符型;3)枚举型。
于是也就演化出三种在 case 语句⾥⾯使⽤字符串的⽅法(耐⼼看下去哦,最后⼀
种⽅法才是今天的重点:-p):
假如我们的具体应⽤如下(理想的,但是错误的写法):
str := 'Chongqing';
case str of // 编译器将在这⼀⾏制⽌你 :-(
'Beijing': ShowMessage('First');
'Tianjing': ShowMessage('Second');
'Shanghai': ShowMessage('Third');
'Chongqing': ShowMessage('Forth');
else ShowMessage('Other');
end;
(**** 转载敬请注明-本⽂出处:南⼭古桃(nsgtao)的百度空间:hi.baidu/nsgtao/ ****)
法⼀:字符串转为整型
这应该是⽐较通⾏的⽅法了,主要是利⽤ TStringList。先把备选的字符串挨个
Add 进去,然后调⽤其 IndexOf ⽅法。该⽅法返回⼀个整数,表⽰待字符串出
现在列表中的位置:
//var strList: TStringList;
strList := TStringList.Create;
strList.Add('Beijing');
strList.Add('Tianjing');
strList.Add('Shanghai');
strList.Add('Chongqing');
str := 'Chongqing';
case strList.IndexOf(str) of
0: ShowMessage('First');
1: ShowMessage('Second');
2: ShowMessage('Third');
3: ShowMessage('Forth');
else ShowMessage('Other');
end;
strList.Free;
可以看到,这是⽐较⿇烦的⽅法了,不过你可得记住这个⽅法,因为后⾯的讨论
将会讲到,这是最通⽤的⽅法。
另:当然,把字符串转化为整型后⽤于 case 不只这⼀种⽅法。另⼀种是通过把
备选项全部转化为等长度后合并为⼀个字符串,然后⽤ Pos 函数返回某字符串的
位置。在此不再累述,请查阅《程序员》杂志(具体哪⼀期不记得了:-()。
(**** 转载敬请注明-本⽂出处:南⼭古桃(nsgtao)的百度空间:hi.baidu/nsgtao/ ****)
法⼆:字符串转为字符型
这应该是最简单的⼀种⽅法,不过局限性⽐较⼤。如果你的备选项的第 N 个字
符(N 应为常数)都互不相同,那么你赚到了。这样,就可以通过取出这个字符,
来唯⼀标识你的字符串:
str := 'Chongqing';
case str[1] of // 第⼀个字符都不同,所以取出第⼀个进⾏⽐较
'B': ShowMessage('First');
'T': ShowMessage('Second');
'S': ShowMessage('Third');
'C': ShowMessage('Forth');
else ShowMessage('Other');
end;
不过如果你的备选项没有这样的特性,那么你就⽆缘使⽤这种⽅法了。
(**** 转载敬请注明-本⽂出处:南⼭古桃(nsgtao)的百度空间:hi.baidu/nsgtao/ ****)
法三:字符串转为枚举型
这种⽅法主要⽤到 RTTI 的特性。该⽅法的主要思路是,先把所有的备选项声名
为⼀个枚举类型的值,那么我们只要把要的字符串也转换为枚举型,那么就可以⽤ case 语句了。那么通过什么办法把⼀个字符串转化为枚举型呢?往下看:
// uses TypInfo; // 记得引⽤这个单元字符串函数怎么用
// type TMyStrSel = (Beijing, Tianjing, Shanghai, Chongqing);
// 注意,上⾯这个定义不能放在某个函数内部哦,那样的话,它就没有运⾏类信息了// var strSel: TMyStrSel;
str := 'Chongqing';
strSel := TMyStrSel(GetEnumValue(TypeInfo(TMyStrSel), str));
case strSel of
Beijing: ShowMessage('First');
Tianjing: ShowMessage('Second');
Shanghai: ShowMessage('Third');
Chongqing: ShowMessage('Forth');
else ShowMessage('Other');
end;
稍做解释:GetEnumValue 函数返回⼀个字符串对应的枚举型的值在某枚举类型
中的位置(要知道枚举类型是有顺序的,要不怎么叫顺序类型呢:-)),然后通过
⼀个强制类型转换将这个值转化为枚举型。于是就实现了把字符串转化为枚举型的操作。
可以看到,在 case 语句这⼀段,我们的使⽤和理想中的使⽤⽅法⼏乎是⼀样的!
毕竟枚举类型可以做到见名知意嘛。的确⽐⽤前两种⽅法看起来直观得多。
当然,这并不是万能的⽅法,如果你的备选项有⼀个不符合 Delphi 的变量名命
名法则(如'AK-47'或中⽂等),则不能将其声明为⼀个枚举型,于是就不能使⽤这个⽅法。如果是这样你就只能使⽤前两种⽅法了。极端的情况下,⾄少你还有第⼀种⽅法可以使⽤ :-) 但在不少的场合,这种⽅法还是适⽤的。
Case 语句中使⽤字符串
作者:
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[i] then begin Result:= i; Exit; end;
end;
end;
search:= 'delphi3000';
case CaseString (search, ['delphi3000',
'delphipages',
'Torry's']) of
0: s:= 'Excellent!';
1: s:= 'Good source';
2: s:= 'Not bad!';
end;
/////////////////////////////////
const MatchingStrings = '*First*Second*Third*';
var sString: string;
...
// sString has the data you want to test
case pos('*'+sString+'*',MatchingStrings) of
1:    // This is the match for 'First'
7:    // This is the match for 'Second'
14:  // This is the match for 'Third'
else // In this case there were no matches
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
grp1: TGroupBox;
rb1: TRadioButton;
rb2: TRadioButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type TASK=(blue,green,black,white,maroon);
var
Form1: TForm1;
const
Taskzhaowang:TASK=blue;
Taskneizheng:TASK=green;
implementation
{$R *.dfm}
procedure asdf(t:task) ;
begin
case t of
blue:
ShowMessage('ZhaoWang:'+inttostr(Ord(t)));
green:
ShowMessage('NeiZhneg:'+inttostr(Ord(t)));
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if(rb1.Checked) then asdf(Taskzhaowang);
if(rb2.Checked) then asdf(Taskneizheng);
end;
end.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。