Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: for...in...do für COM Collections

  Alt 19. Dez 2004, 19:31
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.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat