C# 全局变量

本文关键字:全局变量 | 更新日期: 2023-09-27 18:18:45

>问题

大家好,我正在用 C# 开发一架钢琴。 我已经成功地创造了钢琴,它弹得很好。 但是,我想使用两个计时器:

一个计时器用于检查鼠标左键按住的时间(在 Form.cs 中(,另一个计时器用于根据鼠标左键按住的时间播放音乐(此计时器可在 MusicNote.cs 中找到(。

第一个计时器按预期工作,并且每次刻度都会增加持续时间。 问题是,当我尝试将全局变量持续时间从 Form1 传递到 MusicNote.PlayMusic 时,持续时间值变为 0,而不是在 textBox2.Text 中正确显示的值。

尝试将 bNoteShape 从 Form1 传递到 MusicNote 时,会出现同样的问题。

编辑

谢谢大家。 我已经解决了这个问题。

C# 全局变量

我之前发布了这个答案,它获得了 2 个赞成票,但后来我改变了主意,删除了它,做了更多的故障排除,所以现在我重新发布它。

首先,duration 不是一个全局变量;它是你的类的成员。

现在,我真的不知道为什么duration传递给PlayMusic()时为零。我仔细看了看,似乎没有理由发生这样的事情。我认为panel1_MouseDown()将其设置为零,然后panel1_Click()立即将其传递给PlayMusic(),但这是不正确的:Click()MouseUp()一起发生,所以当时duration不应该为零。

但这并不重要,因为你的方法完全错误,所以无论如何你都必须改变它,问题可能会在这个过程中自行解决。

您将永远无法调用带有音高和持续时间的PlayMusic(),因为您需要在MouseDown()时立即调用PlayMusic(),但那时您还不知道持续时间是多少。

此外,使用计时器来计算持续时间是完全没有必要的,而且本质上是不准确的;如果你真的需要知道持续时间,只需记录MouseDown()的当前时间,然后从当前时间中减去MouseUp()。 但你也不需要这样做。您需要做的就是停止播放MouseUp()上的声音。(如果您愿意,您只需这样做,以便以后能够重播声音。

此外,我建议您认真重新考虑每次收到 OnClick 事件时向面板添加新的 MouseDown 和 MouseUp 事件处理程序的正确性。

此外,我建议您使用有意义的变量名称,尤其是当您向其他人展示您的代码时,请他们找出它的问题所在。您的panel1_OnClick处理程序不会处理 panel1 的单击事件,正如它的名字所暗示的那样,而是处理所有音乐键按钮的单击事件。