小问题?(50分)

  • 主题发起人 主题发起人 轻音乐
  • 开始时间 开始时间

轻音乐

Unregistered / Unconfirmed
GUEST, unregistred user!
var
str:string;
begin
case str of
'a1' : .....;
'a2' :....;
end;
不知道这样行吗,有什么办法替代?
 
可以啊
没问题
 
string型的不可以用case结构,请用
if ... then
else if ... then
else if ... then
...
原因请参阅帮助
 
string 类型是不能用case地!
 
把常理写在一个TStringList里
然后用IndexOf可以解决这样的问题。^_^
 
或者用Pos函数
 
String类型可以用Case语句,但是应该这样写:

for i:=1 to length(s) do
begin
case s of
'a':
'b':
'c':
....
end;
end;
 
var
s: TStringList;
x: string;
begin
s := TStringList.Create;
s.Add('abc');
s.Add('acd');
s.Add('bcd');

x := 'bcd';
case s.IndexOf(x) of
0: // 'abc'
1: // 'acd'
2: // 'bcd'
else
end;

s.Free;
end;
 
这样用肯定是不可以的。
case of 结构一般用于有序索引的类型,比如integer,AnsiChar等等,不能用于像字符串
这样的无序类型。
我想你的意思应该是根据字符串的不同取值执行不同的操作。如果是这样的话,判断字符串
的长度或者判断某一位的取值是非常不够灵活的。你可以这样来执行你的判断分支:
var
str:string;
begin
if str='a1' then ...
else if str='a2' then ...
else if str='a3' the ...
else
...
end;
 
cosy:独树一帜
wlmmlw兄:比较有见解,好方法:)
我不想用if ,看看大家还有什么好办法
 
string型的不可以用case,但是,char型的可以。
 
大哥,不是吧!
STRING 是不能用case的!
建议用枚举型

type STR=(xxx,xxx....

...

case STR of
...
 
用if有时显得太乱,枚举形有不便于和string比较,所有还是wlmmlw的意见比较好,
谁还有更好的,在等一天后散分。
 
function aa(s:String):Integer;
begin
将wlmmlw的意见写在这,此函数返回s在TStringList的index。
end;

case aa(str) of
0:...
1:...
...
end;
 
葵花宝典中有这样的回答:
回答:
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, 否则你的程序将在国际化中工作不正常。)
 
多人接受答案了。
 

Similar threads

回复
0
查看
848
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
784
SUNSTONE的Delphi笔记
S
后退
顶部