DELPHI中的消息處理機制

Delphi 是Borland 公 司 提 供 的 一 種 全 新 的WINDOWS 編 程 開 發 工 具. 由 于 它 采 用 了 具 有 彈性 的 和 可 重 用 的 面 向 對 象Pascal(object-oriented pascal) 語 言, 並 有 強 大 的 數 據 庫 引 擎(BDE), 快 速 的 代 碼 編 譯 器, 同 時 又 提 供 了 衆 多 出 色 的 構 件. 受 到 廣 大 編 程 人 員 的 青 睐. 在 衆 多 的 編 程 語 言( 如VB,PowerBuilder,Powerpoint 等) 中 脫 穎 而 出. 其 中 一 個DELPHI 強 于 其 他 編 程 語 言( 如VB4.0) 的 地 方 就 是 在DELPHI 中 可 自 定 義 消 息, 並 可 直 接 處 理 消 息. 這 對 于 那 些 希 望 編 寫 自 己 的 構 件(Component), 或 者 希 望 截 獲. 過 濾 消 息 的 用 戶 來 說 是 必 不 可 少 的. 因 爲 編 寫 構 件 一 般 要 對 相 應 的 消 息 進 行 處 理. 下 面 就 對Delphi 中 消 息 處 理 機 制 進 行 一 下 介 紹。

一.DELPHI VCL 中 消 息 的 傳 遞

Delphi 中 每 一 個VCL(Visual Component Library) 構 件( 如Tbutton,Tedit 等) 都 有 一 內 在 的 消 息 處 理 機 制, 其 基 本 點 就 是 構 件 類 接 收 到 某 些 消 息 並 把 它 們 發 送 給 適 當 的 處 理 方 法, 如 果 沒 有 特 定 的 處 理 方 法, 則 調 用 缺 省 的 消 息 處 理 句 柄。

其 中mainwndproc 是 定 義 在Twincontrol 類 中 的 一 個 靜 態 方 法, 不 能 被 重 載(Override)。 它 不 直 接 處 理 消 息, 而 是 交 由wndproc 方 法 處 理, 並 爲wndproc 方 法 提 供 一 個 異 常 處 理 模 塊。Mainwndproc 方 法 聲 明 如 下:

procedure MainWndProc(var Message: TMessage);

Wndproc 是 在Tcontrol 類 中 定 義 的 一 個 虛 擬 方 法, 由 它 調 用dispatch 方 法 來 進 行 消 息 的 分 配, wndproc 方 法 聲 明 如 下:

procedure WndProc(var Message: TMessage); virtual;

dispatch 方 法 是 在Tobject 根 類 中 定 義 的, 其 聲 明 如 下:

procedure Tobject.dispatch(var Message); 傳 遞 給dispatch 的 消 息 參 數 必 須 是 一 個 記 錄 類 型, 且 這 個 記 錄 中 第 一 個 入 點 必 須 是 一 個cardinal 類 型 的 域(field), 它 包 含 了 要 分 配 的 消 息 的 消 息 號 碼. 例 如:

type

Tmessage=record

Msg:cardinal;

wparam:word;

lparam:longint; .

result:longint;

end;

而Dispatch 方 法 會 根 據 消 息 號 碼 調 用 構 件 的 最 後 代 類 中 處 理 此 消 息 的 句 柄 方 法. 如 果 此 構 件 和 它 的 祖 先 類 中 都 沒 有 對 應 此 消 息 的 處 理 句 柄,Dispatch 方 法 便 會 調 用Defaulthandler 方 法.Defaulthandler 方 法 是 定

義 于Tobject 中 的 虛 擬 方 法, 其 聲 明 如 下:

procedure Defaulthandler(var Message);virtual;

Tobject 類 中 的Defaulthandler 方 法 只 是 實 現 簡 單 的 返 回 而 不 對 消 息 進 行 任 何 的 處 理. 我 們 可 以 通 過 對 此 虛 擬 方 法 的 重 載, 在 子 類 中 實 現 對 消 息 的 缺 省 處 理. 對 于VCL 中 的 構 件 而 言, 其Defaulthandler 方 法 會 啓動 windows API 函 數Defwindowproc 對 消 息 進 行 處 理.

二.DELPHI 中 的 消 息 處 理 句 柄

在DELPHI 中 用 戶 可 以 自 定 義 消 息 及 消 息 處 理 句 柄. 消 息 處 理 句 柄 的 定 義 有 如 下 幾 個 原 則:

1.消 息 處 理 句 柄 方 法 必 須 是 一 個 過 程, 且 只 能 傳 遞 一 個Tmessage 型 變 量 參 數.

2.方 法 聲 明 後 要 有 一 個message 命 令, 後 接 一 個 在0 到32767 之 間 的 消 息 標 號( 整 型 常 數).

3.消 息 處 理 句 柄 方 法 不 需 要 用override 命 令 來 顯 式 指 明 重 載 祖 先 的 一 個 消 息 處 理 句 柄, 另 外 它 一 般 聲 明 在 構 件 的protected 或private 區.

4.在 消 息 處 理 句 柄 中 一 般 先 是 用 戶 自 己 對 消 息 的 處 理, 最 後 用inherited 命 令 調 用 祖 先 類 中 對 應 此 消 息 的 處 理 句 柄( 有 些 情 況 下 可 能 正 相 反).

