Übergabe von Text in ein Textfeld einer Anderen Form

WorldRacer

Erfahrenes Mitglied
Hi zusammen,

habe ein "kleines" Problem... Habe diesen code:

Code:
Private Sub Empfangen()
        While 1

            Console.WriteLine("")
            Dim clientListener As New TcpListener(19900)
            clientListener.Start()
            Console.WriteLine("")
            Dim mySocket As Socket = clientListener.AcceptSocket()
            Console.WriteLine("")
            Dim recieveBuff(225) As Byte
            mySocket.Receive(recieveBuff, recieveBuff.Length, SocketFlags.None)
            Dim str As String = System.Text.Encoding.ASCII.GetString(recieveBuff, 0, recieveBuff.Length).Trim(Microsoft.VisualBasic.ChrW(0))
            While Not str.StartsWith(".")

                mySocket.Receive(recieveBuff, recieveBuff.Length, SocketFlags.None)
                str = System.Text.Encoding.ASCII.GetString(recieveBuff, 0, recieveBuff.Length).Trim(Microsoft.VisualBasic.ChrW(0))
                frmDebug.txtDebug.Text = str
                WorkOnMessage(str)
                str = "."
            End While
            Console.WriteLine("")
            clientListener.Stop()
        End While
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim thread As New System.Threading.Thread(AddressOf Empfangen)
        thread.Start()
        frmDebug.Show()

    End Sub

In Form1. Und diesen:

Code:
Public Sub WorkOnMessage(ByVal msg As String)
       MsgBox(msg)
        frmDebug.txtDebug.Text = msg
        If msg = "OK" Then
            Exit Sub
        End If
        If msg.Substring(0, 1) = "ST" Then
            If msg.Substring(3, 4) = "01" Then
                MsgBox("Die Karte 1 wurde gelegt")
            End If
        End If
        If msg.Substring(0, 3) = "LIST" Then
            Dim noList As String
            noList = msg.Substring(4)
        End If
        MsgBox(msg)
    End Sub

In einem Modul. Funktioniert auch so weit und schön. Wenn mein Socket eine Meldung erhält, bekomm ich auch ne Box. Aber er schreibt die Daten nicht in das Textfeld. Warum? Liegt es am Thread?
 
Ja, ich denke schon. Du darst nämlich auf die Steuerelemente immer nur aus dem Thread heraus zugreifen, der sie erstellt hat. Andererseits solltest du aber eine InvalidOperationException kriegen.

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement txtDebug erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

Mit einem Delegaten und Invoke sollte man das aber lösen können.

Code:
Public Class Form1
    Private Sub Empfangen()
        Dim del = New TextÄndernDel(AddressOf TextÄndern)

        Threading.Thread.Sleep(1000)
        Me.Invoke(del, "Hallo!")
    End Sub

    Delegate Sub TextÄndernDel(ByVal text As String)

    Private Sub TextÄndern(ByVal text As String)
        Me.Label1.Text = text
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim thread As New System.Threading.Thread(AddressOf Empfangen)
        thread.Start()
    End Sub
End Class

Das ist jetzt zwar vereinfacht, sollte aber genauso auch funktionieren, wenn du mehrere Fenster hast.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück