Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

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

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

  Alt 19. Dez 2004, 19:37
Einen Enumerator für COM Kollektionen anbieten


Als ich den Code für COM Kollektionen erstellt habe, habe ich mich gleichzeitig auf den Fakt gestützt, dass Delphi durch den try...finally...end Block sicherstellt, dass das Objekt auch wieder freigegeben wird.

Da man aber ein fertiges COM Objekt nicht einfach um die nötigen Methoden erweitern kann, habe ich einen kleinen Umweg eingelegt. Eine Hilfsfunktion namens GetCOMEnumerator() erstellt ein Objekt, welches die von Delphi verlangte Methode GetEnumerator() integriert. Dieses Objekt wird an die for...in...do Schleife übergeben. Die Methode GetEnumerator() liefert einfach das Objekt zurück, welches diese implementiert. Somit wird das am Ende auch wieder freigegeben und der Speicher wieder aufgeräumt.

Die interessanteste Methode des Objektes ist MoveNext:
Delphi-Quellcode:
function TComEnumerator.MoveNext: Boolean;
var
  OleCurrent: OleVariant;
  Fetched: Cardinal;
begin
  if FEnum <> nil then
  begin
    // fetch the next element from the collection list
    FEnum.Next(1, OleCurrent, Fetched);
    if Fetched = 1 then
    begin
      // another object was fetched
      FCurrent := OleCurrent;
      Result := True;
    end
    else
    begin
      // no more objects in enumaration
      Result := False;
    end;
  end
  else
  begin
    Result := False;
  end;
end;
Um den Enumerator jetzt einzubinden, muss man ihn wie folgend einbinden:
Delphi-Quellcode:
  // iterate all drives
  for Drive in GetCOMEnumerator(Drives._NewEnum) do
    // write the drive letter to the console
    WriteLn((Drive as IDrive).DriveLetter);
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat