2016-04-13 15 views
0

So versuche ich, die Sitzungsvariable von meinem Hauptformular (LayoutForm) an das Verbindungsformular (ConDevForm) übergeben. Hier ist der vollständige Code für meine beiden Formulare. Ich habe versucht, die Lösung von @LarsTech dafür zu verwenden. Aber ich habe versagt.Wie übergeben Parameter ByRef zu einem Formular in VB.net

Ich erstelle die Sitzungsvariable in LayoutForm und übergebe sie dann mit Verweis auf ConDevForm. Sobald ConDevForm geschlossen ist, verwende ich den Menüpunkt in LayoutForm, um mit dem verbundenen Gerät zu interagieren, um zu überprüfen, ob ich die Kontrolle über die Session über die 'Session'-Variable habe.

Dies funktioniert: Hauptformular

Imports NationalInstruments.VisaNS 
Imports System.Text 
Public Class LayoutForm 
    Dim SGFreq As Double = Nothing 
    Dim Session As rssmb = Nothing 

    Private Sub SMB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SMB.Click 
     Dim Connect As New ConDevForm(Session) 
     Connect.WindowState = FormWindowState.Normal 
     Connect.Show() 
    End Sub 

    Private Sub MSingle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MSingle.Click 
     Session.GetRFFrequency(SGFreq) 
     SGFreq = SGFreq + 1000000000.0 
     Session.confRFFreq(SGFreq, 0, 0, 0) 
    End Sub 
End Class 

Verbindungsform

Imports NationalInstruments.VisaNS 
Imports System.Text 
Public Class ConDevForm 
    Private sesn As rssmb 
    Public Sub New(ByRef sesn As rssmb) 
     ' This call is required by the designer. 
     InitializeComponent() 
     ' Add any initialization after the InitializeComponent() call. 
     Me.sesn = sesn 
     Try 
      UseWaitCursor = True 
      System.Windows.Forms.Cursor.Current = Cursors.WaitCursor 
      If sesn Is Nothing Then 
       sesn = New rssmb("TCPIP::192.168.138.100::INSTR", 0, 1) 
       sesn.confRFFreq(1000 * 1000000.0, 0, 0, 0) 
       sesn.confRFLevel(0, 0, 0, 0, 0, 0, 0) 
      End If 
     Catch ex As System.Runtime.InteropServices.ExternalException 
      Dim message As String 
      message = "Instrument Status Error: " + ex.Message + Environment.NewLine 
      message += "Instrument Error Code: " + ex.ErrorCode.ToString("X") 
      MessageBox.Show(message) 
     Finally 
      System.Windows.Forms.Cursor.Current = Cursors.Default 
      UseWaitCursor = False 
     End Try 
    End Sub 

    Private Sub Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connect.Click 

    End Sub 
End Class 

Aber dies bedeutet nicht

Imports NationalInstruments.VisaNS 
Imports System.Text 
Public Class ConDevForm 
    Private sesn As rssmb 
    Public Sub New(ByRef sesn As rssmb) 
     ' This call is required by the designer. 
     InitializeComponent() 
     ' Add any initialization after the InitializeComponent() call. 
     Me.sesn = sesn 
     Try 
      UseWaitCursor = True 
      System.Windows.Forms.Cursor.Current = Cursors.WaitCursor 
      If Me.sesn Is Nothing Then 
       Me.sesn = New rssmb("TCPIP::192.168.138.100::INSTR", 0, 1) 
       Me.sesn.confRFFreq(1000 * 1000000.0, 0, 0, 0) 
       Me.sesn.confRFLevel(0, 0, 0, 0, 0, 0, 0) 
      End If 
     Catch ex As System.Runtime.InteropServices.ExternalException 
      Dim message As String 
      message = "Instrument Status Error: " + ex.Message + Environment.NewLine 
      message += "Instrument Error Code: " + ex.ErrorCode.ToString("X") 
      MessageBox.Show(message) 
     Finally 
      System.Windows.Forms.Cursor.Current = Cursors.Default 
      UseWaitCursor = False 
     End Try 
    End Sub 

    Private Sub Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connect.Click 

    End Sub 
End Class 
+0

Unter welchen Umständen ist 'Wenn Me.sesn Is Nothing Then'? Dein Code scheint nur sesn zu verwenden, wenn es nichts ist. – LarsTech

+0

Oh, das ist nur um sicherzustellen, dass die Variable kein Handle für eine bestehende/aktive Sitzung ist. Im Moment seit ich es wie folgt erklärt habe 'Dim Session As rssmb = Nichts' Die Bedingung sollte immer wahr sein. Wenn die Dinge von hier weitergehen und ich weitere Funktionen hinzufügen kann, wird das hoffentlich Sinn machen. Wie auch immer die Verbindung zustande kommt, auch wenn ich Me.sesn oder sesn benutze. Das Problem ist, wenn ich zu LayoutForm zurückkomme, kann ich nicht mit dem Gerät interagieren, indem ich 'Session' benutze, wenn ich 'Me.sesn' in ConDevForm benutzt habe. –

Antwort

2

eine Variable hinzufügen:

Wenn Sie ein neues Formular erstellen, müssen Sie die Verbindung erneut herstellen. So bewegen sich die Referenz bis nach Ihre if-überprüfen, wo Sie eine neue Version machen könnte:

Try 
    UseWaitCursor = True 
    System.Windows.Forms.Cursor.Current = Cursors.WaitCursor 
    If Me.sesn Is Nothing Then 
    Me.sesn = New rssmb("TCPIP::192.168.138.100::INSTR", 0, 1) 
    Me.sesn.confRFFreq(1000 * 1000000.0, 0, 0, 0) 
    Me.sesn.confRFLevel(0, 0, 0, 0, 0, 0, 0) 
    End If 
    Me.sesn = sesn 
+0

Hallo LarsTech, vielen Dank für Ihre Antwort. Wird dies immer noch als Referenz dienen? das ist, wenn ich in Form2 Me.sesn manipuliere, wird es wirklich sesn von Form1 manipulieren? –

+0

@AdilMasoudQureshi Es wird keine Kopie sein. Versuch es. – LarsTech

+0

@AdilMasoudQureshi Auch FYI wenn 'sesn' ein Referenztyp ist, brauchen Sie nicht einmal das Schlüsselwort ref. – shadow

Verwandte Themen