当前位置:  开发笔记 > 程序员 > 正文

为什么Delphi变体不能保存对象?

如何解决《为什么Delphi变体不能保存对象?》经验,为你挑选了3个好方法。

为什么Delphi变体不能保存对象?更重要的是,这种限制背后的原因是什么?



1> gabr..:

您绝对可以对象存储在Variant变量中 - 只需将其转换为NativeUInt即可.无论如何,对象只是一个指针.

obj := TObject.Create;
v := NativeUInt(obj);
obj := TSomeObject(NativeUInt(v));



2> angry person..:

根据我对变体能做什么和不能做什么的经验,这只是一个意见.

如果将COM对象放入其中,它将作为IDispatch引用存储,因此您在此对象上访问的任何方法调用或属性都将转换为查找方法/属性的内部DISPID的一些代码,即数组将构造带有方法参数的方法,并通过IDispatch接口调用该方法.

换句话说,IDispatch是按照您通常必须的方式为您处理的,但它是由编译器自动完成的.

但是,对于普通的Delphi对象,事情会变得更难.您可以使用RTTI查找并调用已发布的方法和属性,但这就是它.如果您具有未发布的非虚方法的名称,则Delphi无法在您的方法上找到正确的地址.

换句话说,你所能做的只是抓住对象,你将无法使用它.也许他们可以增加对释放它的支持,但同样,这可能就是它.

我知道如果你正确实现IDispatch,你可以安全地存储,并通过变体使用该对象.我有一个类可以用作你想要执行此操作的Delphi对象的基类.它将自动公开已发布的方法/属性,如果需要通过某些受保护的方法调用,则可以添加更多.如果对这样的课程感兴趣,我可以把它放在某个地方.

但同样,这是通过IDispatch,它使用已发布的方法,其余是手动代码,因此您必须在对象中内置对变体的支持.

这就是为什么我认为他们只是说:这只会产生抱怨,我们可以持有一个对象,但它只是没用.

但这只是我的想法.也许某位官员有更好的答案.


你说得对.您还应该提到TCustomVariantType和TInvokeableVariantType类.这些类显示了类必须要做的所有事情才能在Variant中使用*(不仅仅是存储),而不必实现IDispatch.

3> Cesar Romero..:

我曾经使用变量内部使用Variants来保存对象,代码是这样的:

var
  MyObject: TMyObject;
  Value: Variant;
begin
  MyObject:= TMyObject.Create;
  TVarData(Value).VType:= VarByRef or VarUnknown;
  TVarData(Value).VPointer:= MyObject;

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有