XbpMLE und Tabulatoren

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

XbpMLE und Tabulatoren

Beitrag von UliTs »

Hallo allerseits,

Ich möchte XbpMLE nur um Tabulatoren erweitern. Wenn man XbpMLE:ignoreTabs auf FALSE gesetzt hat, werden im Eingabefeld die Tabulatoren als "Standardtabulatoren" behandelt, ich vermute so alle 1 Zoll kommt ein linksbündiger Tab.
Gibt es eine Möglichkeit dem XbpMLE Tabulatoren vorzugeben (auch Rechtsbündige)?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: XbpMLE und Tabulatoren

Beitrag von Günter Beyes »

Hallo Uli,

linksbündige Tabulaturen kannst du im XbpMLE über die Windows-Message EM_SETTABSTOPS setzen, zum Beispiel:

Code: Alles auswählen

#define EM_SETTABSTOPS 0x00CB

aTabStops := {10,30,60,100,150,210}
sTabStops := ""      
FOR i := 1 TO len( aTabStops )
    sTabStops += U2Bin( aTabStops[i] )
NEXT
rc := SendMessageA( oMLE:getHWND(), EM_SETTABSTOPS, len( aTabStops ), sTabStops )

/*
Edit:

anschließend ist

oMLE:invalidateRect()

nötig.


Um einen gleichmäßigen Tabulatorabstand zu setzen, reicht

SendMessageA( oMLE:getHWND(), EM_SETTABSTOPS, 1, U2Bin(nTababstand) )

Und um den Normalzustand wieder herzustellen,

SendMessageA( oMLE:getHWND(), EM_SETTABSTOPS, 0, 0 )

*/

DLLFUNCTION  SendMessageA( hwnd, msg, wparam, lparam ) ;
USING STDCALL from user32.dll

Die Tabstops sind in Dialogtemplate-Einheiten angegeben, die jeweils 1/4 der durchschnittlichen Zeichenbreite des verwendeten Fonts entsprechen. Der normale Tabulatorabstand beträgt 32 Einheiten und damit 8 Zeichen durchschnittlicher Breite.

Rechtsbündige Tabs kann XbpMLE im Richtext-Modus darstellen, wenn ein passend rtf-codierter String übergeben wird. Selbst als einfacher Richtext-Editor ist XbpMLE in diesem Modus aber leider unbrauchbar.

Code: Alles auswählen

oMle := XbpMLE():New(...)

oMle:Format := 3  // Richtext-Modus

oMle:Create()
oMle:setData( MemoRead( "RtfDatei.rtf" ) )
RTF-MLE.PNG
RTF-MLE.PNG (3.86 KiB) 3403 mal betrachtet
aTabStops := {10,30,60,100,150,210}
aTabStops := {10,30,60,100,150,210}
MLE_SetTabStops.png (10.4 KiB) 3402 mal betrachtet
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: XbpMLE und Tabulatoren

Beitrag von Herbert »

Genau das suchte ich.
Ergänzende Frage dazu:
Wenn ich den Inhalt drucken will, was muss ich tun, damit die Tabs auf dem Ausdruck berücksichtigt werden?
Grüsse Herbert
Immer in Bewegung...
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Re: XbpMLE und Tabulatoren

Beitrag von Günter Beyes »

Hallo Herbert,

du rechnest die Tab-Positionen in Pixel um, zerlegst die Zeile in ihre (durch Tab getrennten) Einzelteile und
druckst die Teilstrings einzeln mit GraStringAt() an diesen Positionen, den ersten Teilstring an Position 0.
Wenn du links einen Rand lassen willst, verschieben sich die Positionen entsprechend.

Die durchschnittliche Zeichenbreite erhältst du nach http://support.microsoft.com/default.as ... -US;145994
mit

Code: Alles auswählen

aPoints    := GraQueryTextBox( oPS, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" )
nTextWidth := aPoints[3][1] - aPoints[2][1]
nDurchschnittsZeichenBreite := round( (nTextWidth / 26 + 1) / 2, 0)
Dabei ist oPS der Presentation Space des Druckers mit bereits selektiertem Font.

Die Position der Tabs ist dann

Code: Alles auswählen

nTabPositionInPixels := round( nTabPositionInUnits * nDurchschnittsZeichenBreite / 4, 0 )
Gruß,
Günter
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: XbpMLE und Tabulatoren

Beitrag von Herbert »

Danke, danke
Ich dachte, es gäbe einen Trick, ohne die Rechnerei machen zu müssen.
Grüsse Herbert
Immer in Bewegung...
Antworten