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

首頁 > 編程 > Delphi > 正文

DELPHI中的消息處理機制

2019-11-18 18:50:57
字體:
來源:轉載
供稿:網友
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 中 用 戶 可 以自 定 義 消 息 及 消 息 處 理 句 柄. 消 息 處 理 句 柄 的 定 義 有 如 下幾 個 原 則:

  消 息 處 理 句 柄 方 法 必 須 是 一 個 過 程, 且 只 能 傳 遞 一 個Tmessage 型 變 量 參 數.
  方 法 聲 明 后 要 有 一 個message 命 令, 后 接 一 個 在0 到32767 之 間的 消 息 標 號( 整 型 常 數).
  消 息 處 理 句 柄 方 法 不 需 要 用override 命 令 來 顯 式 指 明 重 載祖 先 的 一 個 消 息 處 理 句 柄, 另 外 它 一 般 聲 明 在 構 件 的protected 或private 區.
  在 消 息 處 理 句 柄 中 一 般 先 是 用 戶 自 己 對 消 息 的 處 理, 最 后用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;
三. 過 濾 消 息
  過 濾 消 息 又 稱 消 息陷 阱。 在 一 定 情 況 下, 用 戶 可 能 需 要 屏 蔽 某 些 消 息. 或 者截 獲 某 些 消 息 進 行 處 理。 由 以 上 介 紹 可 以 看 出 過 濾 消 息一 般 有 三 種 途 徑:(1). 重 載 構 件 繼 承 的 虛 擬 方 法wndproc. (2). 針 對 某 消 息 編 寫 消 息 處 理 句 柄. (3). 重 載 構 件 繼 承 的 虛 擬方 法Defhandler, 在 其 中 對 消 息 進 行 處 理。 其 中 常 用 的 方 法是 方 法(2), 在 上 節 中 已 介 紹 過 了, 方 法(1) 與 方 法(3) 相 似,這 里 只 簡 單 介 紹 一 下 方 法(1)。

重 載 虛 擬 方 法wndproc 的 一 般 過 程 如 下:

procedure Tmyobject.wndproc(var message:Tmessage);

begin

{... 判 斷 此 消 息 是 否 該 處 理..}

inherited wndproc(message);

{ 未 處 理 的 消 息 交 由 父 輩wndproc 方 法 處 理}

end;
  由 此 可 以 看 出 在wndproc 方 法 中 處 理 消 息 的 優 勢 是 可 以 過 濾 整 個 范 圍 內 的 消 息,而 不 必 為 每 個 消 息 指 定 一 個 處 理 句 柄, 事 實 上Tcontrol 構 件中 就 是 利 用 它 來 過 濾 并 處 理 所 有 的 鼠 標 消 息 的( 從WM_mousefirst 到WM_mouselast, 如 下 代 碼 示). 同 樣 利 用 它 也 可 以 阻 止 某 些 消息 被 發 送 給 處 理 句 柄。

procedure TControl.WndProc(var Message: TMessage);

begin

if (Message.Msg>=WM_MOUSEFIRST) and

(Message.Msg <= WM_MOUSELAST)

then

if Dragging then { 處 理 拖 曳 事 件}

DragMouseMsg(TWMMouse(Message))

else

... { 處 理 其 他 鼠 標 消 息}

end;

Dispatch(Message);

{ 否 則 正 常 發 送 消 息}

end;
下 例 為 一 簡 單 的 自定 義 構 件 例 子 :

  Tmyedit 類 是 從Tedit 類 派 生 出 的 一 個 新 類, 它 的 特 點 是 在 運 行 中 不 能 獲 得 焦點, 不 能 由 鍵 盤 輸 入( 有 點 類 似Tlabel 構 件). 我 們 可 在 其wndproc 方 法 中 過 濾 出WM_setfocus,WM_mousemove 消 息 并 進 行 處 理 來 達 到上 述 要 求, 源 程 序 如 下:

unit myedit;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs,

StdCtrls;

type

Tmyedit = class(TEdit)

private

{ Private declarations }

protected

{ Protected declarations }

{ other fields and methods}

procedure wndproc(var message:Tmessage);override;

public

{ Public declarations }

published

{ Published declarations }

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Samples', [Tmyedit]);

end;

procedure Tmyedit.wndproc(var message:tmessage);

begin

if message.msg=wm_mousemove then

begin

cursor:=crarrow;

{ 設 置 光 標 為crarrow, 而 不 是 缺 省 的crBeam 光 標}

exit;

end;

if message.msg=wm_SetFocus then exit;

{屏蔽掉WM_setfocus消息,不讓Tmyedit控件獲得輸入焦點}

inherited wndproc(message);

{其他消息交父輩wndproc處理}

end;

end.
您可以將Tmyedit 加到Component Palette中檢驗其性能。

  由以上介紹可以看出,只有清楚了Delphi VCL中的消息處理機制, 掌握好處理各種消息的方法和時機(必要時要借助各種工具, 如winsight32,spy 等),并結合OOP語言的特點, 我們才可能編出高質量的構件。 這當然要靠讀者在實踐中不斷摸索,積累經驗.

上一篇:使用Delphi獲取系列信息

下一篇:Delphi的TRegistry注冊表類方法詳解

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线| 国产欧美一区二区三区在线| 亚洲开心激情网| 亚洲欧美成人一区二区在线电影| 亚洲色图偷窥自拍| 国产+人+亚洲| 午夜精品美女自拍福到在线| 国产日韩精品电影| 97视频在线看| 欧美猛男性生活免费| 伊人伊成久久人综合网小说| 91久久精品视频| 国产精品69久久| 亚洲深夜福利网站| 中文字幕不卡在线视频极品| 国产精品激情av电影在线观看| 亚洲图片制服诱惑| 亚洲最大福利网站| 欧洲午夜精品久久久| 欧美激情欧美激情| 久久色精品视频| 成人a免费视频| 91亚洲永久免费精品| 日韩精品在线观看一区| 亚洲综合日韩在线| 亚洲视频日韩精品| 国产精品美女久久久久久免费| 日韩电视剧免费观看网站| 久久久久www| 国内精品久久久久久影视8| 中文字幕欧美专区| 欧美做爰性生交视频| 成人淫片在线看| 亚洲图片欧美日产| 久久久av亚洲男天堂| 丁香五六月婷婷久久激情| 3344国产精品免费看| 国产欧美精品一区二区三区介绍| 国产乱肥老妇国产一区二| 亚洲精品日韩激情在线电影| 成人自拍性视频| 中文字幕日韩有码| 日韩麻豆第一页| 成人免费淫片aa视频免费| 国产视频精品久久久| 久久在线免费视频| 欧美一区二粉嫩精品国产一线天| 国产91色在线|免| 97视频在线观看亚洲| 欧美日韩中文字幕| 国语对白做受69| 亚洲欧美在线播放| 国产成人91久久精品| 国产精品第一视频| 欧美另类69精品久久久久9999| 日韩av免费看网站| 日韩欧美亚洲综合| 亚洲精品视频免费在线观看| 精品久久久久久久大神国产| 久久亚洲电影天堂| 亚洲欧美国产制服动漫| 68精品国产免费久久久久久婷婷| 亚洲第一天堂无码专区| 日韩av在线网址| 中文字幕欧美视频在线| 成人网址在线观看| 亚洲第一区第一页| 国内自拍欧美激情| 日本高清不卡的在线| 国产精品第100页| 欧美激情视频一区| 91精品视频观看| 69视频在线播放| 中文字幕在线视频日韩| 中文字幕亚洲欧美日韩高清| 尤物yw午夜国产精品视频| 国产精品久久久久久av福利软件| 亚洲成人av中文字幕| 美女撒尿一区二区三区| 欧美放荡办公室videos4k| 高跟丝袜一区二区三区| 国产精品99久久久久久久久久久久| 国产综合香蕉五月婷在线| 亚洲国产高清福利视频| 欧美精品做受xxx性少妇| 亚洲精品国产品国语在线| 亚洲女成人图区| 久久人人爽人人爽人人片av高清| 欧美精品18videos性欧| 日韩精品视频在线观看网址| 亚洲成色777777在线观看影院| 欧美性生交大片免网| 日韩精品在线看| 中文字幕亚洲欧美日韩2019| 亚洲欧洲美洲在线综合| 亚洲视频网站在线观看| 久久久99免费视频| 久久精品视频亚洲| 欧美午夜精品伦理| 久久久久久一区二区三区| **欧美日韩vr在线| 日韩av影视在线| 91中文在线观看| 97色在线观看| 久久影视电视剧凤归四时歌| 亚洲日本中文字幕免费在线不卡| 91精品久久久久| 亚洲一区二区三| 亚洲精品ady| 国产精品av在线| 亚洲精品成人久久| 欧美日韩国产成人在线观看| 日韩av观看网址| 亚洲影视九九影院在线观看| 成人激情视频网| 亚洲天堂网在线观看| 日韩亚洲成人av在线| 日韩经典中文字幕在线观看| 日本欧美国产在线| 亚洲一区二区免费| 久久韩剧网电视剧| 亚洲精品美女在线观看播放| 国产精品久久久91| 日韩经典中文字幕在线观看| 亚洲午夜久久久影院| 国产精品盗摄久久久| 成人精品视频久久久久| 麻豆乱码国产一区二区三区| 亚洲精品美女免费| 欧美性猛交xxxxx水多| 在线免费看av不卡| 亚洲人成网站色ww在线| 国内精品国产三级国产在线专| 欧美理论在线观看| 国产91免费看片| 国产精品扒开腿爽爽爽视频| 91精品视频在线播放| 国外成人在线直播| 国产丝袜一区视频在线观看| 日韩动漫免费观看电视剧高清| 国产日韩欧美另类| www.日韩欧美| 亚洲高清av在线| 精品香蕉在线观看视频一| 亚洲成人教育av| 亚洲精品一区中文字幕乱码| 欧美在线视频免费播放| 91亚洲永久免费精品| 疯狂欧美牲乱大交777| 亚洲欧美精品一区| 国产精品白嫩美女在线观看| 欧美日韩国产一中文字不卡| 国产成人亚洲综合| 日本精品在线视频| 国产在线视频一区| 亚洲色图欧美制服丝袜另类第一页| 欧美成人免费小视频| 性色av香蕉一区二区| 亚洲黄色av女优在线观看| 97超级碰碰人国产在线观看| 亚洲激情在线观看视频免费| 国产精品678| 最近2019年日本中文免费字幕| 九色精品美女在线|