我在Application.run之前執行applicaton.terminater時,明顯得發現它不是馬上退出,而是等applicaton.run前面所有的初始化語句全部執行完了後,才退出,請問application.run到底起了什麼作用?
解决方案 »
- 求remobject for delphi7 控件,谢谢啦!
- 夜星寻BU(又称宝兰),该回家吃饭了
- 以下这断代码在w2000下执行正常,在XP下执行会无限等待,好象是停在WaitForSingleObject(piProcess.hProcess, INFINITE);
- 它们有什么区别?
- 有这么个事?
- 如何让SocketConnection具SOCKET5代 理功能?
- 请教高手,这段代码怎么写才能如愿?
- 招Delphi程序员,地点:广州
- Delphi 高手请进
- 救命呀!谁知道青松指纹考勤软件的数据库格式!
- 出库临时表提交后,要求减去库存相应的部分,你们一般怎么设计?我用BatchMove1的batDelete,结果出现index does not exist,如何设计?
- 利用ACCESS数据库 实现 分布数据库
begin
if CallTerminateProcs then PostQuitMessage(0);
end;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;function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;调用Terminate,会发送一个WM_QUIT消息,而ProcessMessage会在受到WM_QUIT后将FTerminate 设成True,从而结束Run的循环
Run的作用主要就是这句HandleMessageprocedure TApplication.HandleMessage;
var
Msg: TMsg;
begin
if not ProcessMessage(Msg) then Idle(Msg);
end;可以这样一直看下去归根结底一句话把VCL要处理的消息交给VCL处理,把系统要操作的消息交给操作系统处理,把用户的消息交给用户处理
李维的《Inside VCL》讲的很详细
错!