Delphi 11.3 32位转64位时Tag属性存对象引用的方案咨询
Delphi 32位转64位:Tag属性存储对象指针的方案选择
方案分析
方案2:修改指针转换方式
利用Delphi内置的NativeInt类型(32位下等价于Integer,64位下等价于Int64)替代原有Integer强制转换逻辑:
- 存储对象指针:
MenuItem.Tag := NativeInt(AField); - 读取对象指针:
AField := TcxDBPivotGridField(NativeInt(MenuItem.Tag));
该方案适配Delphi 11.3中Tag属性的位宽特性:32位平台下Tag为4字节整数,64位平台下为8字节整数,而NativeInt会自动匹配当前平台位宽,完美兼容Win32/Win64。
- 优点:改动量极小,仅需替换转换类型,无需调整原有代码结构,适配大量使用Tag的场景,无多线程环境下无额外风险。
- 缺点:仍存在Tag属性混用(整数与指针并存)的隐患,后续维护需注意区分不同用途的Tag赋值。
方案1:新增私有结构存储关联
在TDialoogDynRapport中添加私有字典(如TDictionary<TMenuItem, TcxDBPivotGridField>),专门存储控件与对象的关联关系,替代Tag的指针存储功能。
- 优点:类型安全,彻底避免Tag属性的混用问题,代码可读性更强,后续维护逻辑更清晰。
- 缺点:改动成本高,需替换所有原有用Tag存指针的代码逻辑,还要额外管理字典的生命周期(如窗体销毁时释放字典、处理控件销毁时的键值移除)。
推荐方案
如果现有代码中用Tag存储对象指针的场景较多,优先选择方案2——它以极低的改动成本实现了32/64位兼容,完全匹配你的需求场景。若追求极致类型安全且代码改动范围可控,再考虑方案1。
内容的提问来源于stack exchange,提问作者Jan Doggen
相关产品推荐
相关产品推荐

