法三:字符串轉為枚舉型
枚舉
//定義 type Colors = (Red, Yellow, Green, Cyan, Blue, Violet); Suit = (Club, Diamond, Heart, Spade);
//舉例: type Colors = (Red, Yellow, Green, Cyan, Blue, Violet); var C: Colors; begin C := Red; ShowMessage(IntToStr(Ord(C))); //0 C := Blue; ShowMessage(IntToStr(Ord(C))); //4C := Green; ShowMessage(IntToStr(Integer(C))); //2; 獲取元素位置用 Integer 也可以 end;
//舉例2: type Tabc = (a=5,b=10,c=a+b); var ta,tb,tc: Tabc; begin ta := a; tb := b; tc := c; ShowMessage(IntToStr(Ord(ta))); //5 ShowMessage(IntToStr(Ord(tb))); //10 ShowMessage(IntToStr(Ord(tc))); //15end;
//獲取枚舉元素總數: type TMyEnum = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday); var m: TMyEnum; num: Integer; begin num := 0; for m := Low(TMyEnum) to High(TMyEnum) do Inc(num); ShowMessage(IntToStr(num)); // 7 end;
//返回枚舉元素的字符串標識: uses TypInfo; //需要uses的單元type TMyEnum = (Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday); procedure TForm1.Button1Click(Sender: TObject); var str: string; begin str := TypInfo.GetEnumName(TypeInfo(TMyEnum),1); ShowMessage(str); //Tuesday end;
//獲取對象枚舉值的字符串表式: uses TypInfo; //需要uses的單元 procedure TForm1.FormCreate(Sender: TObject); var str: string; begin str := GetEnumProp(Self, ‘BorderStyle‘); ShowMessage(str); { bsSizeable } 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‘或中文等),則不能將其聲明為一個枚舉型,於是就不能使用這
個方法。如果是這樣你就只能使用前兩種方法了。極端的情況下,至少你還有第一
種方法可以使用 :-) 但在不少的場合,這種方法還是適用的。
法三:字符串轉為枚舉型