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);