Wie funktioniert diese for...in Schleife in Delphi
Bevor ich den Code für
COM Kollektionen erkläre werde ich zuerst aufklären, wie Delphi die
for...in...do Syntax für
Objekte unterstützt.
Als Beispiel nehme ich eine Stringliste, fühle diese mit ein paar Werten und lese diese dann einzeln in einer
for...in...do Schleife aus.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
Strings: TStringList;
begin
Strings := TStringList.Create;
try
Strings.Add('1');
Strings.Add('2');
Strings.Add('3');
for S in Strings do
ShowMessage(S);
finally
Strings.Free;
end;
end;
Der eigentlich interessante Teil ist folgender:
Delphi-Quellcode:
for S in Strings do
ShowMessage(S);
Wenn Delphi den Code kompiliert, dann werden diese zwei Zeilen ähnlich dem folgenden Code-Abschnitt umgesetzt:
Delphi-Quellcode:
StringEnum := Strings.GetEnumerator;
try
while StringEnum.MoveNext do
begin
S := StringEnum.Current;
ShowMessage(S);
end;
finally
StringEnum.Free;
end;
Als erstes holt Delphi sich ein Enumerator-Objekt heran, welches genutzt wird, um die Liste aller Strings zu durchlaufen. Solange das Enumerator-Objekt weitere Strings liefern kann, wird der jeweils aktuelle String der Variablen "S" zugewiesen und somit verfügbar gemacht.
Hinweis
Auf "S" kann innerhalb der for...in...do Schleife nur lesend zugegriffen werden. Gleiches gilt nicht, wenn man stattdessen obigen Code einsetzt.
Damit es nicht zu Speicherlöchern kommt, wird der Code von Delphi automatisch in einen
try...finally...end Block gesetzt. So wird das Enumerator-Objekt auch denn wieder freigegeben, wenn es innerhalb der Schleife zu einer Ausnahme (
Exception) kommt. Delphi gibt den Enumerator immer wieder explizit frei. Daher kann ein Enumerator auch nur für eine Schleife genutzt werden und muss für jede Schleife erneut bereitgestellt werden.