delphi 裡的 列舉

del88發表於2024-07-29

初始值隨機

若定義一個列舉,他初始化是隨機的,並不是第一個元素如:

image

所以若一個類包含了列舉型別,一定要給其賦值,否則就會亂套;

列舉不能為nil

image

列舉的零值 是隨機 數字,值型別,不是物件型別;

定義時指定數字值

//在這個例子中,`cRed` 的值是 1,`cGreen` 的值是 2,`cBlue` 的值是 4。注意,這些值不必是連續的
TColor2 = (cRed = 1, cGreen = 2, cBlue = 4); 

image

列舉與字串互轉

procedure TForm2.Button3Click(Sender: TObject);
var
  od: Integer;
  s: string;
  cl: TColor;
begin
  //獲取元素的序號
  cl := Red;
  memo1.Lines.Add(IntToStr(Ord(cl)));  //0
  cl := Blue;
  memo1.Lines.Add(IntToStr(Ord(cl)));  //3

  //列舉轉字串方式一(常用簡單), uses System.TypInfo
  memo1.Lines.Add(GetEnumName(TypeInfo(TColor), 2));//Green 知道列舉序號,一般不會使用這個
  memo1.Lines.Add(GetEnumName(TypeInfo(TColor), Ord(Blue)));//Blue 一般使用這個

  //列舉轉字串方式二(RTTI), uses System.Rtti
  memo1.Lines.Add(TValue.From<TColor>(Blue).ToString);//Blue

  //字串轉列舉,uses System.TypInfo
  s := 'Blue';
  od := GetEnumValue(TypeInfo(TColor), s); //3
  memo1.Lines.Add(od.ToString);
  cl := TColor(od);
  case cl of
    Red: memo1.Lines.Add('Red');
    Yellow: memo1.Lines.Add('Yellow');
    Green: memo1.Lines.Add('Green');
    Blue: memo1.Lines.Add('Blue');  //Blue
  end;
  //即字串轉列舉是: EColors(GetEnumValue(TypeInfo(EColors), s));
end;

image

相關文章