Chcę iterować po elementach w wyliczeniu.Powtarzanie elementów w wyliczeniu w Delphi
Chciałbym móc powiedzieć coś takiego:
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;
Najbliżej byłem w stanie przyjść to:
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;
którego używam tak:
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;
to działa dobrze, z wyjątkiem wymienionych dostaję wygląda następująco (zauważyć dwie ostatnie pozycje):
wdMonday
wdTuesday
wdWednesday
wdThursday
wdFriday
Unit1
'@'#0'ôÑE'#0#0#0#0#0#0#0#0#0#0#0#0#0 <more garbage characters>
Dwa elementy na końcu nie są oczywiście tym, czego chcę.
Czy istnieje lepszy sposób do iteracji elementów elementu wyliczonego?
Jeśli nie, to czy jest to bezpieczne założenie, że nie będzie zawsze być dokładnie dwa dodatkowe elementy używając mojego obecnego sposobu? Oczywiście jest to nazwa jednostki ... ale co robi symbol "@"? Czy to naprawdę śmieci, czy jest to więcej informacji o typie?
Używam Delphi 2007. Dzięki za wszelkie spostrzeżenia.
Ok, jestem idiotą. Próbowałem tego wcześniej, ale zostawiłem swój "el" jako liczbę całkowitą i nie zdałem sobie sprawy z mojego błędu. Dziękuję Ci. – JosephStyons
Nadal zastanawiam się, co znaczy "@". –
JosephStyons
MaxEnum prawdopodobnie jest błędny; zwracając więcej niż rzeczywistą liczbę wyliczeń. I GetEnumName używa tego błędnego wyniku do analizy wewnętrznych struktur w kodzie. Otrzymujesz losowe fragmenty pamięci poza strukturami wewnętrznymi. –