- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道释放充满记录的 TList 的最佳方法。
我有以下记录:
type
TPkBill = record
PkBill: integer;
Constructor Create(c_PkBill: integer);
constructor TPkBill.Create(c_PkBill: integer);
begin
PkBill := c_PkBill;
end;
我创建列表并用记录填充它:
procedure TfrmProject.lvBillDblClick(Sender: TObject);
var
i, iCount: integer;
item: TListItem;
oPkBill: TPkBill;
lstPkBill: Tlist;
begin
iCount := 0;
lstPkBill:= TList.Create;
//if an item is selected in lv
if (lvBill.ItemIndex = -1) then begin exit; end
else
begin
//Loop through all items and get selected item
for i := 0 to lvBill.Items.Count - 1 do
begin
item := lvBill.Items.Item[i];
if(item.Selected = true)then
begin
//create new item
oPkBill := TPkBill.Create(StrToInt(lvBill.Items[i].Caption));
//add it to a list
lstPkBill.Add(TObject(oPkBill));
//add up
iCount := iCount +1;
end;
end;
//Now we have a list ok pkBill
if(iCount > 1)then //other stuff I do
end
我希望能够释放 TList 并释放记录。
这是我已经尝试过的:
for i := 0 to lstPkBill.Count - 1 do
begin
//TObject(TPkBill(lstPkBill[i])).Free; //Acces violation at adress..
//FreeMem(TPkBill(lstPkBill[i])); //Incompatible types
//FreeMem(TObject(lstPkBill[i])); //Incompatible types
end;
lstPkBill.Clear;
FreeAndNil(lstPkBill);
感谢您的帮助,不胜感激!
最佳答案
您已使用构造函数定义了一条记录。调用记录构造函数不会像类构造函数那样在堆上分配内存。您的 oPkBill
变量存在于堆栈中。调用 oPkBill := TPkBill.Create(...)
只是填充该变量的成员。然后,您将整个变量(仅包含一个 Integer 成员)类型转换为 TObject
指针。您实际上并未在堆上为列表项分配任何内存,因此无需释放它们。
我怀疑你实际上想做的事情更像是这样的:
type
PPkBill = ^TPkBill;
TPkBill = record
PkBill: integer;
Constructor Create(c_PkBill: integer);
end;
constructor TPkBill.Create(c_PkBill: integer);
begin
PkBill := c_PkBill;
end;
procedure TfrmProject.lvBillDblClick(Sender: TObject);
var
i: Integer;
item: TListItem;
oPkBill: PPkBill;
lstPkBill: TList;
begin
if lvBill.ItemIndex = -1 then Exit;
//an item is selected in lv
lstPkBill := TList.Create;
try
//Loop through all items and get selected items
for i := 0 to lvBill.Items.Count - 1 do
begin
item := lvBill.Items.Item[i];
if item.Selected then
begin
//create new item
New(oPkBill);
try
oPkBill^ := TPkBill.Create(StrToInt(lvBill.Items[i].Caption));
//add it to a list
lstPkBill.Add(oPkBill);
except
Dispose(oPkBill);
raise;
end;
end;
end;
//Now we have a list ok pkBill
if (lstPkBill.Count > 1) then
begin
//other stuff I do
end;
finally
for i := 0 to lstPkBill.Count - 1 do
Dispose(PPkBill(lstPkBill[i]));
lstPkBill.Free;
end;
end;
关于Delphi,如何在TList中释放记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189776/
假设我有多个对象存储在 TO1:TList 中,然后我创建多个 TO1 并将它们全部放在 TO2:TList 中。如何在 TO2 中的选定 TO1 中获取选定对象的值? 最佳答案 由于TList为您提
我想知道是否有任何安全的方法可以将 TList 元素复制到任何其他 TList 中特定的位置和特定的长度。我应该将 list1 的元素分配给 list2 还是有没有我不知道的功能可以更准确地处理? 感
我有一个 TList 类型的列表.我需要将其转换为 TList像这样: procedure mainForm.testCast; var listT: TList; listW: TList;
我有一个 TList。它包含相同类型的对象的集合。这些对象是 TPersistent 的后代,并且具有大约 50 个不同的已发布属性。 在我的应用程序中,用户可以对这些对象进行搜索,搜索结果显示在 T
我有一个智能指针的实现,并且我尝试在通用 TList 上实现它。 program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUt
我想声明一个通用记录类型,例如 TMyGenericRecord = record X: ; Y: ; end; 然后我想声明一个 TMyGenericRecord 的 TList,但似乎
我想在 Delphi XE5 中使用带有子列表的通用记录 TList: type TMyRecord=record Value1: Real; SubList: TList;
我在使用 TList 时遇到内存泄漏问题。我正在尝试通过填充的列表填充 Tlist 循环并使用数据。下面的代码只是填充列表的代码,而不是使用它。 private { Private Form Va
我有一个包含以下声明的 Delphi 移动应用程序: TWJInformationList = class(TList) 当我为任何移动设备(Android、iOS 设备 32 位、iOS 设备 64
我正在使用 Generics.Collections.TList 和 Sort 方法。它工作正常,但我想最后对空值或空值进行排序。按升序和降序排序。如何实现? 这是我的排序函数: function T
我的项目(在 Delphi 6 上运行!)需要一个内存分配列表(TMemoryAllocation),我将其存储在一个对象中,该对象还保存有关分配大小(FSize)以及分配是否正在使用或空闲(FUse
我正在尝试统计每个 ProductCode 在我的数据库中使用的次数。问题是,我不知道所有代码是什么(或者可能会添加更多代码)。 我假设我可以使用带有值对(productCode 和 count)的
代码大致如下所示,它会为创建的每个 TMyRecord 中的每个字符串实例泄漏内存。我想我必须访问每条记录并以某种方式释放它——这可以在不清除每个单独字符串的情况下完成吗? function TMyF
使用TList作为记录容器。在应用过程中,TList添加和删除大量记录。但在delete之后,属性capacity永远不会减少,内存也不会被释放。怎么解决这个问题呢?简单的代码示例: type T
我正在尝试了解 Delphi 中的泛型,但 TList 有一个非常基本的问题。 我已经成功创建了一个整数列表并用 1000 个奇数填充它。我想将列表中所有能被 3 整除的数字更改为 0。我想我可以做这
有人可以向我解释一下这是否可能吗,或者我完全误解了这个 Delphi 功能。 假设我有一个类,我创建了其中一些类,然后将它们添加到 ObjectList 中。通常我这样做: Type TMyClass
我创建了一个简单的类,将对象保存在通用列表中。我设法让它工作。但我不明白为什么这不起作用。 for Monster in MonsterList do begin Monster.
我在 Windows 10 中使用 Delphi 10.1 Berlin。 我有两条不同大小的记录。我编写了循环遍历两个 TList 的代码这些记录来测试耗时。循环遍历较大记录的列表运行速度要慢得多。
我在 Delphi 4 中有这段代码。我创建了 10 个 T_Charge 类型的对象(见下文),并将其添加到 TList 中,名为 myList。 T_Charge 类型引用了三个 T_Platte
关于通用TList的一切。我有这样的结构: Type TExtract = record Wheel: string; Extract: array [1..5] of Byte;
我是一名优秀的程序员,十分优秀!