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的可能性很小。