【发布时间】:2021-01-21 07:59:34
【问题描述】:
我正在为 SOAP 服务调用一个函数,其中一个必需参数是 TWideStringDynArray。如何初始化和填充这种类型的数组?或者还有其他方法可以将普通数组转换为这种类型吗?
这是它在 SOAP 类中的定义方式
...
ArrayOfString = TWideStringDynArray;
...
PrsDataGet = class(TRemotable)
private
FsRetVal: WideString;
FsInParam: ArrayOfString;
published
property sRetVal: WideString read FsRetVal write FsRetVal;
property sInParam: ArrayOfString read FsInParam write FsInParam;
end;
如果我将 FsInParam 设置为 WideString 数组,则表示类型不兼容
procedure TForm1.Button1Click(Sender: TObject);
var
QuotePrice : Real;
rezultat:WideString;
mnozica:array [0..4] of integer;
parametri: array of WideString;
obstaja:boolean;
PrsGet:PrsDataGet;
PrsFind:PrsDataGet;
begin
PrsGet.sRetVal :=rezultat;
SetLength(parametri, 4);
parametri[0]:= '1234';
parametri[1]:= 'wsprsinfotest';
parametri[2]:= 'efwefawf';
parametri[3]:= 'PRS_MN_P';
PrsGet.sInParam :=parametri;
如果我将parametri 的类型更改为ArrayOfString,它不会再抱怨不兼容的类型,但会在SetLength(parametri, 4); 引发访问冲突
编辑 重现问题:
我从https://wwwt.ajpes.si/wsPrsInfo/PrsInfo.asmx?WSDL将WSDL定义导入delphi
服务调用代码:
unit UnKlicServisa;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Rio, SoapHTTPClient,Types,
UnWsPrsInfo_1, UnWsPrsInfo_2;
type
TForm1 = class(TForm)
HTTPRIO1: THTTPRIO;
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
rezultat:WideString;
parametri: ArrayOfString;
obstaja:boolean;
PrsGet:PrsDataGet;
begin
PrsGet.sRetVal :=rezultat;
parametri[0]:= '1234';
parametri[1]:= 'wsprsinfotest';
parametri[2]:= '3423445';
parametri[3]:= 'PRS_MN_P';
PrsGet.sInParam :=parametri;
if Trim(Edit1.Text) <> '' then
begin
(HTTPRIO1 as PrsInfoSoap).PrsDataGet(PrsGet);
end
else
begin
MessageDlg('Enter a Valid ISBN code',mtInformation,[mbOk],0);
Edit1.SetFocus;
end;
end;
end.
【问题讨论】:
-
你应该可以在那里传递任何类型的宽字符串数组。
-
@500-InternalServerError 请检查我的帖子编辑。
-
访问冲突似乎不太合理。你能提供一个minimal reproducible example吗?
-
我们需要 SOAP 来重现吗?这个可以变小吗?
-
我是 delphi 新手,所以我不知道如何简化这个