2011-08-09 19 views
11

तक पहुंचने के लिए एक ऑब्जेक्ट संदर्भ की आवश्यकता है मेरे पास टाइमर है और मैं टाइमर कॉलबैक को अलग-अलग फ़ंक्शंस में रखना चाहता हूं, हालांकि, मुझे यह त्रुटि मिलती है।गैर स्थैतिक सदस्य

एक वस्तु संदर्भ अगर मैं इन कॉलबैक घोषित गैर स्थिर क्षेत्र, विधि, या संपत्ति '' ...

का उपयोग करने की आवश्यकता है के रूप में प्रतिनिधि घटनाओं और स्थिर के रूप में सदस्य चर, यह काम करता है ठीक। क्या मुझे इसे इस तरह से छोड़ देना चाहिए?

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

एप्लिकेशन का उपयोग क्यों न करें। रुन (नया मेनविंडो()); फिर कक्षा के अंदर की घटनाओं की सदस्यता लें? – 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(); 
तो

फोन या स्थिर के रूप में बुलाया तरीकों (जो आप पहले से ही करने की कोशिश की, जैसा कि आप ने कहा) पैदा करते हैं।

संबंधित मुद्दे