In diesem Kapitel werden einige Klassen vorgestellt, die zur Lösung von »alltäglichen« Problemen bei der Programmierung mit Visual Basic benötigt werden.
6 Wichtige Klassen in .NET
Folgende Klassen werden in vielen Projekten eingesetzt:
- die Klasse String zur Bearbeitung von Zeichenketten
- die Klassen DateTime und TimeSpan zum Rechnen mit Datum und Uhrzeit
- die Klassen FileStream, StreamWriter, StreamReader, File und Directory zum Arbeiten mit Dateien und Verzeichnissen
- die Klasse Math zur Durchführung von mathematischen Berechnungen
6.1 Klasse String für Zeichenketten 

String
Zeichenketten werden in Strings gespeichert. Bisher haben wir den Begriff String als die Bezeichnung eines einfachen Datentyps angesehen. Tatsächlich ist String aber eine Klasse. Objekte der Klasse String, also Zeichenketten, verfügen somit über Eigenschaften und Methoden, ähnlich wie man dies bereits bei Datenfeldern (Klasse Array) sehen konnte.
Sonderfall
Beim Kopieren verhält sich ein Objekt der Klasse String allerdings wie eine einfache Variable und nicht wie ein Objekt: Falls eine Zeichenkette einer anderen Zeichenkette zugewiesen wird, dann sind diese beiden Zeichenketten voneinander unabhängig. Eine Veränderung des Originals hat keine Veränderung der Kopie zur Folge.
Die Methoden der Klasse String (wie auch die Methoden vieler anderer Klassen, die Visual Basic bereitstellt) sind häufig überladen, d. h. es gibt mehrere Möglichkeiten sie aufzurufen. In diesem Buch werden nicht alle Überladungen erläutert, sondern nur das grundsätzliche Verhalten der Methoden an Beispielen gezeigt. Dank IntelliSense kann man sich aber über die weiteren Möglichkeiten schnell informieren, wenn man einmal erkannt hat, welche Methode für den gedachten Einsatzzweck benötigt wird.
6.1.1 Eigenschaften der Klasse String 

Ein Objekt der Klasse String hat folgende Eigenschaften:
- Length: gibt die Anzahl der Zeichen, also die Zeichenkettenlänge an
- Chars: eine Liste der einzelnen Zeichen der Zeichenkette
Im nachfolgenden Programm (p0601) wird die Länge ausgegeben:
Abbildung 6.1 Länge einer Zeichenkette
Public Class frm0601
Private Sub cmdLänge_Click( ... ) Handles ...
Dim eingabe As String
Dim anzeige As String
eingabe = txtEingabe.Text
anzeige = "Länge: " & eingabe.Length
lblAnzeige.Text = anzeige
' lblAnzeige.Text = "Länge: " & txtEingabe.Text.Length
End Sub
[ ... ]
End ClassZur Erläuterung:
- Die im Textfeld eingegebene Zeichenkette wird in einer Variablen von Datentyp String gespeichert.
- Die Länge der Zeichenkette wird mit eingabe.Length ermittelt.
Length
- Die auszugebende Zeichenkette wird zusammengesetzt und ausgegeben.
- Man hätte diesen gesamten Ablauf auch auf die letzte, auskommentierte Anweisung verkürzen können. Die Eigenschaft Text des Textfelds ist ebenfalls vom Typ String. Somit können die Eigenschaften und Methoden auch direkt auf txtEingabe.Text angewendet werden. In diesem Abschnitt wird jedoch bewusst die ausführlichere und übersichtlichere Variante gewählt.
Die einzelnen Zeichen einer Zeichenkette werden wie Feldelemente nummeriert, also beginnend bei 0. Im folgenden Programm (auch in p0601) werden alle Zeichen der Zeichenkette mit ihrer laufenden Nummer ausgegeben:
Abbildung 6.2 Einzelne Zeichen mit laufender Nummer
Public Class frm0601
[ ... ]
Private Sub cmdZeichen_Click( ... ) Handles ...
Dim eingabe As String
Dim zeichen As Char
Dim i As Integer
Dim anzeige As String
eingabe = txtEingabe.Text
anzeige = "Zeichen:" & vbCrLf
For i = 0 To eingabe.Length - 1
zeichen = eingabe.Chars(i)
anzeige &= i & ": " & zeichen & vbCrLf
Next
lblAnzeige.Text = anzeige
End Sub
[ ... ]
End ClassZur Erläuterung:
- Die Variable zeichen wird deklariert mit dem Datentyp Char. In einer solchen Variablen kann genau ein Zeichen gespeichert werden.
Char
- Die Zeichenkette wird mithilfe einer For-Schleife vom ersten bis zum letzten Element durchlaufen. Zur Begrenzung der Schleife wird wiederum die Eigenschaft Length benötigt. Innerhalb der Schleife werden die beiden folgenden Schritte durchlaufen:
- Die Eigenschaft Chars(nummer) liefert das Zeichen der Zeichenkette an der Position nummer. Dieses Zeichen wird einzeln gespeichert.
Chars
- Die laufende Nummer des Zeichens und das Zeichen selber werden ausgegeben.
6.1.2 Trimmen 

