Delphi 当没有更多的引用时,实现表单的接口会释放自己吗?

Delphi 当没有更多的引用时,实现表单的接口会释放自己吗?,delphi,interface,tform,Delphi,Interface,Tform,如果我在一个表单上实现一个接口,比如TMyForm=class(TForm,IMyInterface),当没有更多的接口引用时,对象会释放自己吗?虽然我无法计算出TForm是如何计算引用数的(如果有)。我担心当接口引用超出范围时表单会被释放,但这似乎不会发生 我猜这个问题有两个部分,第一个是表单是否会意外释放(真正的问题),第二个是表单是如何进行引用计数的。TForm源于TComponent,它实现了\u AddRef()和\u Release()来禁用自身的引用计数。因此,任何TCompone

如果我在一个表单上实现一个接口,比如
TMyForm=class(TForm,IMyInterface)
,当没有更多的接口引用时,对象会释放自己吗?虽然我无法计算出TForm是如何计算引用数的(如果有)。我担心当接口引用超出范围时表单会被释放,但这似乎不会发生


我猜这个问题有两个部分,第一个是表单是否会意外释放(真正的问题),第二个是表单是如何进行引用计数的。

TForm
源于
TComponent
,它实现了
\u AddRef()
\u Release()
来禁用自身的引用计数。因此,任何
TComponent
子类实现的任何接口,如
TForm
,在释放接口时,默认情况下都不会释放其实现的
TComponent
对象

但是,如果将
IVCLComObject
接口分配给
TComponent.VCLCOMObject
属性,则
TComponent
将向该对象委托引用计数,以便在引用计数降至0时释放该对象(
t组件
不会增加其
ivclcom对象
reference)的引用计数)


这对
t组件的所有后代都有效,除非它们通过手动重写
\u AddRef()
\u Release()
来实现自己的引用计数。

如果在表单中实现接口,则值得添加自己的接口

_Release as follows:

    function _Release: Integer; stdcall;

function TMyInterfacedForm._Release: Integer;
begin
  result:=-1; 
end;
我发现可以使用接口释放表单,然后在局部变量超出范围时调用_版本。这可能会导致访问冲突,因为Tcomponent实现会检查是否设置了FVCLComObject

  if FVCLComObject = nil then
    Result := -1   // -1 indicates no reference counting is taking place
  else
    Result := IVCLComObject(FVCLComObject)._Release;
因为在此阶段,FVCLComobject未定义,所以可能会发生恼人的A/V异常。
通过硬连接-1,可以安全地调用它,而不会触发异常。

@TLama TForm从实现IIinterface和IIinterfaceComponentReference的TComponent派生而来。TComponent确实实现了_AddRef和_Release,但它们似乎只是有条件地进行引用计数。@Alister:
TComponent
禁用引用计数g本身,但如果赋值,将根据其
VCLCOMObject
属性执行引用计数。@Alister,对不起,也许我误解了你的问题(在重新阅读几次之前),但我以为你在问如果添加接口(将在
TForm
类中实现)会发生什么。如果添加该接口有某种危险,并且这会给表单添加引用计数。@TLama:将接口添加到
TForm
不会给
TForm
添加引用计数。编译器仍将调用
\u AddRef()
\u Release()
在interace指针上,但由于
TComponent
,它们将不会运行。这并不是那么简单,@免费。看看其他人都在这里写了些什么。特别是,雷米在你之前的评论,Uwe的答案,以及问题中报告它不工作的地方。我更关心的是,还有什么可能设置VCLCombobject@Alister:
TComponent.vclomobject
是在访问
TComponent.ComObject
时设置的,这仅在项目使用
VCLCom
单元时有效(否则访问
ComObject
属性将引发异常).换句话说:只要您不通过COM服务器以某种方式公开表单(引用计数似乎足够),在没有您自己干预的情况下,设置VCLComObject的可能性很小。