Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 682

/ вопрос открыт /

Здравствуйте, эксперты!
Подсажите как создать динамический массив со сложным именем и вообще что не так делаю?
SetLength(api.patinf.inrancs.list,1)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, kem, Soap.InvokeRegistry, Vcl.StdCtrls, Soap.Rio, Soap.SOAPHTTPClient;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. HTTPRIO1: THTTPRIO;
  12. Button1: TButton;
  13. Edit1: TEdit;
  14. procedure Button1Click(Sender: TObject);
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20.  
  21. var
  22. Form1: TForm1;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.Button1Click(Sender: TObject);
  29. var
  30. api:AddPatInf;
  31. KPa:Integer;
  32. begin
  33. Application.ProcessMessages;
  34. HTTPRIO1.HTTPWebNode.ConnectTimeout := 1000 * 60 * 1;
  35. HTTPRIO1.HTTPWebNode.ReceiveTimeout := 1000 * 60 * 5;
  36. api:=AddPatInf.Create;
  37. api.code:='669';
  38. api.tnk:='6dcee';
  39. api.patinf:=patinf.Create;
  40. api.patinf.lnm:='0002422';
  41. api.patinf.fnm:='00004';
  42.  
  43. api.patinf.inrancs:=pat_inrancs_w.Create;
  44. api.patinf.inrancs.list:=pat_inrancs.Create();
  45.  
  46. api.patinf.inrancs.list[0].locode:=205;
  47. api.patinf.inrancs.list[0].lic:='0000001';
  48. api.patinf.inrancs.list[0].begindate:=TXSDate.Create;
  49. api.patinf.inrancs.list[0].begindate.AsDate:=StrToDate('01.01.2001');
  50.  
  51. KPa:=(HTTPRIO1 as rpnPortType).addPat(api);//function addPat(const PatInf: AddPatInf): Integer; stdcall;
  52. Edit1.Text:=IntToStr(KPa);
  53.  
  54. api.patinf.inrancs.list[0].begindate.Free;
  55. end;
  56.  
  57. end.


Примечание #1 (25 февраля 2018, 08:50):
Добавление данных
метод: addPat
Пример запроса:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:xmethods-delayed-quotes" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<urn:addPat soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<PatInf xsi:type="ris:AddPatInf" xmlns:ris="http://ris.kem.service">
<code xsi:type="xsd:string">669</code>
<tnk xsi:type="xsd:string">6dcee</tnk>
<patinf xsi:type="ris:patInf">
<lnm xsi:type="xsd:string">0002422</lnm>
<fnm xsi:type="xsd:string">00004</fnm>
<inrancs xsi:type="ris:pat_inrancs_w">
<list xsi:type="ris:pat_inrancs" soapenc:arrayType="ris:inranc[]">
<inranc>
<locode>205</locode>
<lic>0000001</lic>
<begindate>2001-01-01</begindate>
</inranc>
</list>
</inrancs>
</patinf>
</PatInf>
</urn:addPat>
</soapenv:Body>
</soapenv:Envelope>

Пример ответа об успешной передаче:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:xmethods-delayed-quotes" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:addPatResponse>
<Result xsi:type="xsd:int">9</Result>
</ns1:addPatResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Примечание #2 (25 февраля 2018, 22:47):
type
AddPatInf = class;
inranc = class;
pat_inrancs_w = class;
patInf = class;
pat_inrancs = array of inranc;

// ************************************************************************ //
// XML : AddPatInf, global, <complexType>
// Namespace : http://ris.kem.service
// ************************************************************************ //
AddPatInf = class(TRemotable)
private
Fcode: string;
Ftnk: string;
Fpatinf: patinf;
public
destructor Destroy; override;
published
property code: string read Fcode write Fcode;
property tnk: string read Ftnk write Ftnk;
property patinf: patinf read Fpatinf write Fpatinf;
end;

