在 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;
法一:字串轉為整型
這應該是比較通行的方法了,主要是利用 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 函式返回某字串的
位置。在此不再累述,請查閱《程式設計師》雜誌(具體哪一期不記得了:-()。
法二:字串轉為字元型
這應該是最簡單的一種方法,不過侷限性比較大。如果你的備選項的第 n 個字
符(n 應為常數)都互不相同,那麼你賺到了。這樣,就可以通過取出這個字元,
來唯一標識你的字串:
str := 'chongqing';
case str[1] of // 第乙個字元都不同,所以取出第乙個進行比較
'b': showmessage('first');
't': showmessage('second');
's': showmessage('third');
'c': showmessage('forth');
else showmessage('other');
end;
不過如果你的備選項沒有這樣的特性,那麼你就無緣使用這種方法了。
法三:字串轉為列舉型
這種方法主要用到 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'或中文等),則不能將其宣告為乙個列舉型,於是就不能使用這
個方法。如果是這樣你就只能使用前兩種方法了。極端的情況下,至少你還有第一
種方法可以使用 :-) 但在不少的場合,這種方法還是適用的。
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;
inte***ce
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
public
end;
type task=(blue,green,black,white,maroon);
varform1: tform1;
const
taskzhaowang:task=blue;
taskneizheng:task=green;
implementation
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.
用列舉方法 在case 語句中使用字元
首先引用typinfo單元 type tcommandenum aa,bb,cc,dd,ee,ff,gg,hh procedure tcommandprocess.processcmd chn byte cmd,s string var cmdenum tcommandenum begin cmde...
關於在case語句中變數的定義
case語句中宣告變數的各種情況分析 1,switch ch 這個是錯誤的,編譯器不會讓他通過編譯,理由是這樣的 int a 0 這個定義放在了case a 中,如果允許它順利通過編譯,會造成 不一致 考慮西面兩種情況 1 ch a 執行case a 分支,a順利的被初始化為0,執行完case a ...
在case語句中定義變數的問題
cpp view plain copy switch n 編譯器會報錯 cpp view plain copy 錯誤 跳過了 inti 的初始化 如果我們這樣寫 在變數定義的地方加上 cpp view plain copy switch n break case 2 break case 3 bre...