2016-01-21 111 views
0

我正在製作一個應用程序,該應用程序從通過串行電纜連接到我的計算機的儀表讀取值。當我按下一個按鈕時,我向儀表發送一個命令,幾毫秒後,我收到儀表迴應的答覆。 我將這些值保存到具有屬性init的類中,以便我可以從任何地方訪問這些值。使用另一個類的屬性訪問類返回空值

所以我的問題是,當我試圖讓該值回它返回一個「沒有價值」,它可能是從初始化我有一個具有「」這樣的昏暗clsSavedValues作爲新clsSavedValues',所以當我嘗試從該屬性類中獲取值時,我創建了一個新實例,如果我沒有弄錯,那個實例是空的。

我發佈了下面的代碼,但這裏是代碼流程: 我有3個類。 MainClass,ProtocolClass,PropertiesClass。 從主要我調用ProtocolClass內的方法,該方法發送一個命令到儀表。幾個毫秒後,我得到一個回調裏面ProtocolClass和這個方法被稱爲'Private Sub SerialPort_DataReceived(ByVal sender As Object,ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)Handlers SerialPort.DataReceived',並保存返回值到PropertiesClass。 在DataReceived方法完成後,我回到MainClass並調用另一個方法從我剛剛保存的PropertiesClass中獲取值,但它們返回null。我知道他們被正確保存,因爲如果我從ProtocolClass中調用它們,我可以訪問它們。但是它們從MainClass中爲null。

這裏是我的代碼: MainClass

'Here i call the ProtocolClass 
Private Sub btnGetLastTransaction_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetLastTransaction.Click 
     clsProtocol.GetLastTransaction(1, Integer.Parse(tbxTransactionPosition.Text)) 
    End Sub 

'Here i try to read the valies from PropertiesClass 
    Public Sub RetrieveMeterSerialNumber() 
     Dim clsSavedValues As New clsSavedValues 
     lblMeterSerialNumber.Text = clsSavedValues.SaveMeterSerialNumber 
    End Sub 

ProtocolClass

Public Sub GetLastTransaction(ByVal destinationAddress As String, ByVal transactionNum As Integer) 
     clsSavedValues = New clsSavedValues 'Creating Instance of the properties class 
     Try 
      Dim v_bodyOfMessage As [Byte]() = {ASCIItoHEX("G"), _ 
               ASCIItoHEX("r")} 
      Dim v_bytearray As [Byte]() = ConstructCommand(v_bodyOfMessage) 

      SendCommand(v_bytearray) 
     Catch ex As Exception 
      Console.WriteLine("Meter serial number button click exception: {0}", ex) 
     End Try 
    End Sub 

Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived 
    If comOpen Then 
     Try 
      ReDim rx(rxPacketSize) 
      Console.WriteLine("RESPONSE") 
      For i = 0 To rxPacketSize - 1 
       readByte = SerialPort.ReadByte.ToString 
       Console.WriteLine(i.ToString & ": " & Conversion.Int(readByte).ToString) 
       rx(i) = Conversion.Int(readByte).ToString 

       If i <> 0 Then 
        If Convert.ToByte(rx(i)) = vDelimeterFlag(0) Then Exit For 
       End If 
      Next 
      DecodeResponse() 
     Catch ex As Exception 
      MsgBox("SerialPort_DataReceived Exception: " & ex.Message) 
     End Try 
    End If 
End Sub 

Private Sub GetMeterSerialNumber() 
    Dim i_startPosition As Integer = 5 
    Dim meterSerialNumber As String = GetRemainingPortionOfString(i_startPosition) 
    clsSavedValues.SaveMeterSerialNumber = meterSerialNumber 
    frmExplorer.RetrieveMeterSerialNumber() 'This is the call to the main class 
End Sub 

PropertiesClass

Public Property SaveMeterSerialNumber() As String 
    Get 
     Return _MeterSerialNumber 
    End Get 
    Set(ByVal meterSerialNumber As String) 
     _MeterSerialNumber = meterSerialNumber 
    End Set 
End Property 

我想從PropertiesClass中獲取值,因爲生病得到的流量超過流量響應並導致線程問題,我無法跟蹤它們。所以我將這些值保存在一個類中,然後我想從這個類中訪問它們。 對不起,對我的任何想要澄清

+0

你需要使用靜態屬性。在這種情況下不需要製作「新建」,只需將類屬性 – bdn02

回答

0

clsSavedValues SerialPort_DataReceived()和你的主類RetrieveMeterSerialNumber()是兩個不同的對象(具有相同的變量名,但每個'新'創建一個新的實例clsSavedValues)也許你應該將clsSavedValues var從協議傳遞給Main作爲參數。

主營:

Public Sub RetrieveMeterSerialNumber(clsSavedValues As clsSavedValues) 
     lblMeterSerialNumber.Text = clsSavedValues.SaveMeterSerialNumber 
    End Sub 

協議:

Private Sub GetMeterSerialNumber() 
    Dim i_startPosition As Integer = 5 
    Dim meterSerialNumber As String = GetRemainingPortionOfString(i_startPosition) 
    clsSavedValues.SaveMeterSerialNumber = meterSerialNumber 
    frmExplorer.RetrieveMeterSerialNumber(clsSavedValues) 'This is the call to the main class 
End Sub 

或者如果你想存儲應用程序域(exe文件)只有一個值使用一個靜態屬性在PropertiesClass

+0

簡單地引用即可。我沒有想到,謝謝Emmanuel :) –