gpt4 book ai didi

delphi - 我可以直接将记录添加为字符串列表中的对象吗?

转载 作者:行者123 更新时间:2023-12-03 14:59:38 25 4
gpt4 key购买 nike

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

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。由于您正在创建字符串列表,因此其中不能删除任何内容。

关于delphi - 我可以直接将记录添加为字符串列表中的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com