Trim
Die Methode Trim() dient zum Entfernen von unerwünschten Zeichen am Anfang und am Ende einer Zeichenkette. Meist werden dies Leerzeichen sein, Trim() kann allerdings auch mehrere verschiedene Zeichen gleichzeitig entfernen. Die Methoden TrimStart() und TrimEnd() bewirken das Gleiche wie Trim(), nur eben am Anfang oder am Ende.
Man stellt häufig fest, dass Benutzer eines Programms bei der Eingabe von größeren Datenmengen dazu neigen, unnötige Leerzeichen einzufügen. Zumindest die Leerzeichen am Anfang und am Ende lassen sich schnell mit Trim() entfernen, bevor diese Daten in einer Datei oder Datenbank gespeichert werden. Für die Leerzeichen mitten im Text benötigt man die Methode Replace(), die im Abschnitt 6.1.8, »Zeichen ersetzen«, genauer erläutert wird.
Ein Beispiel, auch in p0601:
Abbildung 6.3 Leerzeichen an Anfang und Ende entfernt
Public Class frm0601
[ ... ]
Private Sub cmdTrimmen_Click( ... ) Handles ...
Dim eingabe As String
Dim getrimmt As String
Dim anzeige As String
eingabe = txtEingabe.Text
getrimmt = eingabe.Trim(" ", ";", "#")
anzeige = "Getrimmt: |" & getrimmt & "|"
lblAnzeige.Text = anzeige
End Sub
[ ... ]
End ClassZur Erläuterung:
- Die Methode Trim() erwartet eine beliebig lange Reihe von Variablen des Datentyps Char. Im vorliegenden Fall sind dies das Leerzeichen, das Semikolon und die Raute.
- Diese Zeichen werden am Anfang und am Ende der Zeichenkette gelöscht.
- In der Ausgabe wurde zur Verdeutlichung das Pipe-Zeichen als optischer Begrenzer am Anfang und am Ende angefügt.
- Falls gar kein Zeichen übergeben wird, also Trim() ohne Parameter aufgerufen wird, dann werden Leerzeichen entfernt.
6.1.3 Splitten 

Split, Trennzeichen
Die Methode Split() wird benötigt, wenn eine Zeichenkette anhand eines Trennzeichens zerlegt werden soll. Dies kann eine Zeile aus einer Datei sein, die aus mehreren Einzelinformationen besteht. Es kann ebenso ein Satz sein, der in seine Worte zerlegt werden soll, oder ein Datensatz, dessen einzelne Felder durch das Zeichen ; (Semikolon) voneinander getrennt sind.
CSV-Datei
Das Semikolon wird häufig als Trennzeichen bei der Erstellung sogenannter CSV-Dateien benutzt. Diese CSV-Dateien können beim Export aus fast allen Datenbanksystemen erstellt werden und stellen somit ein universelles Austauschformat dar.
Es wird ein Feld von Strings zurückgeliefert. Die einzelnen Elemente des Felds sind die Teile der Gesamtzeichenkette vor und nach dem Trennzeichen. Das Trennzeichen selber wird nicht mehr gespeichert.
Ein Beispiel dazu, auch in p0601:
Public Class frm0601
[ ... ]
Private Sub cmdSplitten_Click( ... ) Handles ...
Dim eingabe As String
Dim teil() As String
Dim i As Integer
eingabe = txtEingabe.Text
teil = eingabe.Split(";")
lblAnzeige.Text = "Worte:" & vbCrLf
For i = 0 To teil.Count - 1
lblAnzeige.Text &= "Wort " & i _
& ": " & teil(i) & vbCrLf
Next
End Sub
[ ... ]
End ClassAbbildung 6.4 Zerlegte Zeichenkette
Zur Erläuterung:
- Ein Feld von Strings wird mit dem Namen teil deklariert. Dieses Feld hat keine Größenangabe, denn zum einen sind Felder in Visual Basic immer dynamisch, zum Anderen ist die Größe der Felds unbekannt, da man nicht weiß, wie viele Bestandteile die Zeichenkette hat.
- Die Methode Split() erwartet eine beliebig lange Reihe von Variablen des Datentyps Char als Trennzeichen. Im vorliegenden Fall ist dies nur das Semikolon.
- Wird gar kein Zeichen übergeben, also Split() ohne Parameter aufgerufen, so wird das Leerzeichen als Trennzeichen genommen.
Leerzeichen
- Split() liefert ein Feld von Strings, diese werden in dem Feld teil gespeichert.
- Mithilfe einer For-Schleife wird das Feld vollständig durchlaufen. Zur Begrenzung der Schleife wird die Eigenschaft Count des Felds benötigt. Sie gibt die Anzahl der Feldelemente an.
For, Count
- Innerhalb der Schleife wird jeder einzelne Teil der Zeichenkette, zusammen mit seiner laufenden Nummer, ausgegeben.
6.1.4 Suchen 

