Wrap .Net ArrayList mit benutzerdefinierter VBA-Klasse get iterator

8

Ich habe gerade entdeckt, dass ich einige .NET-Klassen aus VBA mit der CreateObject-Methode erstellen kann, die COM-Klassen erstellen kann. Dies ist ziemlich cool, aber die erstellte Klasse ist spät gebunden, so dass Sie keine Intellisense usw. erhalten. Also, was ich zu tun hoffte, war VBA-Wrapper-Klassen zu schreiben und alle Methodenaufrufe an einen internen Verweis auf das .Net-Objekt zu delegieren. p>

Das funktioniert also gut für ein ArrayList-Objekt für alles außer für den Verweis auf den Enumerator. Es gibt einen Hack für VBA, mit dem Sie Ihre eigenen Sammlungen erstellen und die For Each-Syntax zum Aufzählen Ihrer Sammlungen verwenden können. Das Folgende ist ein Beispiel:

%Vor%

Die meisten Implementierungen enthalten einen Verweis auf ein VBA Collection-Objekt und übergeben den Enumerator für das Collection-Objekt. Aber da ich eine .Net ArrayList halte, möchte ich das weitergeben. Allerdings bekomme ich "Ungültige Prozedur Aufruf oder Argument", wenn ich es versuche.

Mein aktueller Versuch ist dies:

%Vor%

Ich bin mir ziemlich sicher, dass dies möglich ist, weil es möglich ist, die ArrayList-Sammlung ohne den Wrapper direkt zu durchlaufen. ZB

%Vor%

Ich kann ohne die For Each-Funktionalität leben, aber es wäre schön, wenn ich es zur Arbeit bringen könnte, besonders wenn es so aussieht, als wäre es fast da.

Bearbeiten: Es ist wahrscheinlich erwähnenswert, dass das Instanziieren einer ArrayList und das anschließende Aufrufen von GetEnumerator den gleichen Fehler auch außerhalb einer Wrapperklasse ergibt.

Weitere Bearbeitung: Beachten Sie, dass beim Versuch, eine Variable vom Typ IUnknown auf das Ergebnis der GetEnumerator-Methode zu setzen, immer noch derselbe Fehler auftritt.

%Vor%

Final Edit: Dank @ RegEdits Kommentaren unten konnte ich dies zum Laufen bringen und dachte, ich würde den Code hinzufügen:

%Vor%     
Rossco 30.08.2014, 09:19
quelle

1 Antwort

9

Wenn Sie

verwenden %Vor%

Sie deklarieren ein COM-Objekt. Aber COM implementiert IEnumerator als IEnumVARIANT , das IUnknown direkt erbt, und COM ist nicht glücklich, den Rückgabewert GetEnumerator in Object zu setzen. Stattdessen können Sie

verwenden %Vor%

BEARBEITEN: Beachten Sie, dass, obwohl ArrayList implementiert IEnumerable , es überlädt GetEnumerator mit einer Methode, die index und count übernimmt. Sie müssen also das Schlüsselwort Nothing in VBA verwenden, wenn Sie die Überladung ohne Parameter aufrufen möchten.

%Vor%

Sie können sehen, dass es funktioniert, denn wenn Sie Ihre ursprünglichen Codezeilen einfügen, fügen Sie zwei Elemente zur Liste hinzu und verwenden dann einen Aufruf wie

%Vor%

Sie erhalten jetzt einen neuen (erwarteten) Fehler, der Sie darüber informiert, dass Offset / Länge außerhalb der Grenzen liegen.

    
Reg Edit 30.08.2014, 11:09
quelle

Tags und Links