【发布时间】:2009-10-21 12:45:47
【问题描述】:
我想遍历枚举中的项目。
我希望能够这样说:
type
TWeekdays = (wdMonday, wdTuesday, wdWednesday, wdThursday, wdFriday);
...
elementCount := GetElementCount(TypeInfo(TWeekDays));
for i := 0 to elementCount - 1 do begin
ShowMessage(GetEnumName(TypeInfo(TWeekdays),i));
end;
我能做到的最接近的是:
function MaxEnum(EnumInfo: PTypeInfo): integer;
const
c_MaxInt = 9999999;
var
i: integer;
s: string;
begin
//get # of enum elements by looping thru the names
//until we get to the end.
for i := 0 to c_MaxInt do begin
s := Trim(GetEnumName(EnumInfo,i));
if 0 = Length(s) then begin
Result := i-1;
Break;
end;
end;
end;
我是这样使用的:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i, nMax: integer;
begin
ListBox1.Clear;
nMax := MaxEnum(TypeInfo(TWeekdays));
for i := 0 to nMax do begin
ListBox1.Items.Add(GetEnumName(TypeInfo(TWeekdays),i));
end;
end;
这很好,除了我得到的列表看起来像这样(注意最后两项):
wdMonday
wdTuesday
wdWednesday
wdThursday
wdFriday
Unit1
'@'#0'ôÑE'#0#0#0#0#0#0#0#0#0#0#0#0#0 <more garbage characters>
最后的两个项目显然不是我想要的。
有没有更好的方法来遍历枚举类型的元素?
如果不是,那么可以安全地假设使用我当前的方法总是会有 两个 额外的项目吗?显然一个是单位名称......但是“@”符号在做什么?是真的垃圾,还是更多类型信息?
我使用的是 Delphi 2007。 感谢您提供任何见解。
【问题讨论】: