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

 

Tags: , , , | Categories: