Delphi 的泛型容器如何管理内部对象的生命周期

PowerPDF for Delphi 12.3 全源码控件包(兼容Delphi 11+,含完整文档与示例) 简介:PowerPDF 是一款专为 Delphi 设计的高性能 PDF 处理第三方控件,支持 PDF 创建、编辑、转换与打印等核心功能。 阅读详情

概念

Delphi 的泛型容器  TDictionary<Key, Value> 里面的 Key 和 Value 可以是任何类型的数据。

比如:

MyDict: TDictionary<Integer, string>;

又或者:

MyDict: TDictionary<Integer, TPerson>
TPerson = class

  FMyName: string;

  FMyAge: Integer;

private

public

end;

问题

如果 Value 是一个对象,当容器内容被清理,或者容器本身被释放时,这个对象如何释放?

比如:

var
  APerson: TPerson;

begin
  APerson := TPerson.Create;
  APerson.FMyName := 'abcd';
  APerson.FMyAge := 25;

  MyDict.Add(APerson.FMyAge, APerson);
end;

解决方案之一

对于 TDicitonary 来说,它有一个事件:OnValueNotify

因此,对于上述代码,为它增加一个事件方法,代码如下:

var
  APerson: TPerson;

begin
  APerson := TPerson.Create;
  APerson.FMyName := 'abcd';
  APerson.FMyAge := 25;

  MyDict.Add(APerson.FMyAge, APerson);
  MyDict.OnValueNotify := Self.DoOnMaiHeaderListValueNotify;
end;


//------------
procedure TForm1.DoOnMaiHeaderListValueNotify(Sender: TObject;
  const Item: TPerson;
  Action: System.Generics.Collections.TCollectionNotification);
begin
  // TDictionary 当有 Item 加入或删除时触发这个事件方法。
  case Action of
    cnAdded: ;

    cnRemoved:
    begin
      Item.Free; //释放里面的对象。
    end;

    cnExtracted: ;
  end;
end;

上述代码中,我们增加了一个方法,把这个方法赋予 TDictionary 的 OnValueNotify 事件。

因此,当这个 TDictionary 内部的数据被移除时,会触发事件,调用到这个方法。我们在这个方法里面写代码:Item.Free 来释放对象。

解决方案之二

使用 TDictionary 稍微麻烦一点。有更简单的:TObjectDictionary;

看名字就知道,这个类和 TDictionary 功能类似,但它会自动管理内部的对象。

MyDict: TObjectDictionary<Integer, TPerson>;

MyDict := TObjectDictionary<string, TPerson>.Create([doOwnsValues]); //增加参数 doOwnsValues 就让它管理内部对象的生命周期。不需要再额外很其它的代码了。

这里的关键点就是它的构造函数的参数:

Create([doOwnsValues]);

结束

Delphi 的数据结构泛型类库 - DeCAL (含源码) Decal 的全称是 Delphi Container and Algorithm Library,也就是 Delphi 数据容器和算法类库。 我个人认为是目前我所发现的类结构建模建得很好的一个数据结构类库,性能也是相当突出。他的思想是来自Stepanov 和 Lee 的 C++ STL(Standard Template Library) 和 ObjectSpace’s JGL (Java Generic Library) 立即下载

相关推荐

解决LangChain4j报错HTTP/1.1 header parser received no bytes

当使用调用自己部署的大模型服务时报错: 报错信息如下:

weixin_44455388的博客 2336

淺談如何使用Delphi 2009的泛型容器類別

Delphi2009在Delphi程式語言方面加入了兩個主要的功能,一個是泛型程式設計(GenericsProgramming),另外一個就是匿名方法(Anonymous Method)。Delphi2009在Win32加入了泛型程式設計之後,Delphi程式語言便可以同時在Win32,.NET平台下使用泛型程式設計。由於Delphi2009在Delphi程式語言本身加入了泛型程式

编程资料收集与共享交流 833

modbus-esp8266库深度解析:工业级Modbus协议栈实现

Modbus是一种广泛应用于工业自动化领域的通用串行通信协议,其核心在于标准化的功能码、寄存器模型与帧结构设计。基于RTU、ASCII和TCP三种传输变体,Modbus协议通过主从架构实现设备间可靠数据交互,具备低开销、高兼容性与强实时性等技术价值。在边缘计算与工业物联网场景中,它被广泛用于PLC通信、传感器数据采集、HMI集成及远程固件升级(FOTA)等关键任务。针对ESP8266/ESP32等Wi-Fi微控制器平台,modbus-esp8266库提供了完整协议栈支持,涵盖多实例并发、回调驱动架构、零拷贝

weixin_42315569的博客 349

delphi 中由TObjectList对象Destroy引起内存释放的问题

delphi 环境 delphi XE7     今天在完善一个程序的时候,发现一个问题,有个功能重复打开就会触发内存释放错误。导致程序挂掉。以前是正常的,就是加了一个TObjectList变量。     我的功能是这样的点击一个菜单就弹出一个界面,如果反复的点击该菜单就会造成上面所述的错误。 以下是出错时的代码: Tposrecord=class private v_id

rznice的专栏 4116

华为P30/pro (ELE-AL00) 鸿蒙4.2降级 EMUI 9

分享

m0_52356707的博客 1万+

​苹果开发者账号推送证书配置详细指南​

推送证书的配置是iOS应用实现消息推送的核心步骤。通过生成证书、配置描述文件、集成到服务器三大环节,开发者可快速为App启用APNs服务。建议优先使用更灵活的APNs Auth Key替代传统证书,以减少维护成本。确保拥有有效的苹果开发者账号(个人/公司账号),年费已缴纳。

2327

delphi TObjectDictionary使用范例

delphi TObjectDictionary使用范例 运行时界面:

qq457565758的博客 2676

Python爬虫实战:研究Pandas,构建车质网各车型数据采集和分析系统

研究结果表明,通过网络爬虫技术可以有效地获取公开的汽车投诉数据,这些数据经过适当的清洗和处理后,可以揭示出丰富的汽车质量信息。)作为国内专业的汽车质量投诉受理平台,自 2010 年成立以来,已累计接收消费者投诉信息超过 200 万条,这些数据包含了车型、投诉时间、投诉问题、处理状态等多维度信息,具有极高的分析价值。:通过对车质网数据的分析,能够挖掘出有价值的汽车质量信息,为消费者购车提供参考,为汽车厂商改进产品质量和服务提供依据,同时也能为相关监管部门提供数据支持。

ylfhpy的博客 938

【delphi】常用语言特性:接口、匿名方法、泛型

Delphi 自第 7 版以来已经有了长足的进步,目前已经到了最新版本的Delphi 12.2。当然也包括其他语言特性,例如多态性。

sensor_WU 博客 1659

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3543

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

【S32K3 MCAL配置】-3.4-CANFD配置-接收特定的“经典CAN/CANFD标准帧”和“经典CAN/CANFD扩展帧”(基于MCAL+FreeRTOS)

「汽车电子助手」的博客 696

remove和delete区别

remove和delete区别

7411

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

淺談怎么样运用Delphi 2009地泛型容器類別

Delphi 2009在Delphi程式語言方面加入了兩個主要的功能,一個是泛型程式設計(GenericsProgramming),另外一個就是匿名方法(Anonymous Method)。Delphi2009在Win32加入了泛型程式設計之後,Delphi程式語言便可以同時在Win32,.NET平台下使用泛型程式設計。由於Delphi2009在Delphi程式語言本身加入了泛型程式設

lee576的专栏 1354

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

(原创)Delphi2009初体验 - 语言篇 - 体验泛型(一)

快速导航: 一、概述 二、体验TList<T> 三、体验TObjectList<T> 四、TList<T>和TObjectList<T>的区别 五、后记 一、概述 等了几百年,Delphi终于原生的支持泛型了。以前使用Delphi,泛型是不被支持的,但是可以用一些第三方库来实现间接的泛型容器支持。如HouSisong大虾编制的DGL...

weixin_30699465的博客 109

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

微信聊天记录导出完整指南:用 WeChatMsg 十分钟把记录永久存进硬盘

WeChatMsg 是一款免费开源的微信聊天记录导出工具,读取微信桌面版本地数据库,把对话存成 HTML、Word、CSV 三种文件落到你自己的硬盘,还能把一整年消息聚合成可视化报告。适合担心换手机丢记录的普通用户——三年前的对话,一次都没备过? [![WeChatMsg 微信聊天记录导出 数据报告可视化示例](https://raw.gitcode.com/GitHub_Trending/we

gitblog_00925的博客 1025

Elite Container DELPHI下的一个轻量级IoC对象容器

一、简介:  Elite Container是DELPHI下的一个轻量级IoC对象容器(IoC:Inverse of Control,反转控制)。它是参考了Java中的Spring框架(主要是配置文件的写法),并结合DELPHI的特点来构建的。相比Spring的对象容器,它提供的功能更为精简常用(如对象延迟创建、对象属性自动注入等),降低了学习的难度,并且提供了很多扩展点,你只需简单地写一个插件实...

weixin_34124939的博客 192
上一篇: 给 DBGridEh 增加勾选用的检查框 CheckBox
下一篇: DBGridEh 配合 ClientDataSet 做分页
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值