C++Builder事件处理函数有个参数是引用类型,我想手工调用这个函数,怎么传参数?

ooolinux 2020-12-04 11:19:25
事件处理函数有个参数是引用类型,我想手工调用这个函数,怎么传参数?
//点击控制按钮
void __fastcall TForm1::MediaPlayer1Click(TObject *Sender, TMPBtnType Button, bool &DoDefault)

{
DoDefault=true; //做按钮预设动作
if(Button==TMPBtnType::btPlay) //如果是播放按钮
this->Timer1->Enabled=true;
}
我这样调用:
bool DoDefault;
MediaPlayer1Click(Sender,TMPBtnType::btPlay,DoDefault); //编译出错
//MediaPlayer1Click(Sender,TMPBtnType::btPlay,true); //编译出错
应该怎么传参数?
这个引用参数引用了上层函数某个内部变量,需要设置值,如果能手工调用该函数的话也会使那个内部变量无法获取值了吧?
因为播放的时候有个额外的定时器操作,我开始时想用手工调用该函数,编译不通过,只好每次Play后加一句操作定时器的语句。
但这样调用函数为啥不行?
...全文
342 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
青蛙工作室 2020-12-15
  • 打赏
  • 举报
回复
引用 17 楼 ooolinux 的回复:
[quote=引用 16 楼 青蛙工作室的回复:] 你的结论,我有反例 窗口的鼠标滚轮事件,有MouseWheel、MouseWheelUp和MouseWheelDown 3个事件,它们的最后一个参数Handed就是引用型的,而这3个事件处理函数都可以手动调用,我就经常干。
除非你不使用Handled参数。[/quote] Handed参数当然用啊,调用前定义一个bool变量,调用时它就是Handed,而事件处理函数内也有对Handed的赋值。总之是正常调用,不管有没有引用型参数。
ooolinux 2020-12-15
  • 打赏
  • 举报
回复
引用 18 楼 青蛙工作室 的回复:
[quote=引用 17 楼 ooolinux 的回复:][quote=引用 16 楼 青蛙工作室的回复:]
你的结论,我有反例
窗口的鼠标滚轮事件,有MouseWheel、MouseWheelUp和MouseWheelDown 3个事件,它们的最后一个参数Handed就是引用型的,而这3个事件处理函数都可以手动调用,我就经常干。

除非你不使用Handled参数。[/quote]
Handed参数当然用啊,调用前定义一个bool变量,调用时它就是Handed,而事件处理函数内也有对Handed的赋值。总之是正常调用,不管有没有引用型参数。[/quote]
估计这个Handled参数有默认值,按默认值处理了。
ooolinux 2020-12-14
  • 打赏
  • 举报
回复
引用 16 楼 青蛙工作室的回复:
[quote=引用 15 楼 ooolinux 的回复:][quote=引用 14 楼 无理蛇 的回复:]帖个完整点的代码,可以更好解决问题
这个贴只是讨论“C++Builder事件处理函数有个参数是引用类型,如何手动调用这个函数?” 讨论结果是,有引用类型参数的事件处理函数不适合手动调用。 其它的事件处理函数,比如Button1Click之类,手动调用是完全可以的。[/quote] 你的结论,我有反例 窗口的鼠标滚轮事件,有MouseWheel、MouseWheelUp和MouseWheelDown 3个事件,它们的最后一个参数Handed就是引用型的,而这3个事件处理函数都可以手动调用,我就经常干。[/quote] 除非你不使用Handled参数。
青蛙工作室 2020-12-14
  • 打赏
  • 举报
回复
引用 15 楼 ooolinux 的回复:
[quote=引用 14 楼 无理蛇 的回复:]帖个完整点的代码,可以更好解决问题
这个贴只是讨论“C++Builder事件处理函数有个参数是引用类型,如何手动调用这个函数?” 讨论结果是,有引用类型参数的事件处理函数不适合手动调用。 其它的事件处理函数,比如Button1Click之类,手动调用是完全可以的。[/quote] 你的结论,我有反例 窗口的鼠标滚轮事件,有MouseWheel、MouseWheelUp和MouseWheelDown 3个事件,它们的最后一个参数Handed就是引用型的,而这3个事件处理函数都可以手动调用,我就经常干。
ooolinux 2020-12-11
  • 打赏
  • 举报
回复
引用 14 楼 无理蛇 的回复:
帖个完整点的代码,可以更好解决问题

这个贴只是讨论“C++Builder事件处理函数有个参数是引用类型,如何手动调用这个函数?”
讨论结果是,有引用类型参数的事件处理函数不适合手动调用。
其它的事件处理函数,比如Button1Click之类,手动调用是完全可以的。
无理蛇 2020-12-11
  • 打赏
  • 举报
回复
帖个完整点的代码,可以更好解决问题
  • 打赏
  • 举报
回复
引用 8 楼 ooolinux 的回复:
[quote=引用 7 楼 早打大打打核战争 的回复:][quote=引用 6 楼 ooolinux 的回复:][quote=引用 5 楼 早打大打打核战争的回复:]获取是可以的,但是传进MediaPlayer1Click的DoDefault可能只是消息处理部分使用的一个局部变量,获取它的地址留待以后使用是没有意义的。

我是说引用参数反向获取,函数中赋值,上层调用函数中某变量获取。[/quote]

