目前,我正在通过创建对象来添加对象,例如:

type
  TRecord = class
  private
    str: string;
    num: Integer;
  public
    constructor Create;
  end;

...

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
  rec: TRecord;
  Alist: TStringList;
begin
  Alist := TStringList.create;
  Alist.Clear;
  for i := 0 to 9 do
  begin
    rec := Trecord.Create; //create instance of class
    rec.str := 'rec' + IntToStr(i);
    rec.num := i * 2;
    Alist.AddObject(IntToStr(i), rec);
  end;
end;

这种方法正确还是效率低下?
还是可以不像使用记录那样通过创建对象来直接添加对象?
type
  PRec = ^TRec;
  TRec = record
    str: string;
    num: Integer;
  end;

...
var
  rec: TRec;
...

for i := 0 to 9 do
begin
  //how to write here to have a new record,
  //can i directly Create record in delphi 7 ?
  rec.str := 'rec' + IntToStr(i);
  rec.num := i*2;
  Alist.AddObject(IntToStr(i), ???); // how to write here?
end;

还是其他快速简便的方法?

我正在使用Delphi 7。

提前致谢。

最佳答案

您现在的操作方式很好。

将新记录添加到TStringList.Objects时,如果不分配内存就无法对记录进行处理,之后必须释放它。和现在一样,您类的感觉也很好。您必须先释放对象,然后再释放字符串列表。 (在较新的Delphi版本中,TStringList具有OwnsObjects属性,该属性将在释放字符串列表时为您自动释放它们,但不是在Delphi 7中。)

如果您确实想使用记录来执行此操作,则可以:

type
  PRec = ^TRec;
  TRec = record
    str: string;
    num: Integer;
  end;

var
  rec: PRec;
begin
  for i := 0 to 9 do
  begin
    System.New(Rec);
    rec.str := 'rec' + IntToStr(i);
    rec.num := i*2;
    Alist.AddObject(IntToStr(i), TObject(Rec)); // how to write here?
  end;
end;

在释放字符串列表之前,您需要使用System.Dispose(PRec(AList.Objects[i]))释放内存。就像我说的那样,您现在的操作方式实际上要容易得多。添加到字符串列表或从字符串列表中删除时,您不必进行类型转换。

顺便说一下,您不需要AList.Clear。由于您正在创建字符串列表,因此其中没有任何要删除的内容。

10-08 15:52