唯惟VCL--Button 之深入研究 消息处理(100分)

  • 主题发起人 zw960122
  • 开始时间
Z

zw960122

Unregistered / Unconfirmed
GUEST, unregistred user!
基于http://www.delphibbs.com/delphibbs/dispq.asp?lid=1158681
一帖的发表, 本人再谈今天研究的结果 -- 消息处理
private
FWWOnClick : TNotifyEvent;
published
property WWOnClick : TNotifyEvent read FWWOnClick write FWWOnClick;
上面的代码是对 WWOnClick 的一个说明, 说明它只是一个通知消息。为什么
把它声明成通知消息而不是其它普通属性呢?下面的代码说明了问题。
procedure WWClick;
begin
if Assigned(FOnClick) then FOnClick(Self);
end;
上面的代码是对FOnClick 字段的处理过程, 它只不过是个过程, 再没有任何更多的
可以描述的了。 Only a procedure
procedure WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
// Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;
WMLButtonUp过程是这样声明的
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
在这里是消息处理方法, 这种方法是四种Delphi 方法中的一种, 它可以不通过
procedure WndProc(var Message: TMessage); 这个过程而直接处理指定的消息。
这样, 一个鼠标点击事件就实现了。
以上就是今天的研究成果, 下面是从书上看来的,各位见笑了:
WndProc可以处理所有的消息, 一般来说, 都是一个 Case 语句的处理过程。
在Borland C++ 时代, 这个过程太常见了。 美其名日:消息处理过程(消息循环)。
比如, 点击事件可以这样处理
case Message.Msg of
CN_COMMAND:
FWWOnClick(Self);
end;
很直接吧。 在D 中对很多消息类型做了封装象上面的WM_LBUTTONUP 消息就被
封装成了TWMLButtonUp 类。 这样做只不过是为了处理方便了简单吧。
今天就吹到这儿。

 
有个小问题。在WMLButtonUp 过程里第一行有个 inherited;
注示了它后点击抬不起来, 这不是问题,因为没看到处理过程一定在父类中。
不过再没有父类中有这样的声明了帮助中说:
When inherited has no identifier after it, it refers to the inherited method
with the same name as the enclosing method
没有的话就用封装中同名的方法 ,the enclosing method 在哪儿呢?TMD
inherited 关键字本来就是继承用的。而且明明是相同的名字很多地方还是把名字写上了
比如 inherited create(...) 。为什么呀。
 
inherited create(...) 是只继承父类的哪个方法不一定只的就是CREATE方法
 
我飞了,我没这个意思呀。
 
更明白一点吧。那个inherited跟本就没有更深的封装了,继承的是谁呀?
与父类同名的情况下, 既然没必要将 refer 写明, 为什么D中还是大量的写呀?
而且也不是全写, 为什么呀?
 
不一定只是create 方法有inherited,其他很多方法都有继承的
他继承的是他的父类的inherited 后面的方法,不一定就是同名的
方法,你可以写一个onclick方法, 也可以inherited create()
delphi可能就是为了和这种方法分开才要写清楚后面的方法
 
唉, 我再faint
QQ:26761119
 
隐式是给消息处理过程,显式是给他的父类
 
接受答案了.
 
重用消息处理方法不使用Override指令。
 
顶部