请大侠们深入谈一下:MainForm.Close及Application.Terminate及HALT的用法!内有举例代码!(180分)

  • 主题发起人 主题发起人 youou
  • 开始时间 开始时间
Y

youou

Unregistered / Unconfirmed
GUEST, unregistred user!
MainForm.FormClose中主要是释放程序中使用的资源。
1.发现:
CLOSE时会调用MainForm.FormClose中的代码.
而Terminate不会!如果用它是不是会有内存泄漏的问题呢?
如果用HALT会有内存泄漏的问题吗?

procedure TApplication.Terminate;
begin
if CallTerminateProcs then PostQuitMessage(0);
end;

function CallTerminateProcs: Boolean;
var
PI: PTerminateProcInfo;
begin
Result := True;
PI := TerminateProcList; //这句主要是指什么啊?
while Result and (PI <> nil) do
begin
Result := PI^.Proc;
PI := PI^.Next;
end;
end;

procedure PostQuitMessage; external user32 name 'PostQuitMessage';

2.它们三个都会在TApplication.Run后调用到
procedure TForm1.FormDestroy(Sender: TObject);
begin
showMessage('aa');
end;
只是不同的是HALT会显示showMessage('aa')而其它两个不会?为什么呢?

3.可以说说下面的是什么意思吗?我看了一知半解的!
procedure TApplication.Run;
begin
FRunning := True;
try
AddExitProc(DoneApplication); //?????
if FMainForm <> nil then
begin
case CmdShow of
SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized; //让窗体最小化
SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized; //最大化
end;
if FShowMainForm then
if FMainForm.FWindowState = wsMinimized then
Minimize else
FMainForm.Visible := True;
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;
 
这三种方法都能结束应用程序,但halt是不提倡用的,它不能释放资源。
用Application.Terminate的话,程序关闭时,你会听到“咚”一声。不知为什么。
其他的还请高手指点。
 
程序(exe)结束后所有的资源均会被系统收回吧?
 
Close,首先执行CloseQuery,然后,执行Release.
Release里面执行的是:
PostMessage(Handle, CM_RELEASE, 0, 0);

procedure CMRelease(var Message: TMessage); message CM_RELEASE;
里面执行的是:Free;

Application.Terminate
调用的是PostQuitMessage
看PostQuitMessage的帮助:
The PostQuitMessage function indicates to Windows that a thread has
made a request to terminate (quit). It is typically used in response
to a WM_DESTROY message.

Halt

Halt performs an abnormal termination of a program and returns to the
operating system. To perform a normal termination of Delphi
VCL non-console application, call Application.Terminate. Exitcode is
an optional expression that specifies an exit code for the program.
 
>>2.它们三个都会在TApplication.Run后调用到
>>procedure TForm1.FormDestroy(Sender: TObject);
>>begin
>> showMessage('aa');
>>end;
>>只是不同的是HALT会显示showMessage('aa')而其它两个不会?为什么呢?
你改用:Application.MessageBox ('','',0);或者MessageBox实验一下。

为什么那两个没有显示提示对话框呢?因为ShowMessage是Delphi自己创建的,而其他的是调用API
其实都执行了,只是没有显示出来而已。
看ShowModal的代码,其中有一下这段。

try
SendMessage(Handle, CM_ACTIVATE, 0, 0);
ModalResult := 0;
repeat
Application.HandleMessage;
if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end;

当使用Application.Teminate的时候,ModalResult直接就等于mrCancel,就退出了。
 
最好在主线程窗口里用Close方法,
Application.Teminate也可以,他要响应WM_QUIT事件
 
Application.Teminate
在XP下无效。
 
楼上的错了,Application.Teminate在xp有效。
我写的程序就是用Application.Teminate的,XP下效果一样。
 
待我看看..................
 
to yzhshi:
1. procedure CMRelease(var Message: TMessage); message CM_RELEASE;
里面执行的是:Free;
我怎么找不到上面这个啊?
2.
procedure TForm1.Button1Click(Sender: TObject);
begin
A>application.Terminate ;
B>close;
C>halt;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MessageBox(handle,'aa','bb',0); //调用AP函数
showmessage('ff');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
MessageBox(handle,'aa','bb',0); //调用AP函数
showmessage('ff');
end;
--------------------
用上面代码试了:
A---直接调用FormDestroy 对于showmessage('ff');不显示窗口
B---调用完FormClose后调用FormDestroy 但是FormDestroy中的showmessage('ff');不显示窗口
C--直接调用FormDestroy 均显示!
-----------------------------------------------
为什么那两个没有显示提示对话框呢?因为ShowMessage是Delphi自己创建的,而其他的是调用API
其实都执行了,只是没有显示出来而已。
------------------------------------------------
为什么没显示????API的为什么会显示?

 
后退
顶部