本文为【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 弹tan性xing 的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 块kuai。Mainwndproc 方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 启qi动dong 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;
【原文】