Zum vorherigen AbschnittZum nächsten Abschnitt 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.
Ihre Bewertung:
 12345
    

Bewertung dieses Tipps:  (bewertet von insgesamt 18 Besuchern)

 Zum vorherigen AbschnittZum nächsten Abschnitt 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
   
 Zum vorherigen AbschnittZum nächsten Abschnitt 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

 Zum vorherigen AbschnittZum nächsten Abschnitt Beispielprojekt
Hier können Sie sich ein Beispielprojekt für Vb5 und Vb6 herunterladen, das vielleicht alles noch einmal etwas anschaulicher erklärt.
 Projekt herunterladen



Quellen: SHADOWare.de
Letzte Änderung: 12.06.00
©2000 by SHADOWare, Thomas Bachem