Я хочу перебирать элементы в перечислении.
Я хотел бы сказать что-то вроде этого:
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. Спасибо за любые идеи.