

Informationen über die Zeilen und Position in Textboxen |
Leider bietet Visual Basic standardmäßig keine Eigenschaften oder Funktionen, um herausfinden wieviele Zeilen
eine RTF- oder MultiLine-Textbox besitzt oder wo sich die Eingabemarke gerade befindet. Da man das aber sehr
oft wissen muss, wird hier erklärt, wie man mit Hilfe einer API-Funktion an diese Werte kommt.
| |
| Bewertung dieses Tipps: |     | (bewertet von insgesamt 18 Besuchern) |

Deklarationen |
Wie alle Funktionen für RTF- und Textboxen basiert auch diese auf der sehr oft genutzten API-Funktion
"SendMessage".
Um SendMessage in eigenen Projekten nutzen zu können,
müssen Sie sie zuerst im Kopf der Form oder des Moduls deklarieren. Zusätzlich werden noch einige Konstanten
benötigt:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Const EM_GETLINECOUNT = &HBA
Const EM_LINELENGTH = &HC1
Const EM_LINEINDEX = &HBB
Const EM_LINEFROMCHAR = &HC9
Const EM_GETLINE = &HC4
Const EM_GETFIRSTVISIBLELINE = &HCE

Aufrufe/Funktionen |
Da SendMessage wie gesagt eine ziemliche Allround-API ist, werden die
Befehle durch bestimmte Parameter, also Konstanten angegeben. Es folgt eine Auswahl der interessantesten
Funktionen:
Zum Ermitteln der Zeilenanzahl einer RTF- oder Textbox verwenden Sie folgende Funktion:
Function LineCount(Ctrl As Control) As Long
LineCount = SendMessage(Ctrl.hWnd, EM_GETLINECOUNT, 0, 0)
End Function
Wenn Sie erfahren wollen, wieviele Zeichen eine bestimmte Zeile besitzt, benutzen Sie diese Funktion:
Function LineLength(Ctrl As Control, Line As Long) As Long
LineChar& = SendMessage(Ctrl.hWnd, EM_LINEINDEX, Line, 0&)
LineLength = SendMessage(Ctrl.hWnd, EM_LINELENGTH, LineChar&, 0)
End Function
Durch die Angabe der aktuellen Cursorposition in Zeichen die aktuelle Zeilenposition ermitteln, das kann die
folgende Funktion. Info: Die aktuelle Position vom Start der RTF- oder Textbox aus in Zeichen erhalten
Sie mit "NameDesObjekts.SelStart".
Function LineIndex(Ctrl As Control, CursorPos As Long) As Long
LineIndex = SendMessage(Ctrl.hWnd, EM_LINEFROMCHAR, CursorPos, 0&)
End Function
Bei welchem Zeichen vom (Anfang der RTF- oder Textbox gesehen) fängt die Zeile so und so an? Das sagt
Ihnen die folgende Funktion:
Function LineStart(Ctrl As Control, Line As Long) As Long
LineStart = SendMessage(Ctrl.hWnd, EM_LINEINDEX, Line, 0&)
End Function
Um herauszufinden, wieviele der Zeilen überhaupt sichtbar sind, verwenden Sie diese Funktion:
Function VisibleLines(Ctrl As Control) As Long
On Error Resume Next
MName$ = Ctrl.Parent.FontName
MSize% = Ctrl.Parent.FontSize
Ctrl.Parent.FontName = Ctrl.FontName
Ctrl.Parent.FontSize = Ctrl.FontSize
If Err > 0 Then
Ctrl.Parent.FontName = Ctrl.SelFontName
Ctrl.Parent.FontSize = Ctrl.SelFontSize
End If
LH% = Ctrl.Parent.TextHeight("X") + 1
VisibleLines = Ctrl.Height \ LH%
Ctrl.Parent.FontName = MName$
Ctrl.Parent.FontSize = MSize%
End Function
Um zu erfahren, wo sich die Eingabemarke (relativ zum Zeilenstart) befindet, benutzen Sie folgende Funktion:
Function CharLineIndex(Ctrl As Control) As Long
varLine& = LineIndex(Ctrl, Ctrl.SelStart)
varLineStart& = LineStart(Ctrl, varLine&)
CharLineIndex = Ctrl.SelStart - varLineStart&
End Function

Beispielprojekt |
Hier können Sie sich ein Beispielprojekt für Vb5 und Vb6 herunterladen, das vielleicht alles noch einmal etwas
anschaulicher erklärt.
|
Quellen: SHADOWare.de
Letzte Änderung: 12.06.00
|
©2000 by SHADOWare, Thomas Bachem
|