Muss untersucht werden, ob (und an welcher Stelle) eine bestimmte Zeichenkette in einer anderen Zeichenkette vorkommt, so kann man die Methoden IndexOf(), LastIndexOf() oder IndexOfAny()nutzen. Verläuft die Suche erfolglos, so wird der Wert –1 zurückgegeben.
IndexOf
Bei IndexOf() wird normalerweise die erste Position gefunden, an der die Suchzeichenkette beginnt. Man kann IndexOf() aber auch veranlassen, die Suche erst ab einer bestimmten Stelle innerhalb der Zeichenkette zu beginnen.
Es folgt ein Beispiel mit einer einfachen Suche (auch in p0601):
Abbildung 6.5 Suche nach dem Suchtext »a«
Public Class frm0601
[ ... ]
Private Sub cmdSucheEins_Click( ... ) Handles ...
Dim eingabe As String
Dim such As String
Dim position As Integer
Dim anzeige As String
eingabe = txtEingabe.Text
such = txtSuche.Text
position = eingabe.IndexOf(such)
anzeige = "Suchtext bei Zeichen: " & position
lblAnzeige.Text = anzeige
End Sub
[ ... ]
End ClassZur Erläuterung:
- Der gesuchte Text wird eingegeben und in der Variablen such gespeichert.
- Durch den Aufruf eingabe.IndexOf(such) wird nach der ersten Position gesucht, an der such innerhalb von eingabe steht.
- Diese Position wird ausgegeben. Erscheint als Ergebnis der Wert 0, bedeutet dies, dass die Suchzeichenkette unmittelbar am Anfang der untersuchten Zeichenkette steht.
Im nächsten Beispiel wird nach allen Vorkommen einer Suchzeichenkette innerhalb einer anderen Zeichenkette gesucht (auch in p0601):
Abbildung 6.6 Suchtext mehrfach gefunden
Public Class frm0601
[ ... ]
Private Sub cmdSucheAlle_Click( ... ) Handles ...
Dim eingabe As String
Dim such As String
Dim position As Integer
Dim suchstart As Integer = 0
Dim anzeige As String
Dim anzahl As Integer = 0
eingabe = txtEingabe.Text
such = txtSuche.Text
anzeige = "Suchtext bei Zeichen:" & vbCrLf
Do
position = eingabe.IndexOf(such, suchstart)
suchstart = position + 1
If position = -1 Then
Exit Do
Else
anzeige &= position & vbCrLf
anzahl += 1
End If
Loop
anzeige &= "Anzahl: " & anzahl
lblAnzeige.Text = anzeige
End Sub
[ ... ]
End ClassZur Erläuterung:
- Innerhalb einer Do-Loop-Schleife wird mehrmals nach der Suchzeichenkette gesucht. Da es von den Benutzereingaben abhängt, wie häufig die Suchzeichenkette vorkommt und ob sie überhaupt vorkommt, kann keine For-Schleife eingesetzt werden.
Mehrmals suchen
- Die Startposition (die Variable suchstart) wird bei diesem Suchlauf immer wieder neu eingestellt. Sie steht zunächst bei 0, folglich beginnt die Suche am Anfang der untersuchten Zeichenkette. Beim nächsten Durchlauf beginnt die Suche ein Zeichen hinter dem letzten gefundenen Vorkommen.
- Die Schleife wird verlassen, sobald ein Suchlauf ergibt, dass die Suchzeichenkette nicht noch einmal vorhanden ist. Andernfalls wird die gefundene Position ausgegeben und der Zähler erhöht.
- Zuletzt wird der Zähler ausgegeben.
6.1.5 Einfügen 

