我在将 VBA 代码移植到 Lazarus 时遇到问题

I have a problem with porting VBA code to Lazarus

Sub ListaDokumentow()
On Error GoTo ErrHandler
    
    Dim oSubGT As InsERT.Subiekt
    Dim oListaDok As InsERT.SuDokumentyLista
    Dim oDok As InsERT.SuDokument
    Dim sNapis As String
        
    Set oSubGT = UruchomSubiekta()
     
 
    Set oListaDok = oSubGT.Dokumenty.Wybierz()
    oListaDok.FiltrTypOpcje = gtaFiltrSuDokumentOpcjeZam
    oListaDok.FiltrTyp = gtaFiltrSuDokumentZam
    oListaDok.FiltrOkres = gtaFiltrOkresNieokreslony
    oListaDok.MultiSelekcja = True
    
    oListaDok.Wyswietl
    
    sNapis = "Zaznaczono nastęujące dokumenty: " & vbCrLf
    
    For Each oDok In oListaDok.ZaznaczoneDokumenty
        sNapis = sNapis & oDok.NumerPelny & "ID:" & oDok.Identyfikator & vbCrLf
        
    Next
    
    MsgBox sNapis
    
    
    Exit Sub
ErrHandler:
    MsgBox "Wystąpił błąd: " & Err.Number & " - " & Err.Description
    
End Sub

我在VBA中写了这样一段代码,但是我无法将它转移到Lazarus,它是关于返回发票ID和发票编号

unit sm_testy;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, wps_u, LCLType,Comobj,variants,ActiveX;

type
  TOleCollectionEnumClass = class(TObject);
  TEkSmTesty = class(TForm)
  private

  public

  end;

var
  EkSmTesty: TEkSmTesty;

implementation

{$R *.lfm}


var
aSubGT,oSubGT:OleVariant;
oListGT,gtaFiltrOkresNieokreslony,gtaFiltrSuDokumentOpcjeZam,gtaFiltrSuDokumentZam:OleVariant;
oDok: OleVariant;
Reply, BoxStyle: Integer;

begin

BoxStyle := MB_ICONQUESTION + MB_YESNO;
//Reply := Application.MessageBox(PChar(IntToStr(PROG_VER_NUM_RC)),'Test', BoxStyle);

wpsConnect(oSubGT,true);

oListGT:=oSubGT.Dokumenty.Wybierz;
oListGT.FiltrTypOpcje:=15;
//oListGT.FiltrTyp:=gtaFiltrSuDokumentZam;
oListGT.FiltrOkres:=gtaFiltrOkresNieokreslony;
oListGT.MultiSelekcja:= True;
oListGT.Wyswietl;

end. // eof
                          

我停在显示“subiekt”的 window 与列表,我不知道如何枚举 oleVariant 对象

也许有人至少会引导我走上正确的道路

我无法枚举 Lazarus 中的 oDok 对象,我认为它应该是这样的

oDok:= CreateOleObject ('InsERT.SuDokument');

我在单独的实用程序单元中使用此代码:

Type
  TEatenType = {$ifdef fpc} {$ifdef ver3_0}pulong{$else}Ulong{$endif}{$else}Integer{$endif}; // type for eaten parameter MkParseDisplayName
  oEnumIterator = record
                      mainobj: OleVariant;
                      oEnum  : IEnumVariant;
                      IterItem : OleVariant;
                      IterVal  : LongWord;
                      function Enumerate(v:olevariant):oEnumIterator;
                      function GetEnumerator :oEnumIterator;
                      function MoveNext:Boolean;
                      property Current:OleVariant read iteritem;
                   end;


Implementation

{ oEnumIterator}

function oEnumIterator.getenumerator :oEnumIterator;
begin
 result:=self;
end;

Function oEnumIterator.Enumerate(v :olevariant):oEnumIterator;
begin
  mainobj:=v;
  oEnum  := IUnknown(mainobj._NewEnum) as IEnumVariant;
  result:=self;
end;

Function  oEnumIterator.MoveNext:boolean;
begin
  result:=(oEnum.Next(1, iteritem, iterval) = s_ok);
end;

然后枚举使用

var  oEnum            : oEnumIterator;
     colItem,
     colItems : Olevariant
 ..
 colitems:=objWMIService.ExecQuery('Select * from Win32_OperatingSystem');
 for colItem in oEnum.Enumerate(colItems) do  
         memo1.lines.add('Version: ',colitem.Version);