delphi - 在 Delphi 中迭代枚举中的项目

标签 delphi enums

我想迭代枚举中的项目。

我希望能够这样说:

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, wdTuesday, wdWednesday, wdThursday, wdFriday);

procedure Test;
var
  el: TWeekdays;
begin
  for el := Low(TWeekdays) to High(TWeekdays) do
    ; //
end;

关于delphi - 在 Delphi 中迭代枚举中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1600575/

相关文章:

swift - 如何创建具有有限可能性的数据类型来打开其值?

c++ - 在C++中初始化一个大小不固定的数组

c# - 如何通过字符串或整数获取枚举值

typescript - TypeScript 中的数字枚举允许任何数字,而字符串枚举则不允许

Delphi:调整 ListView 列大小时的错误(在 DrawItem 上)

delphi - FireMonkey iOS TButton OnKeyUp 事件失败

delphi - TJpegImage : Internal bitmap not updated after applying JPEG compression

delphi - winapinameA 与 winapinameW - Unicode 与 Ansi - Delphi XE2

delphi - 如何让TWebBrowser像Internet Explorer一样使用ctrl+鼠标滚轮缩放?

java - 常规 Java 项目枚举的 JsonFormat 解决方案