原创文章转载请注明出处
说明:说的比较粗...以后有时间会逐渐把VCF里面的知识点全部一一道出.
以配置文件读取为例:
delegate读取过程
1:从文件读到delegates的信息,并保存起来
其中:
callbackIds等于委托的对象名和委托的地址,如:AcfWindow@AcfWindow::click
delegateName为委托名,代表是什么事件,比如ButtonClick
source即是源.
循环每一个委托
根据对象名找到此对象的地址.如果没有找到,就到上一层去找.
这里面的rootComponent_是在abstractapplication里面注册的.所以最上面一层是application,最上层也没有的话.查找失败.
2:将文件配置的委托信息,进行注册
由于上面找到了对象地址.现在开始查找对象里面的函数地址.如果找到则add到自己的Delegate里面去
注意:
函数( callback)可以被许多个委托所拥有.
委托(delegate)也可以同时委托很多函数( callback)保存在functions.
在add的过程中会有这样的代码.
delegate注册过程.
上面提到查找类,查找函数,既然要被查找到.首先得有一个注册的过程.
注册类就是RTTI相关宏.
注册函数:要在callback集合中添加这个函数,这里使用addCallback函数来完成
首先生成一个callback,用来管理执行函数,接着就把这个callback添加到自己的callback_集合中去.
这里的callback_将在上面的delegate查找函数地址的时候会用到.
至此,我们的delegate和callback都添加好了
摘抄了点日志:
---- callbacks_ = 0x498520 add callback name onClose
---- Delegate add callback.source = 0x498520, name onClose
---- callbacks_ = 0x498520 add callback name Frame::handleEvent
---- Delegate add callback.source = 0x498520, name Frame::handleEvent
---- callbacks_ = 0x498520 add callback name dosth
---- Delegate add callback.source = 0x498520, name dosth
---- callbacks_ = 0x498520 add callback name AcfWindow::click
---- callbacks_ = 0x49a4f0 add callback name AbstractWin32Component::onControlFontChanged
---- Delegate add callback.source = 0x49a4f0, name AbstractWin32Component::onControlFontChanged
---- callbacks_ = 0x49a850 add callback name CommandButton::onFocusGained
---- Delegate add callback.source = 0x49a850, name CommandButton::onFocusGained
---- callbacks_ = 0x49a850 add callback name CommandButton::onFocusLost
---- Delegate add callback.source = 0x49a850, name CommandButton::onFocusLost
验证一下 dosth的callback和delegate.看到了一致性了吧
delegate执行过程:
以click事件为例,我们首先到事件的发送地方去
发现了commandbutton->ckick();再往里面看
首先构造一个event包含自己的this,当做参数执行Buttonclicked
Buttonclicked 的来历是这样的.
DELEGATE(ButtonDelegate,ButtonClicked);
这个宏展开后有一句是ButtonDelegate ButtonClicked;
说明ButtonClicked是一个delegate.
由于delegate重载了operator().所以就直接执行到了delegate的invoke.而event则是参数.
下面是执行代码:
其中getcallback里面的functions就是delegate保存的callback列表
以上是从配置档里面分析delegate的执行过程.