是啊,我说的就是这个意思,传给MediaPlayer1Click的DoDefault是调用者的局部变量,不能保证每次是同一个地址,获取很简单,用一个指针保存DoDefault的地址即可:
bool *DoDefaultPtr = 0;
void __fastcall TForm1::MediaPlayer1Click(TObject *Sender, TMPBtnType Button, bool &DoDefault)
{
DoDefaultPtr = &DoDefault;
//...
}
第一次可以先发一条鼠标消息触发MediaPlayer1Click
[/quote]
如果我手动调用该函数,传给DoDefault的就是我自己定义的变量了,对该变量赋值就变得没有意义了。因为本来这个变量会影响控件的行为动作。[/quote]

可以提前获取它的DoDefault的地址,自己调用MediaPlayer1Click也传它,但是这样做没有意义,它的那个DoDefault是局部变量传进去的
  • 打赏
  • 举报
回复
TMPBtnType::btPlay是枚举
青蛙工作室 2020-12-07
  • 打赏
  • 举报
回复
传引用没有问题,反而感觉 TMPBtnType::btPlay 很怪异。VCL规定控件必须是指针,你的btPlay是不是一个控件?
ooolinux 2020-12-07
  • 打赏
  • 举报
回复
引用 11 楼 早打大打打核战争 的回复:
可以提前获取它的DoDefault的地址,自己调用MediaPlayer1Click也传它,但是这样做没有意义,它的那个DoDefault是局部变量传进去的

这样做确实没意义。实际上也不需要,因为MediaPlayer有封装Play、Pause、Stop、Previous、Next等各种方法,还是调用方法靠谱。
ooolinux 2020-12-07
  • 打赏
  • 举报
回复
引用 9 楼 青蛙工作室 的回复:
传引用没有问题,反而感觉 TMPBtnType::btPlay 很怪异。VCL规定控件必须是指针,你的btPlay是不是一个控件?

枚举值,代表的是MediaPlayer的播放按钮
  • 打赏
  • 举报
回复
获取是可以的,但是传进MediaPlayer1Click的DoDefault可能只是消息处理部分使用的一个局部变量,获取它的地址留待以后使用是没有意义的。
ooolinux 2020-12-06
  • 打赏
  • 举报
回复
引用 7 楼 早打大打打核战争 的回复:
[quote=引用 6 楼 ooolinux 的回复:][quote=引用 5 楼 早打大打打核战争的回复:]获取是可以的,但是传进MediaPlayer1Click的DoDefault可能只是消息处理部分使用的一个局部变量,获取它的地址留待以后使用是没有意义的。
我是说引用参数反向获取,函数中赋值,上层调用函数中某变量获取。[/quote] 是啊,我说的就是这个意思,传给MediaPlayer1Click的DoDefault是调用者的局部变量,不能保证每次是同一个地址,获取很简单,用一个指针保存DoDefault的地址即可: bool *DoDefaultPtr = 0; void __fastcall TForm1::MediaPlayer1Click(TObject *Sender, TMPBtnType Button, bool &DoDefault) { DoDefaultPtr = &DoDefault; //... } 第一次可以先发一条鼠标消息触发MediaPlayer1Click [/quote] 如果我手动调用该函数,传给DoDefault的就是我自己定义的变量了,对该变量赋值就变得没有意义了。因为本来这个变量会影响控件的行为动作。
  • 打赏
  • 举报
回复
引用 6 楼 ooolinux 的回复:
[quote=引用 5 楼 早打大打打核战争的回复:]获取是可以的,但是传进MediaPlayer1Click的DoDefault可能只是消息处理部分使用的一个局部变量,获取它的地址留待以后使用是没有意义的。

我是说引用参数反向获取,函数中赋值,上层调用函数中某变量获取。[/quote]

是啊,我说的就是这个意思,传给MediaPlayer1Click的DoDefault是调用者的局部变量,不能保证每次是同一个地址,获取很简单,用一个指针保存DoDefault的地址即可:
bool *DoDefaultPtr = 0;
void __fastcall TForm1::MediaPlayer1Click(TObject *Sender, TMPBtnType Button, bool &DoDefault)
{
DoDefaultPtr = &DoDefault;
//...
}
第一次可以先发一条鼠标消息触发MediaPlayer1Click
ooolinux 2020-12-06
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争的回复:
获取是可以的,但是传进MediaPlayer1Click的DoDefault可能只是消息处理部分使用的一个局部变量,获取它的地址留待以后使用是没有意义的。
我是说引用参数反向获取,函数中赋值,上层调用函数中某变量获取。
ooolinux 2020-12-05
  • 打赏
  • 举报
回复
引用 1 楼 cczlp的回复:
传参没问题, 编译不过时因为你"bool DoDefault;"后面的分号是全角的
不是分号问题,那个是我发帖的时候手打的没注意。
cczlp 2020-12-05
  • 打赏
  • 举报
回复
传参没问题, 编译不过时因为你"bool DoDefault;"后面的分号是全角的
ooolinux 2020-12-05
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
引用类型传变量即可,用10.2.1测试是可以的

就算语法正确,那个引用参数所引用的内部变量也无法得到函数中设置的值吧?
  • 打赏
  • 举报
回复
引用类型传变量即可,用10.2.1测试是可以的

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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