Я хочу перебирать элементы в перечислении.Итерации через элементы в перечислении в Delphi
Я хотел бы быть в состоянии сказать что-то вроде этого:
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. Спасибо за любые идеи.
Хорошо, я идиот. Я пробовал это раньше, но я оставил свой «el» как целое число и не осознал свою ошибку. Спасибо. – JosephStyons
Мне все еще интересно, что означает «@». –
JosephStyons
MaxEnum, вероятно, глючит; возвращая больше, чем фактическое количество перечислений. И GetEnumName использует этот ошибочный результат для анализа внутренних структур в вашем коде. То, что вы получаете, это случайные фрагменты памяти за пределами внутренних структур. –