// ************************************************************************ //
// XML : inranc, global, <complexType>
// Namespace : http://ris.kem.service
// ************************************************************************ //
inranc = class(TRemotable)
private
Flocode: string;
Fsmo_localcode_Specified: boolean;
Flic: string;
Fbegindate: TXSDate;
procedure Setlocode(Index: Integer; const Astring: string);
function locode_Specified(Index: Integer): boolean;
procedure Setlic(Index: Integer; const Astring: string);
function lic_Specified(Index: Integer): boolean;
public
destructor Destroy; override;
published
property locode: string Index (IS_OPTN) read Flocode write Setlocode stored locode_Specified;
property lic: string Index (IS_OPTN) read Flic write Setlic stored lic_Specified;
property begindate: TXSDate read Fbegindate write Fbegindate;
end;

// ************************************************************************ //
// XML : pat_inrancs_w, global, <complexType>
// Namespace : http://ris.kem.service
// ************************************************************************ //
pat_inrancs_w = class(TRemotable)
private
Fforcewrite: Integer;
Fforcewrite_Specified: boolean;
Flist: pat_inrancs;
procedure Setforcewrite(Index: Integer; const AInteger: Integer);
function forcewrite_Specified(Index: Integer): boolean;
public
destructor Destroy; override;
published
property forcewrite: Integer Index (IS_OPTN) read Fforcewrite write Setforcewrite stored forcewrite_Specified;
property list: pat_inrancs read Flist write Flist;
end;

// ************************************************************************ //
// XML : patInf, global, <complexType>
// Namespace : http://ris.kem.service
// ************************************************************************ //
patInf = class(TRemotable)
private
Flnm: string;
Ffnm: string;
Finrancs: pat_inrancs_w;
Finrancs_Specified: boolean;
procedure Setinrancs(Index: Integer; const Apat_inrancs_w: pat_inrancs_w);
function inrancs_Specified(Index: Integer): boolean;
public
destructor Destroy; override;
published
property lnm: string read Flnm write Flnm;
property fnm: string read Ffnm write Ffnm;
property inrancs: pat_inrancs_w Index (IS_OPTN) read Finrancs write Setinrancs stored inrancs_Specified;
end;

function addPat(const PatInf: AddPatInf): Integer; stdcall;

Александр73Петров Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Александр73Петров (статус: Посетитель)
Вопрос отправлен: 25 февраля 2018, 08:44
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, Александр73Петров!
Сложность имени тут ни при чём. Давайте обратимся к описанию процедуры SetLength:

procedure SetLength(var S; NewLength: Integer);
Массив, размер которого задаётся, предаётся через нетипизированный параметр var S;. По опыту знаю, что если используется такой тип параметра, необходимо передать именно переменную или поле класса, но не свойство. Поэтому нужно установить размер динамического массива в переменой и только потом записать новое значение переменной в свойство.
var arr: pat_inrancs;
 
...
 
SetLength(arr, 1);
arr[0] := inranc.Create;
with arr[0] do begin 
  locode:=205;
  lic:='0000001';
  ...
end;
api.patinf.inrancs.list := arr;
Точно такие же трудности возникнут с другими процедурами содержащими нетипизированный параметр, например, Move, TStream.Read и т.п.

Удаление данных подобным образом:
var arr: pat_inrancs;
 
...
 
api.patinf.inrancs.list[0].Free;
SetLength(arr, 0);
api.patinf.inrancs.list := arr;

Ответ отправил: DNK (статус: Студент)
Время отправки: 29 марта 2018, 23:32
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 25 марта 2018, 00:37; участников в обсуждении: 2.
DNK

DNK (статус: Студент), 17 марта 2018, 22:51 [#1]:

Что если так?
var arr: pat_inrancs;
 
...
 
SetLength(arr, 1);
api.patinf.inrancs.list := arr;
"Digital Networked Knight"
Александр73Петров

Александр73Петров (статус: Посетитель), 25 марта 2018, 00:37 [#2]:

Спасибо всем!
Получилось вот так:
удалить
api.patinf.inrancs.list[0]:=inranc.Create;
добавить
var
 arr:pat_inrancs;
 lst:inranc;
...
...
 SetLength(arr,1);
 api.patinf.inrancs.list:=arr;
 lst.locode:=205;
 lst.lic:='0000001';
 lst.begindate:=TXSDate.Create;
 lst.begindate.AsDate:=StrToDate('01.01.2001');
 api.patinf.inrancs.list[0]:=lst;
Такой вариант почему-то работает только в debugging

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 11:32
Выполнено за 0.03 сек.