1. 程式人生 > >法三:字符串轉為枚舉型

法三:字符串轉為枚舉型

begin send diamond enum gpo arc red strong mon

枚舉

//定義
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)));  //4
C := 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)));  //15
end;

//獲取枚舉元素總數:
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‘或中文等),則不能將其聲明為一個枚舉型,於是就不能使用這
個方法。如果是這樣你就只能使用前兩種方法了。極端的情況下,至少你還有第一
種方法可以使用 :-) 但在不少的場合,這種方法還是適用的。

法三:字符串轉為枚舉型