继承调用的问题 ( 积分: 30 )

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
在TWinControl类的WMPAINT()方法中:
procedure TWinControl.WMPaint(var Message:TWMPAINT);
var
DC,MemDC:HDC;
...
begin
if not FDoubleBuffered or (Message.DC<>0) then
begin
if .... then
[red]inherited;[/red]
else
...
end;
请问inherited在这里有什么用呢?TWinControl的父类都没有WMPAINT这个方法。这里为何要继承调用呢?
 
在TWinControl类的WMPAINT()方法中:
procedure TWinControl.WMPaint(var Message:TWMPAINT);
var
DC,MemDC:HDC;
...
begin
if not FDoubleBuffered or (Message.DC<>0) then
begin
if .... then
[red]inherited;[/red]
else
...
end;
请问inherited在这里有什么用呢?TWinControl的父类都没有WMPAINT这个方法。这里为何要继承调用呢?
 
这是消息,和普通的继承有点区别,消息里面可以直接用inherited让父类来接受和处理消息。如果父类没有消息处理函数,则消息被抛弃。
 
父类没有处理消息,则消息会被Defaulthandler方法处理吧?
 
呵呵,对,说错了,见谅。
 
消息处理函数在delphi中和dynamic函数/过程是一样的,用ID号来查找函数入口地址
大家清楚MESSAGE是一个双字节值,DYNAMIC的ID同样
双字节的表示范围0 - 65535,即0000 - FFFF
声明一个dynamic过程,将自动分配一个在C000 - FFFF之间的ID(逆序从FFFF开始,也就是有符号数的-1)
而声明一个message处理过程,将直接分配给message后面的号码,从1 - BFFF
这样划分的结果是:WINDOWS消息可使用的范围不超过49151
(1 - 49151,WINDOWS本身没有此限,好在基本没人会用到49151以上的消息值);
dynamic过程在一个类及其派生类中最多可以使用16384个(也不可能用到这么多)
这样,windows消息处理过程就被编在了动态过程/函数的队伍中了
不过,一般动态过程/函数的重载,要求名称和原型相同,即可分得相同ID号
而用了message关键字指示的消息处理过程,只要message后面的值相等即实现了重载(一般要求参数为TMessage)
VCL在接收到消息后,将消息ID作为dynamic ID查找过程入口点,子类至父类,一直找至根类
还没有找到,则调用DefaultHandler
对一般的动态调用,查找过程相同,找到不时可能引发异常
(只是可能:)我猜的,具体怎么实现的有空我还得看看VCL源码,用abstract时才有可能出现)
 
十分感谢!
 
后退
顶部