• 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了


    系统关闭窗体的事件顺序为:

      OnCloseQuery ----> OnClose ----> OnDestroy

    下面的代码说明问题:

    [delphi] view plaincopy
     
    1. unit Unit3;  
    2.   
    3. interface  
    4.   
    5. uses  
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
    7.   Dialogs;  
    8.   
    9. type  
    10.   TForm3 = class(TForm)  
    11.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);  
    12.     procedure FormClose(Sender: TObject; var Action: TCloseAction);  
    13.     procedure FormDestroy(Sender: TObject);  
    14.   private  
    15.     { Private declarations }  
    16.   public  
    17.     { Public declarations }  
    18.   end;  
    19.   
    20. var  
    21.   Form3: TForm3;  
    22.   
    23. implementation  
    24.   
    25. {$R *.dfm}  
    26.   
    27. procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);  
    28. begin  
    29.   MessageBox(Handle,'正在关闭窗体!','提示',MB_OK or MB_ICONWARNING);  
    30. end;  
    31.   
    32. procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);  
    33. begin  
    34.   if MessageBox(Handle,'你确定要关闭该窗体吗?','提示',MB_YESNO or MB_ICONINFORMATION) = IDYES then  
    35.     CanClose:=True  
    36.   else  
    37.     CanClose:=False;  
    38. end;  
    39.   
    40. procedure TForm3.FormDestroy(Sender: TObject);  
    41. begin  
    42.   // 必须用Application的方法了  
    43.   Application.MessageBox('释放窗体','提示');  
    44. end;  

    另外 从网友 http://echocancer.spaces.live.com/blog/cns!97776b41bf0a7f5d!141.entry 出摘的 文章:

    程序不能关机?看看你在OnCloseQuery里是不是写了代码!

    今天终于解决了程序不能关机的问题,都是OnCloseQuery惹得祸!
    程序里有多个窗体,其中有两个在OnCloseQuery里写了处理代码,导致程序不能关机。
    一开始我安网上找到的办法试图在主窗口中截获WM_QUERYENDSESSION消息然后返回Msg.Result=1。发现这个消息根本就没有传到主窗口来,后来我又怀疑是不是Application.OnMessage把这个消息给拦截掉了,后来发现也不是的。最后才弄清楚如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了。因为程序中有两个窗体的OncloseQuery中都写了代码所以WM_QUERYENDSESSION消息根本就传不到主窗口。最后在那两个窗口中拦截WM_QUERYENDSESSION消息,强制将msg.result返回1就解决了问题。
     
    这次的问题让我对windows的消息机制又有了更深的了解,所有的windows的广播消息都是逐窗口传递的。
     
    http://blog.csdn.net/procedure1984/article/details/5418279
  • 相关阅读:
    12月2号
    11月30号
    11月25号
    本周总结
    每日日报
    每日日报
    每日日报
    JAVA日报
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/findumars/p/5087505.html
Copyright © 2020-2023  润新知