2016-03-19 8 views
0

Ich habe eine winform namens Form1.vb und eine Klasse namens FZConsole.vb Auf der Winform habe ich eine Richtextbox1 und ich versuche, Text aus der Klasse anhängen, aber es wird nicht funktionieren.Wie man Text an die richTextBox von einer anderen Klasse in VB.NET Winform anhängt?

Class FZConsole 
Public Sub FZConsole() 
    While True 
      Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class") 

     Threading.Thread.Sleep(1) 
    End While 
End Sub 
End Class 
+0

Wo rufst du das Sub 'FZConsole' an? –

+0

Ich rufe es mit einem Thread an. 'Dim thread_fzconsole As System.Threading.Thread = Neues System.Threading.Thread (AddressOf FZConsole.FZConsole)' – Randomizers

+0

Sie sollten die Form- oder RichTextBox-Instanz an Ihren Thread übergeben, bevor Sie es starten. ** SIE MÜSSEN AUCH ** die Aktualisierung der RTB aufrufen, da sonst eine CrossThreadOperation-Ausnahme auftritt. –

Antwort

-1
Public Class Form1 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     Dim newInstanceToClass As New SomeClass 
     RichTextBox1.AppendText(newInstanceToClass.returenText) 
    End Sub 


    Class SomeClass 
     Function returenText() As String 
      Dim txt As String = "some text..." 
      Return txt 
     End Function 
    End Class 
End Class 
+0

Was ist, wenn ich andere und nicht nur string senden möchte? Wie ("Total players:" + pPlayers) – Randomizers

+0

schreibe also eine andere Funktion, die Ganzzahl zurückgibt. seine grundlegenden Dinge müssen Sie über die Grundlagen der Programmiersprachen lesen (Funktionen und Rückgabe von Typen OOP etc ..). Wenn das die Antwort ist, bitte als Antwort markieren. – jonathana

+0

Bitte fügen Sie eine Erklärung in Ihre Antworten und nicht nur Code ein. Was macht das und warum sollte er es benutzen? –

0

Beim Zugriff: Ich versuche, dies zu tun in der Klasse

Richtextbox1.AppendText("Console is currently ON.") 

, aber es wird nicht funktionieren, tun einfach

Vom Form1.vb kann ich Steuerelemente aus einem anderen Thread müssen Sie normalerweise das Zugreifen/Aktualisieren des Steuerelements aufrufen. Dies geschieht, um die Aktualisierung der Steuerelemente zu synchronisieren, sodass zwei Threads nicht gleichzeitig ein Steuerelement aktualisieren.

Sie können es sich so vorstellen: Zwei Personen können nicht gleichzeitig auf demselben Papier schreiben.

Aufruf ist in der Regel nichts schweres. Es ist im Grunde nur diese beiden Dinge tun:

  1. Überprüfen Sie, ob Aufruf durch das Steuerelement oder seinen Container erforderlich ist.
  2. Bei Bedarf aufrufen.

Aufruf wird mithilfe von Delegate-Methoden ausgeführt. Wenn Sie auf .NET Framework 4.0 oder höher abzielen, können Sie den Lambda-Ausdruck Sub() verwenden, um einen sehr einfachen Delegaten zu erstellen.

Public Sub FZConsole() 
    While True 
     If Form1.InvokeRequired = True Then 'Invocation is required.' 
      Form1.Invoke(Sub() Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class")) 
     Else 'Invocation is not required.' 
      Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class") 
     End If 

     Threading.Thread.Sleep(1) 
    End While 
End Sub 

Allerdings, wenn Sie .NET Framework Ziel von 3,5 oder darunter Dinge werden ein wenig komplizierter. Wenn Sie auf ein älteres Framework abzielen, müssen Sie den Delegaten selbst deklarieren, und das ist nicht so einfach wie das Verwenden des Lambda, da es beim Übergeben von Variablen anders funktioniert.

Delegate Sub TextUpdaterDelegate(ByVal Text As String) 

Public Sub FZConsole() 
    While True 
     If Form1.InvokeRequired = True Then 'Invocation is required.' 
      Form1.Invoke(New TextUpdaterDelegate(AddressOf RichTextBox1.AppendText), Environment.NewLine & "Test From Class") 
     Else 'Invocation is not required.' 
      Form1.Richtextbox1.AppendText(Environment.NewLine & "Test From Class") 
     End If 

     Threading.Thread.Sleep(1) 
    End While 
End Sub 
+0

@Randomizers: Bitte denken Sie daran, als Antwort zu markieren, wenn ich Ihr Problem gelöst habe. :) –

+0

Es sagt InvokeRequired ist nicht für FZConsole deklariert, ich habe versucht, eine Klasse innerhalb von Haupt erstellen, aber das würde nicht funktionieren, es hat keinen Text so angehängt:/ – Randomizers

+0

@Randomizers: Richtig, sorry. Ich habe 'Ich' in einem Formularkontext benutzt. Ersetzen Sie also zum Beispiel jedes 'Me' durch zB' Form1' (beachten Sie, dass Sie das zu aktualisierende Formular gezielt ansprechen müssen). Ich habe meine Antwort bearbeitet, um das zu korrigieren. –

Verwandte Themen