2012年7月2日星期一

【转】Delphi 枚举类型元素个数的确定方法

  枚举类型属于序数类型,但我们有时需要确定我们定义的枚举类型中的元素个数,也就是枚举类型的取值范围,但讨论这个问题的前提是“不要指定枚举元素的初始值”时才有意义。在 Delphi 中有两种方法可以做到:

方法一:使用 RTTI

  利用 TypInfo 单元的 GetEnumName() 和 GetEnumValue() 可以遍历任意枚举类型,并获取其名称和值。如果枚举类型指定初始值,将不具备 RTTI 能力,所以不要指定初始值。

uses TypInfo;

procedure TForm1.BtnTestClick(Sender: TObject);
var
    p: PTypeData;
    i: Integer;
    s: String;
    pt: PTypeInfo;
begin
    ListBox1.Items.Clear;
    pt := TypeInfo(TWindowState);
    if pt.Kind <> tkEnumeration then begin
        ShowMessage('不是枚举类型');
        Exit;
    end;

    p := GetTypeData(TypeInfo(TWindowState));

    //将获取的枚举类型信息,以“枚举名 = 枚举值” 的形式加入到 ListBox 中
    ListBox1.Items.beginUpdate;
    try
        for i := p.MinValue to p.MaxValue do begin
            S := GetEnumName(pt,i);
            ListBox1.Items.Values[S] := IntToStr(GetEnumValue(pt, S));
        end;
    finally
        ListBox1.Items.EndUpdate;
    end;
end;

使用 RTTI,速度会慢一些,如果整个程序在运行过程中并不需要 RTTI,可以使用下面的方法。



方法二: 使用 Low(),High(),Ord() 系统函数。使用该方法依然不要指定枚举元素初始值。

type
    TEnum = (a,b,c);

const
    Min = Low(TEnum);
    Max = High(TEnum);

    Count = Ord(Max) + 1;

procedure TForm1.Button1Click(Sender: TObject);
var
    i,j: Integer;
begin
    i := Ord(Min);
    j := Ord(Max);

    ShowMessage(IntToStr(i) + ' ' + IntToStr(j) + ' ' + IntToStr(Count));
end;


摘自:http://apps.hi.baidu.com/share/detail/16452783

没有评论: