Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Tabs in der Rich Textbox

3 views
Skip to first unread message

Klaus Ketelaer

unread,
Sep 14, 2023, 9:09:28 AM9/14/23
to
Hallo zusammen,

ich hätte 2 Fragen zur Ritch Textbox.

Wenn ich in der Rich Textbox keine Tabulatoren eingerichtet habe,
dann habe ich eine Standard-Tabulatorgröße von 6 Zeichen. Wie kann
ich diesen Wert abfragen und ggf. ändern, ohne neue Tabulatoren
einzurichten?

Gibt es eine Möglichkeit die korrekte Spaltenposition in einer Zeile
zu berechnen, ohne sich einen abzubrechen?

Berechnungen wie EM_GETSEL - EM_LINEINDEX liefern nur Quark weil
Tabulatoren nur als 1 Zeichen gewertet werden.

Ich habe jetzt die folgende Funktion programmiert, die einwandfrei
funktioniert; Aber das kann's ja wohl nicht sein, dass man so einen
Aufwand betreiben muss, der auch alles andere als performant ist.

Public Function CurrentCol() As Long
Dim lSel As Long
Dim lRow As Long
Dim lCol As Long

Dim lPos As Long
Dim i As Long

Call SendMessage(m_RTF.hwnd, EM_GETSEL, 0&, lSel)
lRow = SendMessage(m_RTF.hwnd, EM_LINEFROMCHAR, lSel, ByVal 0&) + 1
lCol = SendMessage(m_RTF.hwnd, EM_LINEINDEX, lRow - 1, 0&) + 1

lPos = 0
For i = lCol To lSel
If Mid$(m_RTF.Text, i, 1) = vbTab Then
lPos = lPos + 1
Do Until (lPos Mod 6) = 0
lPos = lPos + 1
Loop
Else
lPos = lPos + 1
End If
Next i

CurrentCol = lPos + 1

' CurrentCol = m_RTF.SelStart - SendMessage(m_RTF.hwnd, EM_LINEINDEX,
CurrentRow() - 1, 0&) + 1
End Function

Gruß Klaus

Wendelin Uez

unread,
Sep 15, 2023, 11:24:41 AM9/15/23
to
Soweit ich weiß kann das RTB-Control zwar vbTABs zwar expandieren, hat aber
keine Funktionen um diese Tabs auszulesen oder zu setzen.

Solange die Schrift über einen String konstant bleibt kann man dessen sich
aus der Expansion ergebende Länge über TextWidth ermitteln, d.h. TextWidth
expandiert vbTABs.

In user32.dll gibt es eine Funktion TabbedTextOut, der man u.a. Device
Kontext, x/y-Position, Ausgabestring und eine Liste mit Tab-Definitionen
übergeben und damit eine Textausgabe mit Expansion auf userdefinierte
Tab-Positionen erreichen kann.

Klaus Ketelaer

unread,
Sep 15, 2023, 8:09:36 PM9/15/23
to
Am 15.09.2023 um 17:21 schrieb Wendelin Uez:
> Soweit ich weiß kann das RTB-Control zwar vbTABs zwar expandieren, hat
> aber keine Funktionen um diese Tabs auszulesen oder zu setzen.

Tabs kann man mit SelTabs setzen und auslesen

> Solange die Schrift über einen String konstant bleibt kann man dessen
> sich aus der Expansion ergebende Länge über TextWidth ermitteln, d.h.
> TextWidth expandiert vbTABs.

Das Control ist Zeichenbasiert und verfügt über solche Methoden nicht.
Selbst wenn es diese Methoden hätte, was sollte ich damit erreichen?
Die Breite des Textes hilft mir nicht weiter.

> In user32.dll gibt es eine Funktion TabbedTextOut, der man u.a. Device
> Kontext, x/y-Position, Ausgabestring und eine Liste mit Tab-Definitionen
> übergeben und damit eine Textausgabe mit Expansion auf userdefinierte
> Tab-Positionen erreichen kann.

Im Grunde möchte ich nur wissen, ob es eine Funktion gibt, die mir die
logische Cursor-Position und nicht die physische Position zurück gibt.

Wie gesagt, das Problem ist gelöst. Ich hätte es nur gerne besser
gelöst, weil ich den Code irgendwie idiotisch finde ....

Gruß Klaus

Klaus Ketelaer

unread,
Sep 16, 2023, 11:04:22 AM9/16/23
to
Am 15.09.2023 um 17:21 schrieb Wendelin Uez:
Hier noch einmal die dokumentierte Version, damit Du siehst,
worum es geht:

' Liefert die logische Position des Cursors
Public Function CurrentCol() As Long
Dim lSel As Long ' Selektiertes Zeichen
Dim lRow As Long ' Zeile in der das Zeichen liegt
Dim lCol As Long ' Erste Spalte der zeile
Dim lPos As Long ' Errechnete logische Position der spalte
Dim i As Long

Call SendMessage(m_RTF.hwnd, EM_GETSEL, 0&, lSel) '
Position der Spalte im Dokument
lRow = SendMessage(m_RTF.hwnd, EM_LINEFROMCHAR, lSel, 0&) ' Zeile
in der die Spalte liegt
lCol = SendMessage(m_RTF.hwnd, EM_LINEINDEX, lRow, 0&) + 1 ' Erste
Spalte der Zeile

lPos = 0
' Zeile bis zur aktuellen Position durchlaufen
For i = lCol To lSel
' Prüfe ob das aktukelle Zeichen ein Tab ist
If Mid$(m_RTF.Text, i, 1) = vbTab Then
' Wenn ja, Anzahl Zeichen bis zum nächsten Tab berechnen
lPos = lPos + (m_TabWidth - (lPos Mod m_TabWidth))
Else
' Ein normales Zeichen
lPos = lPos + 1
End If
Next i

' Logische Position des Cursors
CurrentCol = lPos + 1
End Function

0 new messages