Insert
Die Methode Insert() ermöglicht das Einfügen einer Zeichenkette in eine andere Zeichenkette. Mit dieser Methode umgeht man das Zerlegen und erneute Zusammensetzen der Zeichenkette.
ArgumentOutOfRange
Die Position der Einfügestelle muss angegeben werden. Sie muss innerhalb der Zeichenkette liegen, da sonst eine Ausnahme vom Typ »ArgumentOutOfRangeException« auftritt.
Entweder muss man also diese Ausnahme behandeln oder dafür sorgen, dass die Einfügestelle richtig gewählt wird. Im folgendem Programm (p0602) wurde mithilfe einer Ereignissteuerung die zweite Möglichkeit gewählt:
Public Class frm0602
Private Sub cmdEinfügen_Click( ... ) Handles ...
Dim eingabe As String
Dim einfügen As String
Dim anzeige As String
eingabe = txtEingabe.Text
einfügen = txtEinfügen.Text
anzeige = eingabe.Insert(numEinfügen.Value, einfügen)
lblAnzeige.Text = anzeige
End Sub
Private Sub txtEingabe_TextChanged( ... ) Handles ...
Dim eingabe As String
eingabe = txtEingabe.Text
numEinfügen.Maximum = eingabe.Length
End Sub
End ClassAbbildung 6.7 Einfügen von Zeichen in eine Zeichenkette
Zur Erläuterung:
- Der Benutzer gibt einen einzufügenden Text ein und wählt in dem Zahlenauswahlfeld eine Einfügeposition aus.
- Anschließend wird der einzufügende Text an dieser Position in die Originalzeichenkette gesetzt. Die folgenden Zeichen werden entsprechend nach hinten verschoben.
- Das Zahlenauswahlfeld (NumericUpDown) wird zur Entwicklungszeit auf die Werte Minimum = 0, Value = 0 und Maximum = 0 eingestellt. Es kann also zunächst nur die Einfügeposition 0 ausgewählt werden.
- Beim Ereignis txtEingabe_TextChanged, also bei jeder Eingabe oder Änderung der Originalzeichenkette, wird sofort die zugehörige Ereignisprozedur aufgerufen. Darin wird die Länge des eingegebenen Textes ermittelt. Dieser Wert wird als neues Maximum für das Zahlenauswahlfeld genommen. Damit ist gewährleistet, dass der Benutzer keine Einfügeposition wählen kann, die außerhalb der Originalzeichenkette liegt.
- Wenn der Benutzer im Zahlenauswahlfeld z. B. die Position des letzten Zeichens als Einfügeposition gewählt hat und anschließend die Originalzeichenkette verkürzt, dann verändert sich auch sofort der eingestellte Wert des Zahlenauswahlfelds. Grund hierfür ist, dass der aktuelle Wert oberhalb des Maximums liegt – dies lässt das Zahlenauswahlfeld nicht zu.
6.1.6 Löschen 

