For-Schleife durch ein Set mit vordefinierten ordinalwerten

    For-Schleife durch ein Set mit vordefinierten ordinalwerten

    Hallo zusammen,

    ich stehe gerade auf dem Schlauch.
    Ich habe einen eigenen Datentyp erstellt und würde gerne diesen komplett durchlaufen und in einer Liste beispielsweise anzeigen.

    Delphi-Code

    1. Type = TMeinTyp = (Wert1 = 17, Wert2 = 18, Wert3 = 19, ExtraWert1 = 30, ExtraWert2 = 31);

    Dazu noch eine "Ausgabefunktion":

    Delphi-Code

    1. Function MeinTypToStr(const DerWert : TMeinTyp) : String;
    2. Begin
    3. case DerWert of
    4. Wert1 : Result := 'Wert1';
    5. Wert2 : Result := 'Wert2';
    6. Wert3 : Result := 'Wert3';
    7. ExtraWert1 : Result := 'ExtraWert1';
    8. ExtraWert2 : Result := 'ExtraWert2';
    9. else Result := '<<Fehler>>' // Da hat der Programmierer was vergessen!?
    10. End;

    Wenn ich den nun in der Schleife durchlaufen will:

    Delphi-Code

    1. for currDaten := Low(TMeinTyp) to High(TMeinTyp) do
    2. Begin
    3. Liste.Add(MeinTypToStr(currDaten));
    4. End;

    stehen in der Liste lustig viele "<<Fehler>>" für die ganzen Typen 20 bis 29. Irgendwo Logisch.

    Nun zu meiner Frage: Gibt es anstelle von "for currDaten := Low(TMeinTyp) to High(TMeinTyp) do" ein anderes Konstrukt,
    welches aber nur die gültigen Elemente durchläuft? Oder muss ich ganz doof abfangen "if Text <> '<<Fehler>>'"?

    MfG
    Incocnito
    Durch deine Initialisierung erhalten deine Aufzählungselemente neue Werte, die dann bei deiner For-Schleife wie du richtig erkannt hast zu den Fehlern führen.

    Mein Ansatz wäre hier folgender:

    Delphi-Code

    1. type
    2. TMeinTyp = (mtWert1, mtWert2, mtWert3, mtExtraWert1, mtExtraWert2);
    3. ...
    4. var
    5. MeinTypWerteArray = Array [Low(TMeinTyp)..High(TMeinTyp)] of integer;
    6. ...
    7. procedure MeinTypeWerteArrayZuweisen;
    8. begin
    9. MeinTypWerteArray[mtWert1] := 17;
    10. MeinTypWerteArray[mtWert2] := 18;
    11. MeinTypWerteArray[mtWert3] := 19;
    12. MeinTypWerteArray[mtExtraWert1] := 30;
    13. MeinTypWerteArray[mtExtraWert2] := 31;
    14. end;
    15. ...
    16. for currDaten := Low(TMeinTyp) to High(TMeinTyp) do
    17. Begin
    18. Liste.Add(IntToStr(MeinTypWerteArray[currDaten]));
    19. End;


    Ist ungetestet, probier's mal aus.

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Hmm..

    und noch kürzer ;)

    Delphi-Code

    1. type
    2. TMeinTyp = (mtWert1, mtWert2, mtWert3, mtExtraWert1, mtExtraWert2);
    3. const
    4. MeinTypWerteArray : Array [Low(TMeinTyp)..High(TMeinTyp)] of integer = (17,18,19,30,31);
    5. procedure TForm1.Button1Click(Sender: TObject);
    6. var
    7. currDaten : TMeinTyp;
    8. begin
    9. for currDaten := Low(TMeinTyp) to High(TMeinTyp) do
    10. Begin
    11. Memo1.Lines.Add(IntToStr(MeinTypWerteArray[currDaten]));
    12. End;
    13. end;


    Da der Type ja konstant ist, können auch die Werte Konstant sein..

    Außerdem würde es direkt ne Fehlermeldung geben, wenn der Type erweitert wird, jedoch nicht das Array ;)
    Hallo,

    das finde ich gut, dass Du das Thema als erledigt markierst.
    Das ist übrigens keine Schließung des Themas, sondern der Hinweis, dass eine zufriedenstellende Lösung für den TE gefunden wurde.
    Gruß Thomas

    Admin werden ist nicht schwer, sein ......
    Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.