我在将 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);
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);