我想迭代枚举中的项目.
我想说可以这样说:
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.
感谢任何见解.
解决方法
简单:
type TWeekdays = (wdMonday,wdFriday); procedure Test; var el: TWeekdays; begin for el := Low(TWeekdays) to High(TWeekdays) do ; // end;