关于动态指定控件的时间响应函数的问题(100分)

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

ZeeGee

Unregistered / Unconfirmed
GUEST, unregistred user!
为了使用在运行时动态Create的控件,就必须动态的指定响应事件的函数。比方说
TNotifyEvent,如果查看他的定义,都是procedure (xx) of Object,这是个什么
东东呢?如果把一个函数指派给一个事件,那么这个函数除了和那个事件的响应函
数参数列表一致,还必须满足什么条件呢?比方说我定义一个procedure OnClick
(Sender:TObject);然后把它指派给一个TButton的OnClick。如果这个函数定义为
Form的子函数,那么就可以正确响应,如果函数直接定义在Unit里面,就没有反应
这是为什么呢?请大家指教,谢谢!
 
你定义在UNIT里面,他不是这个Form的成员函数,当然就不能给Form分配消息(个人理解)
你的自定义过程只要参数一致,定义在Form里面,就可以正确响应了,前面讨论过这个问题
 
因为在窗体上的控件的消息是由他的父窗体派发的!也就是说,他的父窗体先截获这个消息
然后判断是否是自己容器中的某个控件的,如果是则直接传递给该控件,如果是自己的则截留下来
具体可看WINDOWS消息循环中关于消息传递规则的说明!
 
我觉得不是这样的,因为一个控件的OnXXX消息响应函数其实是个函数的指针。比如当使用
Form.OnClick = ClickEventHandler;这样的赋值的时候,实际上是把ClickEventhandler
的函数的指针保存在了Form.OnClick这个变量里面,然后当鼠标点击的消息被触发的时候
消息由Windows系统进入了VCL的消息转发机制里面,从而触发了TForm类本来的响应Click
事件的处理函数,然后这个处理函数再判断OnClick这个指针是否已经被分配。如果是,
那么再去触发OnClick所指向的那个函数。
 
定义 procedure (xx) of object;已经说明一切了。 那就是你的函数/过程必须是类方法(必须定义在某个类里)而不能是普通函数/过程。
因为这牵涉到编译器生成的调用代码。
为便于理解,你可以认为普通函数/过程生成的是一个32位入口地址。
类方法是64位指针(前32位指向类实例, 后32位指向具体函数/过程的入口),
当然实际上类方法仍然是32位入口地址, 只不过它隐含把对象地址压栈了。
 
后退
顶部