如果有个消息很多窗体都要用的话定义在哪里比较合适;
我的意思是能不能象全局函数那样定义在一个单独的单元里;
试了一下定义在单元里出错;好像只能在对象里定义这个东东;哪里比较好些;
主窗体单元里吗?还是定义在父类窗体里比较好些

解决方案 »

  1.   

    另外;findclass函数的参数是不是必须要求是在整个系统initalization中用registerclass函数注册过的窗体?
      

  2.   

    这里有篇文章,看看对你有没有帮助Delphi自定义消息应用一例
    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象FoxMail 3.0 NetVampire 3.0等都提供了这样的功能。实现这样的功能实际上并不复杂,在窗口最小化时,窗口会发出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化时隐藏窗口并调用WindowsAPI函数Shell_NotifyIcon将定义的图标添加到任务栏上,Shell_NotifyIcon的函数定义是这样的:function Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall; 其中的参数dwMessage指定Shell_NotifyIcon函数的操作,可以是NIM_ADD NIM_DELETE NIM_MODIFY三个值中的一个,分别对应添加图标、删除图标、修改图标的动作。
    参数lpData指向的PNotifyIconData结构的定义如下:
    _NOTIFYICONDATAW = recordcbSize: DWORD;Wnd: HWND;uID: UINT;uFlags: UINT;uCallbackMessage: UINT;hIcon: HICON;szTip: array [0..63] of WideChar;end;
    TNotifyIconData = _NOTIFYICONDATAW;
    在这个结构中Wnd指明所属的窗口,UCallbackMessage指明回调消息,如果指明了Wnd和 uCallbackMessage,则当用户对任务栏图标有动作(如点击图标,在图标上移动光标等)。系统都会发送uCallbackMessage消息给Wnd指定的窗口。hIcon是要添加的图标的句柄,szTip 是图标的提示行(就是当移动光标到图标上,出现的一个小黄方框内出现的文字)。消息。实现上面的功能,最主要的是要处理WM_SYSCOMMAND消息和自定义的图标消息,这些消息在Delphi中并没有相应的事件。这里就需要使用到Delphi的自定义消息处理功能来截取并处理这些消息。
    首先看下面的程序。在执行程序之前,首先要改变Form1的Icon属性,给Form1装入一个图标,否则在任务栏上会出现一块空白。
    unit Unit1;interfaceusesWindowsMessagesSysUtils
    ClassesGraphicsControlsForms
    DialogsShellAPI;
    constWM_BARICON=WM_USER+200;
    typeTForm1 = class(TForm)privateprocedure WMSysCommand(varMessage: TMessage); message WM_SYSCOMMAND;procedure WMBarIcon(varMessage:TMessage);message WM_BARICON;{ Private declarations }public{ Public declarations }end;
    varForm1: TForm1;
    implementation
    {$R *.DFM}procedure TForm1.WMSysCommand(var Message:TMessage);varlpData:PNotifyIconData;beginif Message.WParam = SC_ICON thenbegin//如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标lpData := new(PNotifyIconDataA);lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);lpData.Wnd := Form1.Handle;lpData.hIcon := Form1.Icon.Handle;lpData.uCallbackMessage := WM_BARICON;lpData.uID :=0;lpData.szTip := 'Samples';lpData.uFlags := NIF_ICONor NIF_MESSAGE or NIF_TIP;Shell_NotifyIcon(NIM_ADDlpData);dispose(lpData);Form1.Visible := False;endelsebegin//如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。DefWindowProc(Form1.HandleMessage.MsgMessage.WParamMessage.LParam);end;//end;
    procedure TForm1.WMBarIcon(var Message:TMessage);varlpData:PNotifyIconData;beginif (Message.LParam = WM_LBUTTONDOWN) thenbegin//如果用户点击任务栏图标则将图标删除并回复窗口。lpData := new(PNotifyIconDataA);lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);lpData.Wnd := Form1.Handle;lpData.hIcon := Form1.Icon.Handle;lpData.uCallbackMessage := WM_BARICON;lpData.uID :=0;lpData.szTip := 'Samples';lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;Shell_NotifyIcon(NIM_DELETElpData);dispose(lpData);Form1.Visible := True;end;end;
    end.
    运行上面的程序,点击程序窗口标题栏上的最小化按钮,你就可以看到窗口被“最小化”成了一个任务栏图标,点击图标,窗口又会恢复原来的状态。
    从上面的程序可以看到,Delphi的自定义消息处理功能的实现也是十分简单的,首先在Form类的Private定义中加入自定义消息处理函数的定义,定义的描述如下:
    procedure UserPro(Var Message:TMessage):message WindowsMessage其中UserPro是用户自定义消息处理函数的名称,WindowsMessage是Windows消息常量或自定义消息常量。
    然后在程序中加入消息处理函数,函数的一般格式如下:
    Procedure UserClass.UserPro(Var Message:TMessage);var//加入定义Begin//加入程序语句End;其中UserClass是封装自定义消息处理函数的类的名称。
    最后,Delphi的自定义消息处理函数要涉及到Windows的消息的结构,在这里我就不多说了,大家可以参考Windows API帮助和Delphi的相关帮助信息。相信大家如果掌握了Delphi的自定义消息处理函数,一定可以编写出象VB一样简洁,象C++一样功能强大的程序来的。
      

  3.   

    你可以在主窗体中定义。
    发送消息时要注意 sendmessage(form1.handle, ....
      

  4.   

    定义一个友元函数试试看了不过
    Beginmessagemap
    还需要在
    类中定义
      

  5.   

    从上面的程序可以看到,Delphi的自定义消息处理功能的实现也是十分简单的,首先在Form类的Private定义中加入自定义消息处理函数的定义,定义的描述如下:
    ---------------------------------
    注意到楼上这位兄弟留言中的上面这句话;
    【在form类的private中加入...】那么是不是说消息应该是只能从属于类的;
    ^_^;
    其实早应该想到
    -----------还想再不识趣的找有经验的兄弟指点一下;自定义消息一般是定义在什么位置?
    子类窗体所公用的消息处理函数应该可以定义在基类窗体中;
    那么如果没采用窗体继承做的程序中,多个窗体公用的消息处理函数该放在哪里比较好一些?
      

  6.   

    qinmaofan(采菊南山下【抵制日货】) 
    你可以在主窗体中定义。
    发送消息时要注意 sendmessage(form1.handle, ....
    -----------------------------
    兄弟上面的form1是主窗体吗?
      

  7.   

    如果你的主窗体是 form1,
    那么在其他窗体中发送就用 sendmessage(form1.handle, ....
      

  8.   

    unit myuntinterface
      uses forms,windows....;
    //------------------------------------------------------
    // 作为单元的全局量要在这个地方定义你的自定义消息值;
    //------------------------------------------------------
     const
       wm_myMsg=wm_User+$100;
       ....typeend;im....
    end.
    //------------------------------------------------------
    //发送自定义消息时,自定义消息前加上域访问定位标识符才行。
    //如果在本单元内发送自定义消息,则标识符可省略。
    //-------------------------------------------------------
      

  9.   

    晕的;
    知道了;跟 dinglinger(叮当) 兄弟的回复冲突了;
    看在哥们这么帮忙的份上;
    17分奉上;^_^