const
  SX_EXECUTE = WM_USER + 100;private
  procedure SXExecute(var Msg: TMessage); message SX_EXECUTE;
procedure TExecReportForm.FormActivate(Sender: TObject);
begin
  Perform(SX_EXECUTE, 0, 0);
end;procedure TExecReportForm.SXExecute(var Msg: TMessage);
begin
//
end;
procedure SXExecute(var Msg: TMessage); message SX_EXECUTE;这句话的意思是当执行Perform(SX_EXECUTE, 0, 0);的时候就执行SXExecute这个函数么?

解决方案 »

  1.   

    关键字MESSAGE是声明一个消息处理过程,响应消息为SX_EXECUTE.
      

  2.   

    这个消息映射也可以这么用:一、首先定义一个消息的KEY(其中WM_USER是delphi指定给开发者用的,我们只需要在此基础上加就可以了):
    const
      WM_MSG = WM_USER + 1;二、然后在某个控件的响应函数里给windows发消息:
    procedure Tfrm1.btnOKClick(Sender: TObject);
    begin
      PostMessage(TWinControl(Owner).HANDLE, WM_MSG, 0, Longint(Pointer(Self)));
    end;
    其中,PostMessage里面的LPARAM和WPARAM两个参数就是用来给响应的消息传一些参数用的,可以是窗体本身,也可以是唯一确定窗体的一些KEY。三、在接收消息的窗体里(可以不同于发消息的窗体)定义消息的响应函数:procedure WMRecvMsg(var Msg: TMessage); message WM_Msg;
    var
      nIndex: Integer;
    begin
      nIndex := FFrameList.IndexOf(Pointer(Msg.LParam));
    //做消息的其他处理,这样就可以了。
    end;四、这里可以用PostMessage,也可以用SendMessage。
        PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。五、相关的api函数peekmessage和getmessage的区别如下:
       两个函数主要有以下两个区别: 
       1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。 
       2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。