2011-12-26 167 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的點擊事件,因爲它的名稱會顯示,但它會處理所有音樂按鍵的點擊事件。