2011-12-26 160 views
-1

问题C#全局变量

大家好,我开发C#中的钢琴。我成功地创作了钢琴并且演奏得很好。但是,我想利用两个定时器:

一个定时器,以检查鼠标左键被按下多长时间(在Form.cs中),另一个定时器根据多长时间播放音乐鼠标左键不放(这个定时器可以在MusicNote.cs中找到)。

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

尝试将bNoteShape从Form1传递到MusicNote时发生同样的问题。

编辑

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

+1

为什么使用计时器计算经过时间? – Oded 2011-12-26 10:34:21

+1

代码太多了。您应该将其修剪至与问题相关的部分。 – 2011-12-26 10:34:30

+0

这确实很奇怪。你有没有尝试在mn.PlayMusic(坑,持续时间)放置一个断点;并调试的东西?尝试找到在哪一点DUR变为0 – Svarog 2011-12-26 10:35:02

回答

5

我早些时候发布了这个答案,它收到了2个upvotes,但后来我改变了主意,删除了它,做了一些更多的疑难解答,所以现在我要重新发布它。

首先,duration不是全局变量;它是你班上的一员。

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

但这并不重要,因为你的方法是完全错误的,所以你将不得不改变它,这个问题可能会在这个过程中自行修复。

你将永远无法调用PlayMusic()俯仰和持续时间,因为你需要立即调用PlayMusic()MouseDown(),但在那个时候,你不知道什么时间会是呢。

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

另外,我建议你认真重新考虑将新的MouseDown和MouseUp事件处理程序添加到每次您收到OnClick事件时都会收到面板。

另外,我建议你使用有意义的变量名,特别是当你向别人展示你的代码时,要求他们弄清楚它有什么问题。您的panel1_OnClick处理程序不会处理panel1的点击事件,因为它的名称会显示,但它会处理所有音乐按键的点击事件。