我有一个 Delphi 表单,它提供接口对象背后的功能,代码的其他部分也通过属于该表单的属性获取引用。我无法将接口功能委托给子对象,因为太多的功能是由表单上的控件/组件提供的。我无法使用 TAggregateObject 或 TContainedObject 链接传递给 Form 的接口对象的生命周期,因为 TForm 类不从 TinterfacedObject 继承,并且 Delphi 不支持多重继承,因此我无法将 TInterfacedObject 混合到继承链中。如果表单被销毁,而其他一些代码保存着由表单传递的接口引用之一,则这种情况可能会导致访问冲突。有人能想出一个好的解决方案来解决这个问题吗?
您可以将接口委托给子对象,只需让该对象包含指向表单的内部指针,以便它可以在需要时访问表单的控件,这与您现在已经做的没有什么不同。
您可以使用TAggregateObject
or TContainedObject
满足您的需求。他们不需要表格来派生TInterfacedObject
。他们所需要的只是一个IInterface
接口指针,以及TComponent
源自于IInterface
(并覆盖_AddRef()
and _Release()
禁用引用计数),因此您可以传递表单本身(作为TComponent
后代)根据需要IInterface
指针。
这就剩下唯一的问题了——当活动接口引用被其他代码持有时,表单关闭。最简单的解决方案是 1) 重写该代码,以便在窗体关闭时不保留这些引用,或者 2) 在释放这些引用之前不允许窗体关闭。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)