亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi的消息處理

2019-11-18 18:26:52
字體:
來源:轉載
供稿:網友
Delphi是Borland公司的一種面向對象的可視化軟件開發工具。 Delphi集中了Visual C++和Visual Basic兩者的優點:容易上手、功能強大,特別是在界面設計、數據庫編程、網絡編程方面更有其獨特的優勢。

Delphi中的消息

消息是Windows發出的一個通知,它告訴應用程序某個事件發生了。在Delphi中,大多數情況下Windows的消息被封裝在VCL的事件中,我們只需處理相應的VCL事件就可以了,但如果我們需要編寫自己的控件、截獲或過濾消息就必須深入研究Win32的消息處理機制。

在Delphi中消息以TMessage記錄的方式定義。打開Message.pas文件,我們可以看到Tmessage是這樣定義的:

type

TMessage = packed record

Msg: Cardinal;

case Integer of

0: ( WParam: Longint;

LParam: Longint;

Result: Longint);

1: ( WParamLo: Word;

WParamHi: Word;

LParamLo: Word;

LParamHi: Word;

ResultLo: Word;

ResultHi: Word);

end;

其中,Msg是區別于其他消息的常量值,這些常量值可以是Windows單元中預定義的常量,也可以是用戶自己定義的常量。Wparam通常是一個與消息有關的常量值,也可以是窗口或控件的句柄。LParam通常是一個指向內存中數據的指針。

Result是消息處理的返回值。Wparam、Lparam和Result都是32位的,如果想訪問其中的低16位或高16位可以分別使用WparamLo、WparamHi、 LParamLo、LparamHi、ResultLo和ResultHi。

在Delphi中除了通用的Tmessage外,還為每個Windows定義了一個特殊的消息記錄。我們可以瀏覽Message.pas文件,下面是鍵盤的消息記錄:

TWMKey = packed record

Msg: Cardinal;

CharCode: Word;

Unused: Word;

KeyData: Longint;

Result: Longint;

與鍵盤相關的消息如:WM_KEYDOWN、 WM_KEYUP、 WM_CHAR、 WM_SYSKEYDOWN WM_SYSKEYUP、 WM_SYSCHAR的記錄也被定義為TWMkey。在Message.pas文件中有以下聲明:

TWMChar=TWMkey; TWMKeyDown=

TWMkey;TWMKeyUp=TWMkey; TWMSys

-KeyDown=TWMkey; TWMSysKeyUp=

TWMkey;TWMSysChar=TWMkey;

消息的發送

消息處理就是定義應用程序如何響應Windows的消息。在Delphi中每一個消息都有自己的處理過程,它必須是一個對象中的方法,且只能傳遞一個Tmessage或其他特殊的消息記錄,方法聲明后要有一個message命令,后接一個在0到32767之間的常量。

前面我們提到的消息都是標準的Windows消息(WM_X),除此之外還有VCL內部消息、通知消息和用戶自定義消息。

VCL內部消息通常以“CM_”開頭,用于管理VCL內部的事物。如果改變了某個屬性值或組件的其他一些特性后,需要通過內部消息將該變化通知其他組件。例如,激活輸入焦點消息是向被激活的或被停用的組件發送的,用于接受或放棄輸入焦點。

另外還有通知消息,一個窗口內的子控件發生了一些事情,需要通知父窗口,這是通過通知消息實現的。它只適用于標準的窗口控件,如按鈕、列表框、編輯框等等。打開Message.pas文件,在標準的Windows后就是通知消息的聲明:

const

{$EXTERNALSYM BN_CLICKED}

BN_CLICKED = 0;

{$EXTERNALSYM BN_PAINT}

BN_PAINT = 1;

{$EXTERNALSYM BN_HILITE}

BN_HILITE = 2;

以上是按鈕的通知消息,分別表示用戶單擊了按鈕、按鈕應當重畫、用戶加亮了按鈕。

用戶也可以自己定義消息、給自己發送消息和編寫消息處理過程。消息的常量值為WM_USER+100到$7FFF, 這個范圍是Windows為用戶自定義消息保留的。

Delphi消息的發送有三種方法:

1.Tcontrol類的Perform對象方法??梢韵蛉魏我粋€窗體或控件發送消息,只需要知道窗體或控件的實例。其聲明如下:

function Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint

2.Windows的API函數SendMessage()和Postmessage()。其聲明如下:

function SendMessage(hWnd: HWND; Msg: UINT;wParam:WPARAM; lParam: LPARAM):LRESULT;stdcall;

function SendMessage(hWnd: HWND; Msg: UINT;wParam: WPARAM; lParam:LPARAM):LRESULT;stdcall

PostMessage函數將消息添加到應用程序的消息隊列中去。應用程序的消息循環會從消息隊列中提取登記的該消息,再發送到相應的窗口中。

SendMessage函數可以越過消息隊列直接向窗口過程發送。所以當Windows需要立刻返回值時使用SendMessage,當需要不同的應用程序依次處理消息時使用PostMessage。而Perform從本質上和SendMessage相似,它們直接向窗口過程發送。SendMessage、Postmessage函數只需要知道窗口的句柄就可以發送消息,所以它們可以向非Delphi窗體發送一條消息,但而Perform必須知道窗體或控件的實例。

VCL消息處理機制

在Delphi應用程序的源代碼中有語句application.Run,它的作用是啟動消息循環,然后調用Application.PRocessMessage,該函數會在應用程序的消息隊列中查找一條消息。當在消息隊列中檢索到一條消息后,觸發Application.OnMessage事件。這樣在Windows本身對消息處理之前,就會響應OnMessage事件的處理過程,它優于任何消息處理,而且只接收登記的消息,即前面所述的由PostMessage發送的消息。響應Application.OnMessage事件的處理過程必須是TmessageEvent類型,其聲明如下:

type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;

其中TMsg是Windows中定義的消息記錄,我們可以這樣聲明:

Procedure OnMyMessage(var Msg:TMsg;var Handled:Boolean);

然后把此方法賦給Application.OnMessage事件:

Application.OnMessage :=OnMyMessage;

OnMessage事件將捕獲發送給應用程序的所有消息,這是一個非常繁忙的事件,因此在處理OnMessage事件的處理過程中設置斷點進行消息處理是不明智的。

VCL對象用于接收消息的方法叫MainWndProc。它是定義在Twincontrol類中的靜態方法,不能被重載。它不直接處理消息,當消息離開MainWndProc后,消息被傳遞給對象的WndProc方法,WndProc方法是在Tcontrol類中定義的一個虛擬方法,由它調用Dispatch方法。Dispatch根據傳入的Message來尋找相應的處理方法,如果最后找不到,就繼續向上到父類中尋找消息處理方法,一直到找到為止,如果找不到則調用Defaulthandler。Defaulthandler方法對消息進行最后的處理,然后把消息傳遞給Windows的DefWindowProc函數或其他默認的窗口過程。


上一篇:Delphi操作ACCESS技巧集

