Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Objekte / TextBox / MultiLine

MultiLine-TextBox besser nutzen

Historie
07.04.2001Sprung zur aktuellen Cursor-Position
20.02.2001Erste Version: Zugriff auf einzelne Zeilen

Beschreibung

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).

Beispiele

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! Smile!

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

Code

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