由 于 可 能 對 祖 先 類 中 對 此 消 息 的 處 理 句 柄 的 名 字 和 參 數 類 型 不 清 楚, 而 調 用 命 令inherited 可 以 避 免 此 麻 煩, 同 樣 如 果 祖 先 類 中 沒 有 對 應 此 消 息 的 處 理 句 柄,inherited 就 會 自 動 調 用Defaulthandler 方 法.( 當 然 如 果 要 屏 蔽 掉 此 消 息, 就 不 用inherited 命 令 了)。

消 息 處 理 句 柄 方 法 聲 明 爲:

procedure Mymsgmethod(var message:Tmessage); message Msgtype;

同 樣 用 戶 也 可 以 定 義 自 己 的 消 息, 用 戶 自 定 義 消 息 應 從WM_USER 開 始.

自 定 義 消 息 及 消 息 處 理 句 柄 舉 例 如 下:

const my_paint=Wm_user+1;

type

Tmypaint=record

msgid:cardinal;

msize:word;

mcolor:longint;

msgresult:longint;

end;

type

Tmycontrol=class(TCustomControl)

protected

procedure change(var message:Tmypaint); message my_paint;

.....

end;

......

procedure Tmycontrol.change(var message:Tmypaint);

begin

size:=message.msize; { 設 置Tmybutton 尺 寸 屬 性}

color:=message.mcolor; { 設 置Tmybutton 顔 色 屬 性}

{do something else}

inherited; { 交 由Tcustomcontrol 處 理}

end;

DELPHI中的消息處理機制
Delphi 是Borland 公 司 提 供 的 一 種 全 新 的WINDOWS 編 程 開 發 工 具. 由 于 它 采 用 了 具 有 彈性 的 和 可 重 用 的 面 向 對 象Pascal(object-oriented pascal) 語 言, 並 有 強 大 的 數 據 庫 引 擎(B...查看完整版>>DELPHI中的消息處理機制
 
DELPHI中的消息處理機制
DELPHI中的消息處理機制   Delphi是Borland公司提供的一種全新的WINDOWS編程開發工具.由于它采用了具有彈性的和可重用的面向對象Pascal(object-oriented pascal)語言,並有強大的數據庫引擎(BDE), 快速的代碼編譯器...查看完整版>>DELPHI中的消息處理機制
 
VCL消息處理機制的內幕
由VCL中的代碼理解VCL中的消息處理機制Delphi,一個非常優秀的開發工具,擁有強大的可視化開發環境、面向組件的快速開發模式、優秀的VCL類庫、快速的代碼編譯器、強大的數據庫和WEB開發能力、還有衆多的第三方控件支...查看完整版>>VCL消息處理機制的內幕
 
Delphi中的消息鈎子函數和Windows子類處理 入門篇
首先感謝各位老鳥這麽久以來對小弟那麽多的指導,給小弟提供N多的幫助,所以才能讓我的第一篇技術文章可以這麽快和大家見面!也趁今天是小弟20歲生日呵呵,沒人給我慶祝,所以寫篇文章做個紀念,也祝我自己生日快樂!...查看完整版>>Delphi中的消息鈎子函數和Windows子類處理 入門篇
 
Delphi 消息機制引入的一個副作用
Delphi 在處理進程的消息時引入了一個隱藏的窗體Application ,借此進行消息的分發。這樣的機制優美的處理了消息的分發和處置的問題。但是最近我發現這個機制也引入了一個副作用,會在某些情況下影響程序的界面交互行...查看完整版>>Delphi 消息機制引入的一個副作用
 
Delphi 消息機制引入的一個副作用
Delphi 在處理進程的消息時引入了一個隱藏的窗體Application ,借此進行消息的分發。這樣的機制優美的處理了消息的分發和處置的問題。但是最近我發現這個機制也引入了一個副作用,會在某些情況下影響程序的界面交互行...查看完整版>>Delphi 消息機制引入的一個副作用
 
Delphi 消息機制學習筆記
最近幾天又將李維《Inside VCl》書中關于 Delphi 中 Windows 消息機制的實現看了一遍,這是第二遍了,本來看第一遍時已經完全看懂了,但沒做筆記,害得我又看了一遍,這回下定決心寫一個筆記。與此同時,我在網上遊蕩...查看完整版>>Delphi 消息機制學習筆記
 
Delphi關于線程的消息處理
在平時寫程序時,總是碰到窗體(TForm)與線程(TThread)消息通信問題。令人煩惱的是窗體不能向線程(TThread)發送消息(線程沒有窗口句柄)。經過幾天的折騰,想出二種解決方案,拿出來跟大家探討探討。第一。我們...查看完整版>>Delphi關于線程的消息處理
 
delphi的屬性property和消息處理特點事件屬性。
Delphi 中的屬性property(適合初學delphi)Propery In Delphi 前言:適合delphi初學者,有面向對象知識和java或者vc編程經驗人士閱讀。一普通屬性我們在delphi的類中常常能看到這樣的代碼:propert property 屬性名...查看完整版>>delphi的屬性property和消息處理特點事件屬性。
 
 
回到王朝網路移動版首頁