在TStringList对象属性中存储变量值

4
我需要在一个 TStringList 中存储一个变量值,目前我尝试了以下内容。
var
 list : TStringList;
 v   : OleVariant;

  List..AddObject('Item1',v);

或者

  List..AddObject('Item1',TObject(v));

但是在这两种情况下,代码都无法编译,因为类型转换无效或类型不兼容。

所以问题是,我如何将变量值存储在TStringList中?


你是否真的需要TStringList的特殊功能,还是只需要一个字符串到OleVariant映射?如果是后者,我建议使用TDictionary<string, OleVariant>代替TStringList。这将为您节省很多麻烦。 - Mason Wheeler
抱歉,Mason,但我正在使用Delphi 2007,我已更新标签。我需要在列表中存储名称和变量值,我知道我可以编写自己的类来实现这一点,但我更喜欢使用一个真正成熟的解决方案。 - Salvador
1
在使用D2010/XE时,您可以使用通用集合类来处理此问题引发的所有生命周期问题,这使得生活变得更加轻松。 - David Heffernan
我知道这一点,但我的一些客户没有足够的资金支付EMB昂贵的Delphi XE价格。 - Salvador
2个回答

8

我认为唯一的方法是将您的变量包装在一个类中,并将该类的引用放入字符串列表项的对象中。当释放字符串列表时,您需要确保包装实例被正确释放。使用最近版本的Delphi,可以通过使用字符串列表的“OwnsObjects”参数轻松完成此操作。


嗯,这不是唯一的方法,但可能是最简单的方法。 - Rob Kennedy

1

我相信你需要存储变量记录的地址:

List..AddObject('Item1',TObject(@v));

3
为什么会有人给踩?这个方法有效,你只需要执行以下操作即可找回变量:ptr :POleVariant; ptr := POleVariant(a.Objects[0]); - Steve
1
变量是管理类型,可以包含引用。谁来负责这方面的工作? - David Heffernan
我从未说过我的答案是做这件事的最佳方式。我只是回答了问题。然而,我相信,但尚未尝试,Delphi 正确地管理引用。 - Steve
@Steve 如果您在类型系统内部操作,它只能处理引用。将其显式转换为TObject会使您超出类型系统的范围。 - David Heffernan
3
你在没有提及任何风险的情况下给出了一个冒险的答案。例如,你没有提到变量需要在列表对象的生命周期内保持在作用域中。你也没有提到如果你在循环中运行你的代码会发生什么样的预防措施。与"反对投票"按钮相连的提示说:"这个回答没有用处",它没有提到正确性。虽然你如何将Variant存储在TStringList中的回答是正确的,但它并不有用,因为可能会出现许多问题。 - Rob Kennedy
@Rob:同意,我甚至可以说如果没有对可能出现的问题及其处理或避免方法进行至少一些处理,那么它是不正确的 - Mason Wheeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接