【发布时间】:2011-07-11 02:40:09
【问题描述】:
是否可以在记录中包含字符串列表? EG
TImportStats = record
ATotal:Integer;
BTotal:String;
AList:TStringist;
end;
如果我认为我需要在使用记录之前创建它?
【问题讨论】:
标签: delphi record tstringlist
是否可以在记录中包含字符串列表? EG
TImportStats = record
ATotal:Integer;
BTotal:String;
AList:TStringist;
end;
如果我认为我需要在使用记录之前创建它?
【问题讨论】:
标签: delphi record tstringlist
我知道这可能已经晚了,但解决您的问题的最优雅的方法是创建一个 TStringList 的子类,其中 ATotal 和 BTotal 作为其中的两个新元素。然后你可以简单地创建和销毁它,只要你认为合适。这个解决方案干净简单。
【讨论】:
如果字符串列表仅用于 TImportStats 记录的本地范围, 您可能想在 Code Central 中查看 StringList value implementation。
这避免了 try、create、finally、destroy 开销。
【讨论】:
虽然这是完全合法的,但寻找其他方法可能是明智的。你说的时候指出了问题:
我想我需要创建它 在使用记录之前
不仅如此,你还需要找到一个好的时机来摧毁它。如果您忘记这样做,则不会出现错误,但您的程序会泄漏内存。
如果记录是字符串列表的所有者,那么最好将它包含在一个类中。这样字符串列表的构造和销毁将遵循所有 Delphi 开发人员都熟悉的构造函数/析构函数模式。
如果记录不拥有字符串列表,但只是在字符串列表的生命周期内引用它,那么记录就可以了。但是,如果您这样做,请确保记录的生命周期包含在字符串列表的生命周期内,这样您就不会携带过时的引用。
【讨论】:
a和b是TImportStats类型的两条记录,那么a := b将使a和b指向相同的TStringList对象,所以对a.AList 的任何更改也会影响b.AList,反之亦然。此外,旧的AList 或a 将留在内存中,但无法访问它,因此存在内存泄漏(除非您在程序的其他位置存储了指向该对象的指针)。大卫当然知道这一点;我只是在向 OP 解释。
是的,这应该可以。在您创建字符串列表之前,AList 将(不可用)。因此,您可以在不创建 stringlist 的情况下使用记录的其他元素,但您必须在使用之前创建 stringlist 元素。此外,您有责任在完成后释放每个字符串列表。
【讨论】:
ImportStats: TImportStats 的声明位置。如果它是一个局部变量,@Sertac 是正确的——它将被“分配”但指向垃圾(当然,不会有 TStringList 对象)。另一方面,如果它是一个全局变量,在implementation 部分的某处声明,它将用零填充,即nil。
ATotal := 5,但您不能执行 AList.Add('alpha'),除非您首先通过 AList := TStringList.Create 创建对象。