【问题标题】:store variant value in object property of TStringList在 TStringList 的对象属性中存储变量值
【发布时间】:2010-12-10 19:55:22
【问题描述】:

我需要在TStringList 中存储一个变量值,到目前为止我尝试了这个

var
 list : TStringList;
 v   : OleVariant;

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

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

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

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

【问题讨论】:

  • 您真的需要 TStringList 的特殊功能,还是只需要一个字符串到 OleVariant 的映射?如果是后者,我建议使用TDictionary<string, OleVariant> 而不是 TStringList。它会为您省去很多麻烦。
  • 对不起梅森,但我使用的是 Delphi 2007,我更新了标签。我需要将名称和变量值存储在列表中,我知道我可以编写自己的类来执行此操作,但我更喜欢使用真正制作的解决方案。
  • 有了 D2010/XE,生活变得轻松多了,您可以使用通用集合类来处理这个问题引发的所有生命周期问题。
  • 我知道,但我的一些客户没有足够的钱向 EMB 支付 Delphi XE 的昂贵价格。

标签: delphi delphi-2007


【解决方案1】:

我认为唯一的方法是将你的变体包装在一个类中,并在字符串列表项的对象中放置对它的引用。您当然需要注意在释放字符串列表时正确释放包装器实例。使用最新的 Delphi 版本,可以通过使用字符串列表的“OwnsObjects”参数轻松完成。

【讨论】:

  • 嗯,这不是唯一的方法,但它可能是最简单的。
【解决方案2】:

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

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

【讨论】:

  • 投反对票是怎么回事?这将起作用,您只需执行此操作即可获取变体: ptr :POleVariant; ptr := POleVariant(a.Objects[0]);
  • 变体是托管类型,可以包含引用。这方面需要注意什么?
  • 我从来没有说过我的回答是最好的方法。我刚刚回答了这个问题。但是,我相信但没有尝试过,Delphi 正确管理引用
  • @Steve 如果您留在类型系统中,它只能处理引用。对 TObject 的显式强制转换会将您带出类型系统的领域。
  • -1。你给出了一个冒险的答案,但没有提到任何风险。例如,您没有提到 变量 需要在列表对象的生命周期内保持在范围内。你也没有提到如果你在循环中运行你的代码行会发生什么的任何预防措施。否决按钮附带的提示是“这个答案没用”。它没有说明正确性。尽管您关于如何在 TStringList 中存储 Variant 的答案是正确,但它没有有用,因为可能会出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2018-10-05
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2021-07-18
相关资源
最近更新 更多