2011-08-09 20 views
11

私はタイマーを持っていますが、タイマーコールバックを別の関数に入れたいのですが、このエラーが発生します。非スタティックメンバーにアクセスするにはオブジェクト参照が必要です

オブジェクト参照が「」非静的フィールド、メソッド、またはプロパティにアクセスするために必要です...

私はstaticとしてデリゲートイベントや メンバ変数としてこれらのコールバックを宣言すると、それは動作します良い。私はそれをそのままにしておくべきですか?

class MainClass 
{ 
    private Timer _timer = null; 
    private TimeSpan _millisecs; 

    public static void Main (string[] args) 
    { 
     Application.Init(); 
     MainWindow win = new MainWindow(); 

     Label lbl = new Label(); 
     lbl.Text = "00:00"; 

     Table tbl = new Table(2, 2, true); 
     tbl.Name = "tbl"; 

     Button btn = new Button("Start"); 
     tbl.Attach(lbl, 0, 2, 0, 1); 
     tbl.Attach(btn, 0, 1, 1, 2); 
     Button btn_stop = new Button("Stop"); 
     tbl.Attach(btn_stop, 1, 2, 1, 2); 

     btn.Clicked += StartClick; 
     btn_stop.Clicked += StopClick; 

     win.Add(tbl); 
     win.ShowAll(); 

     Application.Run(); 
    } 

    private void StartClick(object obj, EventArgs args) 
    { 
     if (_timer == null) { 
      _timer = new Timer(); 
      _timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { 
       _millisecs = _millisecs.Add(new TimeSpan(0, 0, 0, 0, 50)); 
       lbl.Text = new DateTime(_millisecs.Ticks).ToString("ss:ff"); 
      }; 
      _timer.Interval = 50; 
      _timer.Enabled = true;     
     } 

     _timer.Start();    
    } 

    private void StopClick(object obj, EventArgs args) 
    { 
     _timer.Stop();   
    } 

} 
+0

なぜApplication.Run(new MainWindow())を使用しないでください。そのクラス内のイベントを購読しますか? – aspark

答えて

22

これは何をしようとしているかによって異なります。あなたがあなたの本当のコードで何をすべきかを言うのは難しいですので、私は、これはあなたの本当アプリケーションではありませんと仮定し

MainClass instance = new MainClass(); 
btn.Clicked += instance.StartClick; 
btn_stop.Clicked += instance.StopClick; 

:あなたはいずれかは、インスタンスを作成することができます、物事は静的をしたりすることができます。個人的には、インスタンスを作成するために傾けたいと思います。静的変数はグローバル状態を表します。通常は(テスト容易性などの面で)悪い考えです。それがあなたの状況に影響を与えるかどうかはわかりません。

なぜ、を理解していることと、上記の変更がそれを修正する理由が重要です。それを理解すれば、最良の判断を下すのがより良い状況になるでしょう。

+0

はい、今はっきりしています。私はおそらく別のファイルに私のタイマークラスを置く必要があります。ありがとう! –

+0

これは私の場合にはうまくいきましたが、基本的には必要なものでした。ありがとう〜 – James

1

この場合、静的ではないメソッドにアクセスしているからです。

いずれかのクラスのオブジェクトを作成し、あなたのケース

MainClass obj = new MainClass(); 
btn.Clicked += obj.StartClick; 
btn_stop.Clicked += obj.StopClick; 

または(あなたが言ったように、あなたが既に試した)静的などと呼ばれるメソッドを作成するにはとても

ObjectOfClass obj = new ObjectOfClass(); 
obj.MethodName(); 

メソッドを呼び出すより。

関連する問題