Forms 在dll应用程序中创建(所有者)

Forms 在dll应用程序中创建(所有者),forms,delphi,Forms,Delphi,创建新表单时,Delphi希望将“Application”、“self”或“nil”作为参数来定义所有者。但是当表单位于dll中而不是独立(vcl)应用程序中时会发生什么?显然,“nil”是由dll中编写的代码处理的。但是,如果表单是在dll中创建的,我不清楚“Application”或“self”是否能够正确处理“form.free”操作。如果是,何时释放表单 创建新表单时,Delphi希望将“Application”、“self”或“nil”作为参数来定义所有者 这是不对的。任何组件都可以作

创建新表单时,Delphi希望将“Application”、“self”或“nil”作为参数来定义所有者。但是当表单位于dll中而不是独立(vcl)应用程序中时会发生什么?显然,“nil”是由dll中编写的代码处理的。但是,如果表单是在dll中创建的,我不清楚“Application”或“self”是否能够正确处理“form.free”操作。如果是,何时释放表单

创建新表单时,Delphi希望将“Application”、“self”或“nil”作为参数来定义所有者

这是不对的。任何组件都可以作为所有者提供,当所有者被销毁时,所拥有的组件将被销毁

如果表单是在dll中创建的,我不清楚“Application”或“self”是否能正确处理“form.free”操作。如果是,何时释放表单

在这两种情况下,当所有者被销毁时,表单将被销毁。因此,问题变得非常简单,所有者何时被摧毁。答案是:

  • 应用程序:卸载DLL时。在DLL中,有一个
    应用程序
    对象,但它的生命周期与DLL的生命周期相关联,而不是与可执行文件相关联,就像在VCL可执行模块中一样
  • Self:每当
    Self
    被销毁时,只有你知道,因为只有你知道
    Self
    是什么
创建新表单时,Delphi希望将“Application”、“self”或“nil”作为参数来定义所有者

这是不对的。任何组件都可以作为所有者提供,当所有者被销毁时,所拥有的组件将被销毁

如果表单是在dll中创建的,我不清楚“Application”或“self”是否能正确处理“form.free”操作。如果是,何时释放表单

在这两种情况下,当所有者被销毁时,表单将被销毁。因此,问题变得非常简单,所有者何时被摧毁。答案是:

  • 应用程序:卸载DLL时。在DLL中,有一个
    应用程序
    对象,但它的生命周期与DLL的生命周期相关联,而不是与可执行文件相关联,就像在VCL可执行模块中一样
  • Self:每当
    Self
    被销毁时,只有你知道,因为只有你知道
    Self
    是什么

在DLL中实现VCL表单将面临更大的挑战。
应用程序
将与应用程序中的应用程序不同。“Delphi期望“Application”、“self”或“nil”作为定义所有者的参数”-它没有这样的期望。如果不是
nil
,则可以使用任何
t组件
对象作为
所有者
。但是,如果您确实指定了
nil
,则在使用完创建的对象后,您有责任自己释放该对象。为什么有人希望在(普通)DLL中实现表单?出于这种目的,包(BPL)更适合。没有你面对的DLL问题。@rudy有时候。例如,假设您为office应用程序编写COM加载项。@rudy该dll用作图形CAD程序的宏扩展。宏可以使用弹出窗体来管理从程序中提取的数据,并定义要添加到图形文件中的新图元。无法识别Delphi包。DLL由Cad程序操作,只输出一个名为“Name”的函数。在DLL中实现VCL表单将面临更大的挑战。
应用程序
将与应用程序中的应用程序不同。“Delphi期望“Application”、“self”或“nil”作为定义所有者的参数”-它没有这样的期望。如果不是
nil
,则可以使用任何
t组件
对象作为
所有者
。但是,如果您确实指定了
nil
,则在使用完创建的对象后,您有责任自己释放该对象。为什么有人希望在(普通)DLL中实现表单?出于这种目的,包(BPL)更适合。没有你面对的DLL问题。@rudy有时候。例如,假设您为office应用程序编写COM加载项。@rudy该dll用作图形CAD程序的宏扩展。宏可以使用弹出窗体来管理从程序中提取的数据,并定义要添加到图形文件中的新图元。无法识别Delphi包。dll由Cad程序操作,只输出一个名为“Name”的函数。谢谢,我假设没有简单的方法来确定程序是否已卸载dll。在这种情况下,我最好的选择是使用“nil”并自己处理释放表单的操作。@Ashlar当然有。如果动态加载DLL,那么您也将负责卸载它。所以你就是那个知道的人。当然,除非您的DLL是由第三方应用程序加载的,这在您的问题中并不清楚。如果是这样的话,那么我希望调用方有一个卸载/释放内存的机制,如果它设计正确的话。一些开发人员认为您有垃圾收集,但没有提供释放垃圾的方法。@Jerry单元最终确定发生在DLL卸载时,因为只有一种方法可以检测到这一点,而无需任何合作。@Ashlar如果您需要建议和指导,那么我们需要知道DLL的使用和托管方式。@David的确如此,只是我一直在假设DLL将由OP自己的应用程序托管,但上面的一条评论表明情况并非如此。谢谢,我假设没有简单的方法来确定程序是否已卸载DLL。在这种情况下,我最好的选择是使用“nil”并自己处理释放表单的操作。@Ashlar当然有。如果动态加载DLL,那么您也将负责卸载它。所以你就是那个知道的人。当然,除非您的DLL已加载