Ich habe keine Ahnung, wie oft ich den folgenden Code geschrieben habe, ich weiß nur: es war zu oft. Immer, wenn ich irgend ein kleines Testprogramm benötigte, sei es um WebServices, Datenbanken, Multi-Threading-Algorithmen oder was-weiß-ich-nicht-alles-noch auszuprobieren, muss ich garantiert innerhalb dieses Testprogramms auch Texte ausgeben.
Dazu hält in der Regel eine TextBox her, die ich auf ReadOnly schalte, die einen vertikalen Rollbalken bekommt und mehrzeilige Eingaben erlaubt. Und die natürlich, wenn Text in ihr ergänzt wurde, immer automatisch die letzte Zeile in den sichtbaren Bereich scrollen soll. Ach so - threadsafe soll ihre Anwendung am besten auch sein, und selbst dafür sorgen, dass es keine CrossThreadExceptions gibt.
Und so erfinde ich entsprechende Extender-Methoden, um jeder von TextBoxBase abgeleiteten TextBox die Methoden Write und WriteLine zu verpassen, immer wieder aufs Neue. Wie gesagt: Ich weiß nicht, wie viele Male ich das schon gemacht habe - diesen Code schreibe ich inzwischen im Schlaf, aber auch gerne Mal immer wieder mit kleinen Bugs.
Es wird Zeit, ihn an dieser Stelle mal zu posten, und das nicht ganz uneigennützig, denn schließlich kann ich ihn dann immer wieder selber hieraus in ein aktuellen Testprojekt hineinkopieren.
Ich hoffe, Sie finden diesen Code zu diesem Zweck auch brauchbar - aber nicht vergessen: Solche Testprogramme, mit denen Sie Ihre Libraries oder Algorithmen testen, sind sicherlich ein Muss. Sie können Unit-Tests aber nicht ersetzen!
Wenn Sie dieses Modul in Ihr Projekt einbauen, verfügen alle TextBox-Steuerelemente anschließend automatisch über eine Write bzw. WriteLine-Methode, die Sie von jedem Thread aus verwenden können.
Imports System.Runtime.CompilerServices
Public Module TextboxExtender
<Extension()>
Public Sub Write(control As TextBoxBase, Text As String,
Optional DontBlock As Boolean = False)
Dim writer = Sub()
control.AppendText(Text)
End Sub
If control.InvokeRequired Then
If DontBlock Then
control.BeginInvoke(writer)
Else
control.Invoke(writer)
End If
Else
writer.Invoke()
End If
End Sub
<Extension()>
Public Sub WriteLine(control As TextBoxBase, Text As String,
Optional DontBlock As Boolean = False)
Dim writer = Sub()
control.AppendText(Text & vbNewLine)
control.SelectionStart = control.Text.Length - 1
control.SelectionLength = 0
control.ScrollToCaret()
End Sub
If control.InvokeRequired Then
If DontBlock Then
control.BeginInvoke(writer)
Else
control.Invoke(writer)
End If
Else
writer.Invoke()
End If
End Sub
End Module
ac570ab0-9eef-406e-8eb2-219a97361f24|1|5.0
Tags: TextBox, WindowsForms, WriteLine, ThreadSafe Textausgabe |
Categories: