Kontakt
DSVGO
Historie | |
07.04.2001 | Sprung zur aktuellen Cursor-Position |
20.02.2001 | Erste Version: Zugriff auf einzelne Zeilen |
Mit den unten vorgestellten Routinen kann auf den Inhalt der MultiLine-TextBox zeilenweise zugegriffen werden. Dies ist sehr praktisch, um z.B. eine ListBox mit den Zeilen einer TextBox zu füllen, oder um die TextBox genauso auszudrucken, wie sie auf dem Bildschirm erscheint.
Außerdem wird eine Routine vorgestellt, mit der zur aktuellen Cursor-Position gescrollt werden kann (z.B. interessant, wenn die ScrollBars-Eigenschaft nicht den Wert "0 - None" hat).
Der folgende Code füllt bei Klick auf die Schaltfläche "cmdAnalyse" die ListBox "lstZeilen" mit den umgebrochenen Zeilen der mehrzeiligen TextBox "txtInhalt":
Private Sub cmdAnalyse_Click() Dim i As Long 'ListBox leeren: lstZeilen.Clear 'ListBox mit allen Zeilen füllen: For i = 1 To TextBoxLineCount(txtInhalt) lstZeilen.AddItem TextBoxLine(txtInhalt, i) Next i End Sub
Ein zeilenweiser Ausdruck könnte dadurch erreicht werden, dass im obigen Beispiel statt lstZeilen.AddItem einfach Printer.Print geschrieben wird. Jetzt müssen nur noch Probleme wie Seitenwechsel und Positionierung gelöst werden... Das überlasse ich mal als Hausaufgaben!
Wenn die TextBox "txtInhalt" den Fokus erhält, stellt der folgende Code die Sichtbarkeit des Cursors sicher:
Private Sub txtInhalt_GotFocus() TextBoxScrollToCursor txtInhalt End Sub
Das größte Problem der Zeilen-Erkennung ist der automatische Umbruch: Dadurch werden "willkürlich" neue Zeilen erzeugt, obwohl der Anwender nicht Return gedrückt hat.
Zum Glück bietet das System einige API-Funktionen (genauer: Windows-Nachrichten), die den automatischen Zeilenumbruch berücksichtigen. Die folgenden Zeilen müssen daher im Deklarationsteil eines Moduls oder Formulars eingefügt werden:
Private Declare Function SendMessageA Lib "user32" ( _ ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Any _ ) As Long Private Const EM_GETLINE = &HC4 Private Const EM_GETLINECOUNT = &HBA Private Const EM_SCROLLCARET = &HB7
Die folgende Funktion bestimmt die Anzahl der Zeilen; es genügt ein einfacher Aufruf einer API-Funktion:
Public Function TextBoxLineCount( _ ByRef txt As TextBox ) As Long TextBoxLineCount = _ SendMessageA(txt.hwnd, EM_GETLINECOUNT, 0, 0&) End Function
Eine bestimmte Zeile aus dem Inhalt einer TextBox kann mit folgender Funktion ausgeschnitten werden (die erste Zeile hat übrigens die Nummer 1):
Public Function TextBoxLine( _ ByRef txt As TextBox, _ ByVal LineNr As Long _ ) As String Dim Buffer As String * 1024 Dim Length As Long 'Buffer-Länge initialisieren: Buffer = Chr$(Len(Buffer) And &HFF) & Chr$(Len(Buffer) \ &H100) 'Buffer mit Zeile füllen: Length = SendMessageA(txt.hwnd, EM_GETLINE, LineNr - 1, Buffer) 'Überflüssiges abschneiden: TextBoxLine = Left$(Buffer, Length) End Function
Die folgende Routine sorgt für das Scrollen zur aktuellen Cursor-Position:
Sub TextBoxScrollToCursor(ByRef txt As TextBox) SendMessageA txt.hwnd, EM_SCROLLCARET, 0, 0& End Sub
© Jost Schwider, 20.02.2001-07.04.2001 - http://vb-tec.de/textbox.htm