1. 程式人生 > >托盤程式的實現(delphi的訊息處理函式)

托盤程式的實現(delphi的訊息處理函式)

我的程式碼如下,可是報錯。。  
  const   my_message=wm_user+100;  
  ....  
  procedure   xxxx(var   msg:TMessage);   message   my_message;////---這裡報錯。。  
  ....  
  procedure   xx(var   msg:Tmessage)  
  begin  
  ....  
  end;  
  謝謝了, 問題點數:100、回覆次數:6Top

1 樓yelook(香檳酒)回覆於 2003-01-16 16:54:24 得分 30

procedure   xx(var   msg:Tmessage)  
  begin  
  ....  
  end;  
  改為  
  procedure   類名.xx(var   msg:Tmessage)  
  begin  
  ....  
  end;  
 

Top

2 樓xzgyb(老達摩)回覆於 2003-01-16 16:57:30 得分 20

TForm1   =   class(TForm)  
  public  
    ...  
        procedure   xxxx(var   msg:TMessage);   message   my_message;  
  end;  
   
  procedure   TForm1.xxxx(var   msg:TMessage);  
  begin  
      ...  
  end;  
   
  訊息處理函式必須作到一個類裡面Top

3 樓cg1120(程式碼最優化-§惟堅韌者始能遂其志§)
回覆於 2003-01-16 16:57:51 得分 15

procedure   TFORM1.xx(var   msg:Tmessage)  
  begin  
  ....  
  end;  
  Top

4 樓Drate(小蟲(好好學習,天天向上))回覆於 2003-01-16 17:00:33 得分 35

同意樓上的:  
   
  [轉帖]  
   
   
  Delphi自定義訊息應用一例    
  作者:     評價:     上站日期:   2001-09-05      
  內容說明:      
  來源:      
   
  --------------------------------------------------------------------------------  
   
   
      現在很多的應用程式都有這樣一種功能,當用戶選擇最小化視窗時,視窗不是象平常那樣最小化到工作列上,而是“最小化”成一個工作列圖示。象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   =   record    
  cbSize:   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;    
  interface    
  uses    
  Windows,   Messages,   SysUtils,    
  Classes,   Graphics,   Controls,   Forms,    
  Dialogs,ShellAPI;    
   
  const    
  WM_BARICON=WM_USER+200;    
   
  type    
  TForm1   =   class(TForm)    
  private    
  procedure   WMSysCommand(var    
  Message:   TMessage);   message   WM_SYSCOMMAND;    
  procedure   WMBarIcon(var    
  Message:TMessage);message   WM_BARICON;    
  {   Private   declarations   }    
  public    
  {   Public   declarations   }    
  end;    
   
  var    
  Form1:   TForm1;    
   
  implementation    
   
  {$R   *.DFM}    
  procedure   TForm1.WMSysCommand    
  (var   Message:TMessage);    
  var    
  lpData:PNotifyIconData;    
  begin    
  if   Message.WParam   =   SC_ICON   then    
  begin    
  //如果使用者最小化視窗則將視窗    
  隱藏並在工作列上新增圖示    
  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_ADD,lpData);    
  dispose(lpData);    
  Form1.Visible   :=   False;    
  end    
  else    
  begin    
  //如果是其它的SystemCommand    
  訊息則呼叫系統預設處理函式處理之。    
  DefWindowProc(Form1.Handle,Message.    
  Msg,Message.WParam,Message.LParam);    
  end;    
  //    
  end;    
   
  procedure   TForm1.WMBarIcon(var   Message:TMessage);    
  var    
  lpData:PNotifyIconData;    
  begin    
  if   (Message.LParam   =   WM_LBUTTONDOWN)   then    
  begin    
  //如果使用者點選工作列圖示則將圖示刪除並回復視窗。    
  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_DELETE,lpData);    
  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++一樣功能強大的程式來的。    
   
     
     
 

Top

5 樓lanble()回覆於 2003-01-16 19:04:17 得分 0

各位大哥,也是寫在類裡面的,(注用DELPHI6),報錯資訊如下:  
  unkown   directive   'message',是不是少引用了某個單元?Top

6 樓xiaole51(善良的賊)回覆於 2003-02-18 16:36:17 得分 0

uses   部分是不是沒引用Messages