Delphi在case語句中使用字串

2021-07-16 00:20:58 字數 4717 閱讀 6642

在 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...