有关Windows消息中的Inherited问题。 (50分)

  • 主题发起人 主题发起人 balaschen
  • 开始时间 开始时间
B

balaschen

Unregistered / Unconfirmed
GUEST, unregistred user!
请看如下代码:
procedure TForm2.WMNCHitTest(var M: TWMNCHitTest);
begin
Inherited;//下面的语句起作用
if (M.Result=HTClient) then
begin
M.Result:=HTCaption;
end;
//Inherited,如Inherited写在这,则上面的语句不起作用。
end;

procedure TForm2.WMLButtonDown(var M: TWMLButtonDown);
begin
SendMessage(Handle,WM_NCLBUTTONDown,HTCaption,GetMessagePos);
//不管写不写Inerited,或写前写后,上面的语句均起作用。
end;
究竟Inherited写先写和后写有什么区别?
 
inherited的意思是继承,
就是说继承父控件的相应方法,
inherited写在前面,则函数首先执行父控件的相应方法,
然后执行当前函数,
inherited写在后面,则函数首先执行当前语句,最后执行
父控件的相应方法,
不写inherited,则函数不执行父控件的方法。
现在分析一下你的写法:
WMNCHitTest函数中,inherited语句写在后面时,
由于父控件的相应方法中更改了m.result的值,
所以你的语句就不起作用了!
 
究竟Inherited写先写和后写有什么区别?
----先写,先执行父类的相应方法
----后写, 后执行父类的相应方法

procedure TForm2.WMNCHitTest(var M: TWMNCHitTest);
begin
Inherited;//下面的语句起作用
------这是毫无疑问的.
if (M.Result=HTClient) then
begin
M.Result:=HTCaption;
end;
//Inherited,如Inherited写在这,则上面的语句不起作用。
------虽然没去看源码, 但有一点肯定的是, M.Result被父类(也可能是祖父类...)
修改了.
end;

procedure TForm2.WMLButtonDown(var M: TWMLButtonDown);
begin
SendMessage(Handle,WM_NCLBUTTONDown,HTCaption,GetMessagePos);
//不管写不写Inerited,或写前写后,上面的语句均起作用。
-----这是当然,SendMessage 直接把消息发送给了目标窗口(这里是FORM2),
并立即返回, 不管后面干了啥, 对这个消息一般来说没有影响.
特别说明:
消息情况只是一个特例.
inherted摆在前面后面到底有什么影响, 完全取决于你到底干了什么。
这纯粹是个程序的流程问题。
比如,你先写了个X := 10, 后调用了一个方法(比如inherited),
修改了这个X := 9,你看到的效果是inherited摆在后面,X := 10不起作用,
但如果后面调用的这个方法, 对X没有做任何操作(正确地说法是,
没有修改X的值),你看到的效果是inherited摆在后面,X := 10起作用。
自己再揣摩揣摩吧!
end;
 
由于明天就要放假,我还想听听其他大侠的看法,待我春节过后再来结束。
老家无法上网W~~~~~W~~~~~~
 
多人接受答案了。
 
后退
顶部