Remove
Die Methode Remove() dient zum Löschen von Zeichen aus einer Zeichenkette. Auch mit dieser Methode umgeht man ein Zerlegen und erneutes Zusammensetzen der Zeichenkette. Die Position der Löschstelle muss angegeben werden.
ArgumentOutOfRange
Weder die Position der Löschstelle noch eines der zu löschenden Zeichen darf außerhalb der Zeichenkette liegen, da sonst wiederum eine Ausnahme vom Typ »ArgumentOutOfRangeException« auftritt.
Im folgenden Programm (p0603) wurde dies ähnlich wie im vorherigen Programm umgangen:
Abbildung 6.8 Löschen von Zeichen aus einer Zeichenkette
Public Class frm0603
Private Sub cmdLöschen_Click( ... ) Handles ...
Dim eingabe As String
Dim anzeige As String
eingabe = txtEingabe.Text
anzeige = eingabe.Remove(_
numPosition.Value, numAnzahl.Value)
lblAnzeige.Text = anzeige
End Sub
Private Sub txtEingabe_TextChanged( ... ) Handles ...
Dim eingabe As String
eingabe = txtEingabe.Text
numAnzahl.Maximum = eingabe.Length
numPosition.Maximum = eingabe.Length - 1
End Sub
Private Sub numPosition_ValueChanged( ... ) _
Handles ...
Dim eingabe As String
eingabe = txtEingabe.Text
numAnzahl.Maximum = eingabe.Length - _
numPosition.Value
End Sub
End ClassZur Erläuterung:
- Der Benutzer wählt in den beiden Zahlenauswahlfeldern aus, ab welcher Position er wie viele Zeichen löschen möchte.
- Anschließend werden die entsprechenden Zeichen gelöscht und die folgenden Zeichen werden nach vorne verschoben.
- Beide Zahlenauswahlfelder werden zur Entwicklungszeit auf die Werte Minimum = 0, Value = 0 und Maximum = 0 eingestellt. Es können also zunächst nur die Löschposition 0 und die Anzahl 0 ausgewählt werden.
- Bei jeder Eingabe oder Änderung der Originalzeichenkette werden die Maxima für die beiden Zahlenauswahlfelder neu eingestellt. Damit ist gewährleistet, dass der Benutzer keine Löschposition wählen kann, die außerhalb der Originalzeichenkette liegt. Außerdem kann die Anzahl der zu löschenden Zeichen nicht größer sein, als die Anzahl der vorhandenen Zeichen.
- Sobald der Benutzer die Löschposition verändert, wird die maximal wählbare Anzahl der zu löschenden Zeichen ebenfalls verändert. Gibt es z. B. ab der Löschposition noch drei Zeichen und wird die Löschposition um 1 erhöht, so wird die Anzahl um 1 herabgesetzt.
6.1.7 Teilzeichenkette ermitteln 

SubString
Zur Extraktion eines Teils einer Zeichenkette nutzt man die Methode SubString(). Es müssen Startposition und Länge der gewünschten Teilzeichenkette angegeben werden.
ArgumentOutOfRange
Weder die Position noch eines der zu extrahierenden Zeichen darf außerhalb der Zeichenkette liegen, da sonst wiederum eine Ausnahme vom Typ »ArgumentOutOfRangeException« auftritt.
Analog zu den vorherigen Programmen wurde diese Vorgabe wie folgt (p0604) gelöst:
Abbildung 6.9 Teilstring ermitteln
Public Class frm0604
Private Sub cmdLöschen_Click( ... ) Handles ...
Dim eingabe As String
Dim anzeige As String
eingabe = txtEingabe.Text
anzeige = eingabe.Substring (_
numPosition.Value, numLänge.Value)
lblAnzeige.Text = anzeige
End Sub
Private Sub txtEingabe_TextChanged( ... ) Handles ...
Dim eingabe As String
eingabe = txtEingabe.Text
numPosition.Maximum = eingabe.Length - 1
numLänge.Maximum = eingabe.Length
End Sub
Private Sub numPosition_ValueChanged( ... ) _
Handles ...
Dim eingabe As String
eingabe = txtEingabe.Text
numLänge.Maximum = eingabe.Length - _
numPosition.Value
End Sub
End ClassZur Erläuterung:
- Der Benutzer wählt in den beiden Zahlenauswahlfeldern aus, ab welcher Position er wie viele Zeichen extrahieren möchte.
- Anschließend werden die entsprechenden Zeichen kopiert.
- Eine Änderung der Originalzeichenkette hat (wie beim Löschen) Auswirkungen auf die Maxima der beiden Zahlenauswahlfelder. Daher kann die Ausnahme »ArgumentOutOfRangeException« nicht auftreten.
6.1.8 Zeichen ersetzen 

Replace
Mithilfe der Methode Replace() kann wie beim Suchen und Ersetzen in einem Textverarbeitungssystem jedes Vorkommen einer gesuchten Zeichenkette durch eine andere Zeichenkette ersetzt werden.
Das folgende Programm liefert hierfür ein Beispiel (p0605):
Public Class frm0605
Private Sub cmdErsetzen_Click( ... ) Handles ...
Dim eingabe As String
Dim suchen As String
Dim ersetzen As String
Dim anzeige As String
eingabe = txtEingabe.Text
suchen = txtSuchen.Text
ersetzen = txtErsetzen.Text
anzeige = eingabe.Replace(suchen, ersetzen)
lblAnzeige.Text = anzeige
End Sub
End ClassAbbildung 6.10 Ersetzen einer Zeichenkette
Zur Erläuterung:
- Jedes Vorkommen der Zeichenfolge aus dem Textfeld unter dem Begriff »Ersetze:« wird ersetzt durch die Zeichenfolge aus dem Textfeld unter dem Begriff »durch:«.



Jetzt online bestellen















