有没有人会解这个 CallBack in Class 问题

bobogg 2017-02-09 08:36:49
Class 正常是无法接受 win API 的 CallBack
因为 AddressOF 无法使用在 Class 里面
有牛人写了一个可以 CallBack in Class 的样板

如下 Timer Class 源碼在 3F, 4F ( http://bbs.csdn.net/topics/392068951 )

这各 Class 里面的注解虽说可以支援很多个 CallBack
但是实际测试, 发现根本只能支持1个 CallBack
因为 Function zb_AddressOf 永远只会回传 1个地址

你写 zb_AddressOf(1, 4) , zb_AddressOf(2, 5) 都回传 相同的地址
难怪也就只能支援1个CallBack

但作者明明提到可以支援多个
不知道有人有办法修正 bug 吗




...全文
240 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-02-18
  • 打赏
  • 举报
回复
malloc,realloc,free
舉杯邀明月 2017-02-10
  • 打赏
  • 举报
回复
记得你以前基本上都是发个20分的提问帖子,这回怎么舍得发40分的了?
舉杯邀明月 2017-02-10
  • 打赏
  • 举报
回复
你用法不对吧。 那个代码,真正“获取函数地址”的接口,是: zAddressOf( ) 你可以试试: 在类中增加一个测试过程TestGetFun( ) (Public的,便于在“别处”调用),然后: Dim nFun As Long nFun = zAddressOf(Me, 1) nFun = zAddressOf(Me, 2) nFun = zAddressOf(Me, 3) 在别处new个实例,然后调用这个接口过程,就可以看到,返回的“函数地址”是不同的。 如果你要用“1个实例实现‘多回调’ ”,那么第3个参数应该是不能省略的。 并且,你需要修改 zb_AddressOf( ) 中的常量定义值: Const MAX_FUNKS As Long = N    这儿的“N”就是需要“支持多少个回调”的数量。 否则你只能用不同的实例对象,实现不同的回调。
赵4老师 2017-02-10
  • 打赏
  • 举报
回复
赵4老师 2017-02-10
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
记得你以前基本上都是发个20分的提问帖子,这回怎么舍得发40分的了?
因为以前一碗拉面5元,现在10元。
bobogg 2017-02-10
  • 打赏
  • 举报
回复
再次感谢 Chen8013 的帮助
舉杯邀明月 2017-02-10
  • 打赏
  • 举报
回复
引用 7 楼 Bobogg 的回复:
. . . . . . . . . . . . . 为何不直接把 MAX_FUNKS 预设值 设定大一点的值呢? 例如 5 原笔者 只是单存为了减少内存耗用 吗???
这些东西,“作者”永远也不可能预测到使用者的所有需求, 因此无论定义多大,都没有“绝对正确”的时候。 如果能理解代码,自然也知道如何去修改以适应自己的需要。 这个是“每一个‘回调’单独的使用一段代码空间”,定义得大了,当然要多消耗些内存。 如果定义得太大,完全是浪费,虽然以目前的内存资源来说,这点浪费的空间也算不上什么, 但是确实没有这样的必要,不如按自己的实际应用需要去设置。 你觉得“5”就一定都够了?说不定某人在某次使用的时候需要8个呢! 于是,你说:那么,定义为10吧,也总共还不到2KB的数据(代码)空间。 是的,可能95%的用途上,只需要1、2个就够了,定义为5也能满足绝大多数人的需要;   定义为10可以说难以碰到不够用的时候了。 但这总会有例外啊,万一哪个人写某个BT一点儿的程序时,需要用到15个回调呢!这个时候他还不是要去改定义值。 总之还是那句话:按实际需要,改一下那个“常量”数值才是王道!  反正你自己的“回调函数”,都要去改一下(添加)函数代码,  那么你同时按需要去改一下那个定义值,又有何不可呢?
bobogg 2017-02-10
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
http://bbs.csdn.net/topics/392084340
赵4老师 以前有很好的回覆 为何现在总是回些奇奇怪怪的? 很可惜耶 http://bbs.csdn.net/topics/390829131?page=1#post-397744115 还是感谢
引用 1 楼 Chen8013 的回复:
你用法不对吧。 那个代码,真正“获取函数地址”的接口,是: zAddressOf( ) 你可以试试: 在类中增加一个测试过程TestGetFun( ) (Public的,便于在“别处”调用),然后: Dim nFun As Long nFun = zAddressOf(Me, 1) nFun = zAddressOf(Me, 2) nFun = zAddressOf(Me, 3) 在别处new个实例,然后调用这个接口过程,就可以看到,返回的“函数地址”是不同的。 如果你要用“1个实例实现‘多回调’ ”,那么第3个参数应该是不能省略的。 并且,你需要修改 zb_AddressOf( ) 中的常量定义值: Const MAX_FUNKS As Long = N    这儿的“N”就是需要“支持多少个回调”的数量。 否则你只能用不同的实例对象,实现不同的回调。
依照您的方法 果然可以了 本来以为没有人会答 为何不直接把 MAX_FUNKS 预设值 设定大一点的值呢? 例如 5 原笔者 只是单存为了减少内存耗用 吗???
bobogg 2017-02-10
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
http://bbs.csdn.net/topics/392084340
赵4老师 以前有很好的回覆 为何现在总是回些奇奇怪怪的? 很可惜耶 http://bbs.csdn.net/topics/390829131?page=1#post-397744115 还是感谢 赵4老师 之前的帮忙
bobogg 2017-02-10
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
记得你以前基本上都是发个20分的提问帖子,这回怎么舍得发40分的了?
因为我的点数不多 基本上无法给太多 ( 怕以后没点点可以问 ) 但是只要有人给出正确的答案, 我是百分之百结帖的人 不然太对不起回覆的人 , 也败坏风气 这题我觉得可能会比较麻烦到回题的人 所以我就想多赠一些点点

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