我的代码如下:
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,我也没有任何例外。那是为什么?
答案 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
开始并正常终止。