| 订阅 | 在线投稿
分享
 
 
 

DELPHI中的消息处理机制

来源:互联网网民  宽屏版  评论
2006-12-16 17:27:52

本文为【DELPHI中的消息处理机制】的汉字拼音对照版显示拼音

Delphi shiBorland gong si ti gong de yi zhong quan xin deWINDOWS bian cheng kai fa gong ju. you yu ta cai yong le ju you tanxing de he ke chong yong de mian xiang dui xiangPascal(object-oriented pascal) yu yan, bing you qiang da de shu ju ku yin qing(BDE), kuai su de dai ma bian yi qi, tong shi you ti gong le zhong duo chu se de gou jian. shou dao 广guang da bian cheng ren yuan de qing lai. zai zhong duo de bian cheng yu yan( ruVB,PowerBuilder,Powerpoint deng) zhong tuo ying er chu. qi zhong yi geDELPHI qiang yu qi ta bian cheng yu yan( ruVB4.0) de di fang jiu shi zaiDELPHI zhong ke zi ding yi xiao xi, bing ke zhi jie chu li xiao xi. zhe dui yu na xie xi wang bian xie zi ji de gou jian(Component), huo zhe xi wang jie huo. guo lv xiao xi de yong hu lai shuo shi bi bu ke shao de. yin wei bian xie gou jian yi ban yao dui xiang ying de xiao xi jin xing chu li. xia mian jiu duiDelphi zhong xiao xi chu li ji zhi jin xing yi xia jie shao

yi.DELPHI VCL zhong xiao xi de chuan di

Delphi zhong mei yi geVCL(Visual Component Library) gou jian( ruTbutton,Tedit deng) dou you yi nei zai de xiao xi chu li ji zhi qi ji ben dian jiu shi gou jian lei jie shou dao mou xie xiao xi bing ba ta men fa song gei shi dang de chu li fang fa, ru guo mei you te ding de chu li fang fa ze tiao yong que sheng de xiao xi chu li ju bing

qi zhongmainwndproc shi ding yi zaiTwincontrol lei zhong de yi ge jing tai fang fa bu neng bei chong zai(Override) ta bu zhi jie chu li xiao xi er shi jiao youwndproc fang fa chu li bing weiwndproc fang fa ti gong yi ge yi chang chu li mo kuaiMainwndproc fang fa sheng ming ru xia:

procedure MainWndProc(var Message: TMessage);

Wndproc shi zaiTcontrol lei zhong ding yi de yi ge xu ni fang fa, you ta tiao yongdispatch fang fa lai jin xing xiao xi de fen pei, wndproc fang fa sheng ming ru xia:

procedure WndProc(var Message: TMessage); virtual;

dispatch fang fa shi zaiTobject gen lei zhong ding yi de, qi sheng ming ru xia:

procedure Tobject.dispatch(var Message); chuan di geidispatch de xiao xi shen shu bi xu shi yi ge ji lu lei xing, qie zhe ge ji lu zhong di yi ge ru dian bi xu shi yi gecardinal lei xing de yu(field), ta bao han le yao fen pei de xiao xi de xiao xi hao ma. li ru:

type

Tmessage=record

Msg:cardinal;

wparam:word;

lparam:longint; .

result:longint;

end;

erDispatch fang fa hui gen ju xiao xi hao ma tiao yong gou jian de zui hou dai lei zhong chu li ci xiao xi de ju bing fang fa. ru guo ci gou jian he ta de zu xian lei zhong dou mei you dui ying ci xiao xi de chu li ju bing,Dispatch fang fa 便bian hui tiao yongDefaulthandler fang fa.Defaulthandler fang fa shi ding

yi yuTobject zhong de xu ni fang fa, qi sheng ming ru xia:

procedure Defaulthandler(var Message);virtual;

Tobject lei zhong deDefaulthandler fang fa zhi shi shi xian jian dan de fan hui er bu dui xiao xi jin xing ren he de chu li. wo men ke yi tong guo dui ci xu ni fang fa de chong zai, zai zi lei zhong shi xian dui xiao xi de que sheng chu li. dui yuVCL zhong de gou jian er yan, qiDefaulthandler fang fa hui qidong windows API han shuDefwindowproc dui xiao xi jin xing chu li.

er.DELPHI zhong de xiao xi chu li ju bing

zaiDELPHI zhong yong hu ke yi zi ding yi xiao xi ji xiao xi chu li ju bing. xiao xi chu li ju bing de ding yi you ru xia ji ge yuan ze:

1.xiao xi chu li ju bing fang fa bi xu shi yi ge guo cheng, qie zhi neng chuan di yi geTmessage xing bian liang shen shu.

2.fang fa sheng ming hou yao you yi gemessage ming ling, hou jie yi ge zai0 dao32767 zhi jian de xiao xi biao hao( zheng xing chang shu).

3.xiao xi chu li ju bing fang fa bu xu yao yongoverride ming ling lai xian shi zhi ming chong zai zu xian de yi ge xiao xi chu li ju bing, ling wai ta yi ban sheng ming zai gou jian deprotected huoprivate qu.

4.zai xiao xi chu li ju bing zhong yi ban xian shi yong hu zi ji dui xiao xi de chu li, zui hou yonginherited ming ling tiao yong zu xian lei zhong dui ying ci xiao xi de chu li ju bing you xie qing kuang xia ke neng zheng xiang fan.

you yu ke neng dui zu xian lei zhong dui ci xiao xi de chu li ju bing de ming zi he shen shu lei xing bu qing chu, er tiao yong ming linginherited ke yi bi mian ci ma fan, tong yang ru guo zu xian lei zhong mei you dui ying ci xiao xi de chu li ju bing,inherited jiu hui zi dong tiao yongDefaulthandler fang fa. dang ran ru guo yao ping bi diao ci xiao xi, jiu bu yonginherited ming ling le

xiao xi chu li ju bing fang fa sheng ming wei

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

tong yang yong hu ye ke yi ding yi zi ji de xiao xi, yong hu zi ding yi xiao xi ying congWM_USER kai shi.

zi ding yi xiao xi ji xiao xi chu li ju bing ju li ru xia:

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; { she zhiTmybutton chi cun shu xing}

color:=message.mcolor; { she zhiTmybutton yan se shu xing}

{do something else}

inherited; { jiao youTcustomcontrol chu li}

end;

原文
 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
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;
󰈣󰈤
 
 
 
>>返回首页<<
 
 热帖排行
 
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
©2005- 王朝网络 版权所有