还是Applicatio.processmessage的问题?在线等候(100分)

  • 主题发起人 主题发起人 hthugm
  • 开始时间 开始时间
H

hthugm

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure delay(msecond:DWORD);
var
nowtime:DWORD;
begin
nowtime:=GetTickCount ;
while GetTickCount<nowtime+msecond do
Application.ProcessMessages ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
delay(120000);
end;
一运行程序我先点击Button按钮再按窗体上的‘关闭’按钮,可窗体根本不关闭,也就是说
Application.ProcessMessages对WM_QUIT怎么处理,希望指教?
 
除非你使用Halt,否则不行。
理由
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
HandleMessage //程序执行的时候,就在这个循环里面。
until Terminated;
end;
finally
FRunning := False;
end;
end;

而 Application.ProcessMessages是
procedure TApplication.ProcessMessages;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do
{loop};
end;
当窗体关闭的时候,就是说你用Close 或者打叉关闭最终是设置FTerminate,就是上面的Terminate
在你执行按钮时间的时候,实际上就是在执行一个 HandleMessage,而没有到检测Terminate的时候,所以不会退出。
不知道我是否说明白了,如果你还不清楚,可以看VCL代码,调试的时候使用Project->Options->Complier->Use Debug Dcus。
 
这种应用应该用多线程来实现
 
没错,我前几天也碰到过了。
最好用线程来处理类似的问题;
我的估计是Delphi 系统对窗体的作用消息用另外的过程来集中处理了,
而控件的消息响应过程则在 application.processmessages 中进行处理,
所以它无法响应对窗体的操作,却可以响应本窗体其它控件的操作。
 
窗体接收到WM_QUIT之后就是把FTerminate置为True;
然后他就等待你执行完毕,所以如果你在延迟的时候按了关闭,在延迟结束的时候他
就会自动关闭了。
在你按了关闭之后,你就会发现你不能创建新的模式窗口了,这就是因为在ShowModal
里面判断了Application.Terminate是不是为True:)
 
上面讲得详细,我不说了
 
改成这样就OK了
while GetTickCount<nowtime+msecond do
begin
Application.ProcessMessages ;
if Application.Terminated then
Break;
end;
 
特别谢谢YZHSHI和SZF
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
511
import
I
I
回复
0
查看
544
import
I
I
回复
0
查看
683
import
I
后退
顶部