2011-08-09 16 views
11

Bir zamanlayıcım var ve zamanlayıcı geri aramaları ayrı işlevlere koymak istiyorum, ancak bu hatayı alıyorum. temsilci olaylar ve statik olarak üye değişkenleri çalışır olarakStatik olmayan üyeye erişmek için bir nesne başvurusu gerekiyor

Bir nesne başvurusu Bunları geri aramalar bildirirseniz statik olmayan alan, yöntem veya özellik '' ...

erişmek için gereklidir ince. Onu böyle mi bırakmalıyım?

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

Neden Application.Run (yeni MainWindow()); sonra sınıf içerisindeki olaylara abone olur musunuz? – aspark

cevap

22

Yapmaya çalıştığınız şeye bağlıdır. Eğer gerçek kodda ne yapması gerektiğini söylemek zor bu yüzden, bu gerçek uygulaması değil varsayalım

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

: Sen ya Eğer bir örneğini oluşturabilir şeyler statik yapmak veya yapabilirsiniz . Şahsen ben bir örnek oluşturmaya yöneliyorum - statik değişkenler global durumu temsil eden genellikle kötü bir fikir (test edilebilirlik açısından). Bunun sizin durumunuzu etkileyip etkilemediğini anlayamayız. Önemli olan, neden neden hata mesajını aldığınızı ve yukarıdaki değişikliğin neden düzelttiğini anlamaktır. Bunu anladıktan sonra, en iyi kararları vermek için daha iyi bir durumda olacaksınız.

+0

Evet, şimdi açık. Ve muhtemelen zamanlayıcı sınıfımı ayrı bir dosyaya koymam gerekir. Teşekkürler! –

+0

Bunun benim durumumda işe yaradığı garipti, ama temelde ihtiyacım olan şey buydu. Teşekkür ~ – James

1

Bu durumda statik olmayan yöntemlere statik olarak erişiyorsunuz.

sınıfın nesnesi oluşturmak ve daha çağrı yöntemini yüzden

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

davanız

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

Veya (dediğin gibi zaten denedim) statik olarak adlandırılan yöntemler oluşturmak Ya.

İlgili konular