2011-12-26 19 views
-1

問題C#グローバル変数

こんにちは皆は、私はC#でピアノを開発しています。私はピアノを作るのに成功し、それはうまくいく。しかし、私は2つのタイマーを使用したい:

どのくらいの時間左のマウスボタンが(Form.csで)保持されたかをチェックする1つのタイマー、どのくらいの時間に応じて音楽を再生する別のタイマーマウスの左ボタンを押したままにしました(このタイマーはMusicNote.csにあります)。

最初のタイマーは正常に機能し、毎回のティックごとに継続時間が長くなります。問題は、グローバル変数の継続時間をForm1からMusicNote.PlayMusicに渡そうとすると、duration値は0になり、textBox2.Textに正しく表示された値にはなりません。

bNoteShapeをForm1からMusicNoteに渡そうとするときにも同じ問題が発生します。

編集はあなたのすべてをありがとうございました。私は問題を解決しました。

+1

なぜタイマーを使用して経過時間を計算していますか? – Oded

+1

あまりにも多くのコード。問題に関連する部分まで切り捨てる必要があります。 –

+0

これは確かに非常に変です。 mn.PlayMusic(ピット、デュレーション)にブレークポイントを置いてみましたか?そのことをデバッグしますか?どこにdurが0になるのか調べてみてください – Svarog

答えて

5

私はこの回答を以前に投稿しましたが、2つのアップフォートを受信しましたが、その後私は自分の考えを変えて削除し、さらにトラブルシューティングを行いました。

まず、durationはグローバル変数ではありません。それはあなたのクラスのメンバーです。

durationは、PlayMusic()に渡されたときに、なぜゼロであるのかわかりません。私はそれを調べましたが、そのようなことが起こる理由はないようです。 panel1_MouseDown()は0に設定され、すぐ後にpanel1_Click()PlayMusic()に渡されましたが、それは正しくありません。と一緒にClick()が発生するので、そのときはdurationはゼロであってはいけません。

しかし、あなたのアプローチが完全に間違っているので、とにかくそれを変更しなければならないため、問題はありません。そのプロセスで問題が解決する可能性があります。

あなたはMouseDown()直後にPlayMusic()を起動する必要があるので、あなたは、ピッチと持続時間とのPlayMusic()を呼び出すことができることはありませんが、その時あなたは期間がまだあることを行っているのか分かりません。

また、タイマーを使用して期間を把握することはまったく必要なく、本質的に不正確です。期間を知る必要がある場合は、MouseDown()に現在の時刻を記録し、現時点の時刻をMouseUp()から引きます。しかし、あなたはそれをする必要もありません。 MouseUp()で音を止めるだけです。後でサウンドを再生できるようにするためには、後でサウンドを再生できるようにする必要があります)。

また、新しいMouseDownイベントハンドラとMouseUpイベントハンドラを追加することを真剣に再考することをお勧めしますOnClickイベントを受け取るたびにパネルに表示されます。

特に、他の人にコードを公開しているときに、何が間違っているのかを理解するために、意味のある変数名を使用することをお勧めします。あなたのpanel1_OnClickハンドラは、名前が示唆するように、panel1のクリックイベントを処理しませんが、あなたのすべての音楽キーボタンのクリックイベントを処理します。