IEnumerable<T> bzw. TEnumerable<T> dürfte sein, was du suchst
Muß nicht unbedingt sein ... kann man auch selber machen.
Sooo große Hexerei steckt da nicht dahinter.
Die Klasse oder der Record, welche für For-In genutzt werden soll muß nur eine Public-Funktion Namens "GetEnumerator" besitzen, welche dann von Delphi aufgerufen wird.
Delphi-Quellcode:
TMeinListenTyp = class/record
...
Function GetEnumerator: TMeinEnumerator;
end;
TMeinListenTyp ist quasi eine Liste/Array mit vielen TMeinTyp drinnen.
Und die Klasse TMeinEnumerator muß diese Funktionen und Property beinhalten:
Delphi-Quellcode:
TMeinEnumerator = Class
Constructor Create(Const List: TMeinListenTyp);
Function GetCurrent: TMeinTyp;
Function MoveNext: Boolean;
Property Current: TMeinTyp Read GetCurrent;
End;
Delphi-Quellcode:
var
x: TMeinTyp;
List: TMeinListenTyp;
for x in List do ...
Ach ja, TMeinEnumerator und TMeinListenTyp können auch ein und die selbe Klasse sein, mit überladenen Konstructoren für die normale Erstellung und die Erstellung des Enumerators.
Delphi-Quellcode:
TMeinListenTyp = Pecord
Private
FList: array of TMeinTyp;
FEnumIndex: Integer;
Public
Constructor Create; overload;
...
Function GetEnumerator: TMeinListenTyp;
Constructor Create(List: TMeinListenTyp); overload;
Function GetCurrent: TMeinTyp;
Function MoveNext: Boolean;
Property Current: TMeinTyp Read GetCurrent;
End;
Constructor TMeinListenTyp.Create(List: TMeinListenTyp);
Begin
FList := List.FList; // Werte speichern oder einfach nur eine Referenz auf List merken und dann darüber auf die Liste zugreifen
FEnumIndex := -1;
End;
Function TMeinListenTyp.GetCurrent: TMeinTyp;
Begin
Result := FList[FEnumIndex];
End;
Function TMeinListenTyp.MoveNext: Boolean;
Begin
Result := FEnumIndex < Length(FList);
If Result Then Inc(FEnumIndex);
End;