Für das Vorbereiten von langen Strings für das Drucken stieß ich auf das Problem, dass bei Anwendung der Funktion DrawString mittels StringFormat nur die Option WordWrap zur Verfügung steht, d.h., lange Strings werden da automatisch, optimal bei Auftreten von Leerzeichen umgebrochen. In meinem Fall traten aber lange Strings (bspw. Verzeichnisnamen) auf, die keinerlei Leerzeichen enthielten. Deshalb musste ich nach Möglichkeiten suchen, den Umbruch anders zu gewährleisten. Zwei Möglichkeiten und deren Kombination habe ich dazu entwickelt. Die erste Funktion, die ich zeige, ist gewissermaßen eine Hilfsfunktion, die in den weiteren Funktionen verwendet wird. Sie erzeugt einen Teilstring des Originalstrings mittels der Measurement-Methode: ''' <summary> ''' Teilstring eines Strings gemäß Measurement-Methode ''' </summary> ''' <param name="theStr">der String</param> ''' <param name="theFont">der Font</param> ''' <param name="theWidth">die maximal zur Verfügung stehende Breite</param> ''' <param name="g">Graphicsobjekt, auf das der String ausgegeben wird</param> ''' <param name="beginChar">Index des ersten zeichens, ab dem die Breite gemessen wird</param><returns ''' <returns>den Teil eines Strings, der eine vorgegebene Breite einhält und ''' den Index des letzten Zeichens im Originalstring</returns> Public Function getPartialString( _ theStr As String, theFont As Font, theWidth As Single, _ g As Graphics, Optional beginChar As Short = 0) As Tuple(Of String, Short) Dim actS As SizeF, i, j As Short, strTemp As String ' Vom Index eines bestimmten Zeichens an bis zum String-Ende ' einen Teilstring erzeugen, der immer um ein Zeichen ergänzt wird. ' Den erzeugten Teilstring nach seiner Breite messen und wenn Breite überschritten ' wird, den passenden Teilstring und den Index des letzten Zeichens ausgeben. For i = beginChar To theStr.Length - 1 strTemp = theStr.Substring(beginChar, j) actS = g.MeasureString(strTemp, theFont) If actS.Width >= theWidth Then Exit For j += 1 Next If i = theStr.Length Then strTemp = theStr.Substring(beginChar) i = -1 ' Index für letzten Teilstring, wenn Teilstring kürzer als vorgegebene Breite End If Return New Tuple(Of String, Short)(strTemp, i) End Function Die zweite Funktion erzeugt ein Feld der Teilstrings eines Originalstrings. Diese Teilstrings "passen" jeder für sich in die vorgegebene Breite. Mit einfachem Join-Befehl können die Teilstrings unter Verwendung eines Umbruchzeichens (vbCrLf) wieder zusammengesetzt und dann mittels Drawstring ausgegeben werden. ''' <summary> ''' Erzeugen eines Felds von Teilstrings eines Strings gemäß Measurement-Methode ''' </summary> ''' <param name="theStr">der String</param> ''' <param name="theFont">der Font</param> ''' <param name="theWidth">die maximal zur Verfügung stehende Breite</param> ''' <param name="g">Graphicsobjekt, auf das der String ausgegeben wird</param> ''' <returns>ein Feld mit den Teilstrings eines strings, die eine vorgegebene Breite einhalten</returns> Public Function splitStringMeasurement( _ theStr As String, theFont As Font, theWidth As Single, g As Graphics) As String() Dim strTemp As Tuple(Of String, Short), j, i As Short Dim sp() As String 'das Ausgabefeld mit den Teilstrings i = 0 : j = 0 Do strTemp = getPartialString(theStr, theFont, theWidth, g, i) 'einen Teilstring ermitteln ReDim Preserve sp(j) ' Teilstring ins Feld speichern sp(j) = strTemp.Item1 ' letzten Index des Teilstrings als Anfangsindex für nächsten Teilstring verwenden i = strTemp.Item2 j += 1 Loop Until i < 0 Return sp 'Rückgabe des Teilstring-Feldes End Function Die dritte hier gezeigte Funktion realisiert das Umbrechen von langen Strings eben nicht am Leerzeichen (WordWrap) sondern an einem selbst vorgegebenem Zeichen (bspw. \). Die Zeilen werden dabei immer so in der Breite eingepasst, dass das spezielle Zeichen den Abschluss der Zeile bildet. ''' <summary> ''' Umbrechen eines Strings, ''' nach einem speziellen Zeichen ''' </summary> ''' <param name="theStr">der String</param> ''' <param name="theFont">der Font</param> ''' <param name="theWidth">die maximal zur Verfügung stehende Breite</param> ''' <param name="g">Graphicsobjekt, auf das der String ausgegeben wird</param> ''' <param name="insStr">der String zum Einfügen an der 'Wrap-Stelle' (Standard: Zeilenumbruch)</param> ''' <param name="specChar">das spezielle Zeichen</param> ''' <returns>den umgebrochenen String</returns> Public Function wrapStringSpecChar( _ theStr As String, _ theFont As Font, _ theWidth As Single, _ g As Graphics, _ Optional insStr As String = vbCrLf, _ Optional specChar As String = "\") As String Dim actS As SizeF, i, j As Short, strTempL As String Dim spt() As String Dim sp() As String = Split(theStr, specChar) 'splitten nach speziellem Zeichen ' überprüfen aller "Unterstrings (ohne speziellem Zeichen)" auf Länge ' und Einfügen von Zeilenumbruch, wenn notwendig For i = 0 To sp.Length - 1 strTempL = sp(i) + If(i < sp.Length - 1, specChar, "") spt = splitStringMeasurement(strTempL, theFont, theWidth, g) strTempL = Join(spt, insStr) sp(i) = strTempL Next strTempL = "" For i = 0 To sp.Length - 1 strTempL += sp(i) ' messen des gekürzten Strings If i < sp.Length - 1 Then actS = g.MeasureString(strTempL + sp(i + 1), theFont) ' prüfen, ob gekürzter String in der Länge passt If actS.Width > theWidth Then strTempL += insStr 'Umbruchzeichen einfügen ' Rest anfügen For j = i + 1 To sp.Length - 1 strTempL += sp(j) Next theStr = strTempL Exit For End If End If Next Return theStr End Function Zwei Beispiele des Aufrufs: e.Graphics.. das Graphics-Objekt in das der String ausgegeben werden soll) 1. Einfacher Umbruch, wenn vorgegebene Breite erreicht myText = Join(splitStringMeasurement(myText, the_font, layout_rect.Width, e.Graphics), vbCrLf) 2. Umbruch mittels speziellem Zeichen myText = wrapStringSpecChar(myText, the_font, layout_rect.Width, e.Graphics) Dieser Tipp wurde bereits 7.814 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |