| 订阅 | 在线投稿
分享
 
 
 

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;
󰈣󰈤
 
 
>>返回首页<<
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 
 热帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
©2005- 王朝网络 版权所有