2010-03-23 61 views
0

我正在編寫一個應用程序,仍然需要每分鐘測試一些設備30分鐘。使用計時器設置每60秒啓動一次,並在事件處理程序中執行所需的操作是有意義的。無法訪問以前的Windows窗體中的類方法 - C#

不過,我需要的應用程序等待30分鐘,直到我與計時器完成,因爲下面的代碼改變我試圖監控設備的狀態。

我明顯不想使用任何形式的循環來做到這一點。我想過使用另一個窗體,因爲我也顯示了進度,它將啓動計時器並等待完成。

我與此遇到的問題是,我使用的設備類並不能似乎得到訪問來自第二設備類的方法(第3實際上 - 見下文)Windows窗體。

我有一個初始的窗體窗體,我從用戶那裏獲得輸入,然後調用第二個窗體窗體,在窗體上顯示哪些測試需要完成以及需要使用哪些設備類,然後我想調用第三窗口窗體來處理定時器。

我最多將有6-7設備類等想只有實例化它們在實際要求他們,從第2形態。

我應該把這個邏輯放入第1個窗體窗體(程序類??)嗎?

我是否仍然無法從那裏訪問設備類方法?

無論如何,也許有人知道更好的方法做檢查每分鐘不代碼執行(和改變設備的狀態),或者我應該如何被訪問的應用程序的方法的其餘部分?

嗨,

以下是 「呼叫」 的形式 -

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO.Ports; 

namespace TestCall 

{ 
    public partial class Form1 : Form 
    { 
     NDTClass NDT = new NDTClass(); 

     public Form1() 
     { 
      InitializeComponent(); 

      NDT.NDTOpen(); 
      NDT.NDT1_CMD1(); 
      (new Form2()).ShowDialog(); 
      NDT.NDTClose(); 

     } 

     public class NDTClass 
     { 
      public static double SWVolt = 0.5; 
      public static string Rxstring = ""; 
      public SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); 

      public string NDTOpen() 
      { 
       port.Open(); 
       port.Write("CURRENT ?\r\n"); 
       return Rxstring; 
      } 

      public void NDTClose() 
      { 
       port.Close(); 
      } 

      public void NDT1_CMD1() 
      { 
       port.Write("DUAL MODE\r\n"); 
      } 
     } 
    } 
} 

以下是被叫形式 -

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace TestCall 
{ 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
      Form1.NDTClass.SWVolt = 99; 
      NDT.NDT1_CMD1(); 
     } 

     private void Form2_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

的NDT.NDT1_CMD1()被調用的形式讓我在生成以下錯誤 -

Error 1 The name 'NDT' does not exist in the current context  

在NDTClass中使用變量SWVolt可以正常工作,但不能在該類中使用該方法。

我做了什麼錯?

謝謝喬治。 (我希望格式也是正確的)。

+0

是否有可能發佈一些代碼,以澄清問題可能是什麼?除非您希望與表單綁定的業務對象,否則從GUI邏輯中分離出業務邏輯可能會有所幫助。 – 2010-03-23 19:18:01

+0

請發佈代碼,至少編譯_close_。 – 2010-03-23 19:22:54

+0

好吧,我正試圖創建一個新的小應用程序,重新創建相同的問題。將盡快發佈 – George 2010-03-23 20:35:19

回答

1

Form1.NDTClass.SWVolt = 99;作品,因爲你是在Form1.NDTClass類引用公共靜態字段。它不受任何實例限制。但對於'NDT.NDT1_CMD1();,不工作的原因是:

  1. NDT1_CMD1()是一個實例方法,你需要一個類的實例來調用它。
  2. 在Form2中沒有名爲NDT的類的實例。Form1包含一個名爲NDT的專用字段,但無法從Form2訪問。您需要在Form2中聲明Form1.NDTClass NDT = new Form1.NDTClass()

我認爲您需要確保您瞭解variable scope

讓我嘗試另一種解釋: SWVolt作爲公共靜態字段,具有全局作用域。它可以從應用程序的任何地方訪問。作爲私有實例字段的NDT具有Form1的單個實例的範圍。這是它只能從Form1的實例中訪問。任何不屬於Form1的代碼都看不到它,這當然包括Form2中的代碼。

+0

嗨, 感謝您的更新,理所當然。 我明白範圍如何工作,但我不明白爲什麼你不能訪問定義爲Public的方法,當你可以在同一個類中訪問定義爲Public的變量時。 – George 2010-03-24 15:18:14

+0

它並不是真的與你試圖訪問一個公共方法。你試圖引用一個不存在的變量。 Form2中沒有名爲NDT的變量。 – shf301 2010-03-24 15:45:10

+0

好吧,NDT不存在,但方法NDT1_CMD1()確實存在於Form1中,那麼爲什麼你不能像訪問公共變量一樣訪問它? – George 2010-03-24 15:56:20