我什么时候需要释放应用程序创建的数据模块?

时间:2015-05-21 15:03:59

标签: delphi memory-management datamodule

我的代码如下:

begin
  Application.Initialize;
  Application.Title := 'Controle Bancário';
  Application.CreateForm(T_DMEstagio, _DMEstagio);
  Application.CreateForm(T_frmLogin, _frmLogin);
  if (_frmLogin.ShowModal = 1) then
    begin
      FreeAndNil(_frmLogin);
      Application.CreateForm(T_frmPrincipal, _frmPrincipal);
      Application.Run;
    end;
    _DMEstagio.Free;

end.

如果我没有像在代码中那样显式释放DM,我会收到访问冲突异常,但在另一个应用程序中,代码是这样的:

begin
    Application.Initialize;
    Application.Title := ' > Sistema de Gestão Comercial <';
    if HPrevInst = 0 then
    begin
      Application.CreateForm(TFrmPrincipal, FrmPrincipal);
      Application.CreateForm(TIBDM, IBDM);
      Application.Run;
    end ;
end.

我没有必要释放DM,我也没有任何例外。那是为什么?

1 个答案:

答案 0 :(得分:0)

回答你的问题

  

&#34;我什么时候需要释放应用程序创建的数据模块?&#34;

永远不会。

使用Application.CreateForm方法创建的所有数据模块和/或表单将由Application拥有并自动处理。

但是看起来,你的问题与自动销毁过程无关。以下代码应解决您的问题,因为某些组件和类需要应用程序来完成其完整的初始化/运行周期才能正常销毁。 RXHook可能就是其中之一。

begin
  Application.Initialize;
  Application.Title := 'Controle Bancário';
  Application.ShowMainForm := false;
  Application.CreateForm(T_DMEstagio, _DMEstagio);
  Application.CreateForm(T_frmLogin, _frmLogin);
  if (_frmLogin.ShowModal = 1) then
    begin
      FreeAndNil(_frmLogin);
      Application.ShowMainForm := true;
      Application.CreateForm(T_frmPrincipal, _frmPrincipal);
    end
  else Application.Terminate;
  Application.Run;
end.

那么上面的代码究竟发生了什么?

您正在尝试显示登录表单,并根据登录结果继续运行您的应用程序或终止它。

请务必注意,您创建的第一个表单将变为Application.MainForm,如果在Application.Run执行Application.MainForm之前发布该表单,则会将其设置回nil。这将确保下一个创建的表单可以成为主要表单。

在您的情况下,这意味着_frmLogin将被设置为Application.MainForm。如果登录成功,它将被释放,_frmPrincipal将接管。但是,如果登录失败,_frmLogin在执行Application.MainForm时仍为Application.Run,并会再次显示。

这是Application.ShowMainForm到位的地方。如果设置为false Application.Run,则只会在不显示任何表单的情况下运行。在您的情况下,它会阻止_frmLogin再次出现。当然,成功登录后,您需要将Application.ShowMainForm设置回true以确保正常的应用程序启动。

如果登录失败,调用Application.Terminate将确保您的应用程序退出应用程序主消息循环,该循环将以调用Application.Run开始并正常终止。