枚举类型属于序数类型,但我们有时需要确定我们定义的枚举类型中的元素个数,也就是枚举类型的取值范围,但讨论这个问题的前提是“不要指定枚举元素的初始值”时才有意义。在 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;
没有评论:
发表评论