实例化类中的对象数组

T18*_*lot 2 arrays delphi class instantiation

我有一个项目需要使用预定义的类与远程Web服务进行通信.主类包含标准字段以及在不同类中定义的对象数组.实例化主类不会实例化较低级别的类,从而产生AV.下面的代码是问题的可执行示例,其中尝试在"ProductLines"数组中插入数据会产生错误.

问题是如何实例化数组对象?尝试构造函数,setlength()没有成功.任何指导多数赞赏.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Soap.InvokeRegistry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  ProductLine = class(TRemotable)
  private
    Description: string;
    Quantity: integer;
  end;

  ArrayOfProductLines = array of ProductLine;

  Customer = class(TRemotable)
  private
    Name: string;
    Comment: string;
    ProductLines: ArrayOfProductLines;
  end;

  // Customer Class
  //   Name
  //   Comment
  //   ProductLines (array)
  //             ProductLine
  //             ProductLine
  //             .....
var
  Form1: TForm1;
  TObj : Customer;     // Transfer object

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TObj.Name := 'Test Name;';
  TObj.Comment := 'Test Comment';


  TObj.ProductLines[0].Description := 'Test Description 1';    // fails 
  here, how to instantiate?
  TObj.ProductLines[0].Quantity := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TObj := Customer.Create;
  SetLength(Tobj.ProductLines,1);
end;

end.
Run Code Online (Sandbox Code Playgroud)

LU *_* RD 6

问题是如何实例化数组对象?

SetLength(TObj.ProductLines,1);
Run Code Online (Sandbox Code Playgroud)

该行创建数组中的第一个元素并将其初始化为nil.

要创建对象,只需执行以下操作:

TObj.ProductLines[0] := ProductLine.Create;
Run Code Online (Sandbox Code Playgroud)

请注意,ProductLines必须手动销毁数组中的每个实例化元素以避免内存泄漏.


关于命名约定的说明:

  • 对于一般的对象类型和类型,请使用大写字母T作为首字母.例TCustomer
  • 对于变量,请将大写字母T作为首字母.