【问题标题】:How to initalize and populate TWideStringDynArray in Pascal?如何在 Pascal 中初始化和填充 TWideStringDynArray?
【发布时间】: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 新手,所以我不知道如何简化这个

标签: delphi pascal


【解决方案1】:

注意 FPC 3.2.0+ 也允许数组构造函数

{$mode Delphi}
uses types;

var arr : TWideStringDynArray;

begin
  arr:=TWideStringDynArray.Create('1234','wsprsinfotest','efwefawf','PRS_MN_P');
end.

【讨论】:

  • 创建arr时会抛出错误:“需要对象或类类型。”
  • 它与股票 3.2.0+ 一起编译。但如前所述,这是 FPC 3.2.0+ 功能,因此请确保您的安装没有过时。在 Delphi 中,afaik 也是更高版本的功能。下次请在您的问题中指定编译器和版本
  • 如何查看我使用的 Pascal 版本。我使用Delphi 6编译代码。
  • Delphi 6 的信息已经足够了,但在提问时总是简单地提及这些细节。它使回答者更容易。不,D6 很古老,可能不支持这种语法。
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多