下一篇:真正的Delphi面向對象編程(一)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看久久av| 91精品久久久久久久久久另类| 欧美日韩成人在线播放| 黑人极品videos精品欧美裸| 亚洲男人天天操| 日韩电影中文字幕在线观看| 欧美激情免费视频| 青青草精品毛片| 九色成人免费视频| 欧美成人免费观看| 欧美成人四级hd版| 色yeye香蕉凹凸一区二区av| 在线电影中文日韩| 日韩暖暖在线视频| 国产第一区电影| 国产一区二区三区三区在线观看| 欧美性xxxx在线播放| 欧美激情亚洲激情| 4k岛国日韩精品**专区| 亚洲欧美国产精品专区久久| 亚洲第一av在线| 成人免费在线视频网站| 国产精品久久久久久一区二区| 国产一区二区三区在线看| 久久夜色精品亚洲噜噜国产mv| 亚洲天堂av在线播放| 久久久人成影片一区二区三区观看| 国产精品一区二区久久| 亚洲影院污污.| 激情成人中文字幕| 亚洲国内精品在线| 久久久久久久爱| 一区二区三区无码高清视频| 韩国三级电影久久久久久| 日韩av在线网页| www.国产精品一二区| 亚洲欧洲日产国产网站| 亚洲人成伊人成综合网久久久| 日韩**中文字幕毛片| 成年无码av片在线| 中国人与牲禽动交精品| 国产精品高精视频免费| 亚洲精品一区二区三区不| 午夜精品久久久久久久白皮肤| 国产欧美一区二区三区视频| 久久久久久噜噜噜久久久精品| 日韩在线不卡视频| 国产欧美日韩精品在线观看| 成人免费黄色网| 亚洲欧美激情另类校园| 精品久久中文字幕久久av| 久久久久久久久久婷婷| 国产精品狼人色视频一区| 亚洲性视频网址| 日韩欧美中文第一页| 国产91精品黑色丝袜高跟鞋| 91精品国产91久久久久久最新| 中文字幕亚洲自拍| 992tv在线成人免费观看| 国产精品免费看久久久香蕉| 欧美在线观看日本一区| 91精品免费久久久久久久久| 久久国内精品一国内精品| 日韩精品中文字幕视频在线| 91麻豆桃色免费看| 欧美精品久久久久久久久| 91在线|亚洲| 欧美午夜性色大片在线观看| 亚洲福利视频久久| 91精品在线观看视频| 欧美在线观看网站| 久久成年人免费电影| 亚洲国产精品一区二区久| 欧美一区视频在线| 日韩中文娱乐网| 日韩欧美一区二区在线| 中文字幕9999| 日韩成人av网| 午夜精品久久久久久99热| 久久久中精品2020中文| 国产精品视频网站| 亚洲国产精品久久久| 欧美成人精品在线视频| 日产精品99久久久久久| 成人免费淫片视频软件| 日韩在线观看免费高清完整版| 中文字幕精品www乱入免费视频| 国产91精品黑色丝袜高跟鞋| 成人午夜激情网| 亚洲性视频网址| 日韩精品亚洲视频| 亚洲人成电影网站| 欧美日韩国产精品一区| 亚洲激情小视频| 日本伊人精品一区二区三区介绍| 亚洲视频一区二区| 欧美日韩国产精品一区二区不卡中文| 美女国内精品自产拍在线播放| 国自在线精品视频| 精品无人国产偷自产在线| 日韩一区二区三区xxxx| 成人黄色免费网站在线观看| 97超碰国产精品女人人人爽| 91久久久久久久久久久久久| 在线播放亚洲激情| 亚洲a级在线观看| 日韩精品欧美国产精品忘忧草| 成人午夜两性视频| 日韩欧美在线国产| 精品美女久久久久久免费| 国产精品久久久久久久午夜| 91久久综合亚洲鲁鲁五月天| 日韩精品久久久久久久玫瑰园| 日本亚洲精品在线观看| 国产精品偷伦视频免费观看国产| 国产成人精品一区| 91成人天堂久久成人| 国产精品亚洲综合天堂夜夜| 亚洲国产毛片完整版| 夜夜嗨av色综合久久久综合网| 国产在线精品自拍| 欧美午夜片欧美片在线观看| 亚洲国产欧美久久| 色99之美女主播在线视频| 国产色婷婷国产综合在线理论片a| 91久久精品美女高潮| 66m—66摸成人免费视频| 国产视频久久网| 欧美另类极品videosbest最新版本| 成人h片在线播放免费网站| 亚洲自拍小视频| 国产精品久久久久久久久| 亚洲激情电影中文字幕| 色老头一区二区三区在线观看| 色樱桃影院亚洲精品影院| 人人爽久久涩噜噜噜网站| 在线观看精品自拍私拍| 欧美人在线视频| 日韩精品免费一线在线观看| 亚洲天堂免费在线| 亚洲美女动态图120秒| 久久久天堂国产精品女人| 日韩久久精品电影| 国产视频精品va久久久久久| 国产美女被下药99| 亚洲一区二区久久| 一个人看的www久久| 日韩中文字幕在线播放| 国产欧美一区二区三区久久人妖| 亚洲综合日韩在线| 成人黄色在线免费| 久久久精品2019中文字幕神马| 国产精品久久久久久久天堂| 日韩高清电影免费观看完整| 国产欧美精品一区二区三区-老狼| 日韩视频免费观看| 日av在线播放中文不卡| www日韩中文字幕在线看| 91精品国产91久久久久久吃药| 欧美中文字幕在线观看| 国产最新精品视频| 国产欧美精品久久久| 国产mv免费观看入口亚洲| 自拍偷拍亚洲精品|