Seite 1 von 1
automatischen Einzug deaktivieren
Verfasst: 17.04.2010 12:10
von Mok
Hallo.
Hier ist ein Code für einen automatischen Einzug im EditorGadget. Die Frage: (Wie) kann man das wieder rückgängig machen?
MfG, Mok
Re: automatischen Einzug deaktivieren
Verfasst: 17.04.2010 14:54
von iostream
Wenn du keinen automatischen Einzug möchtest, dann setze doch ne globale Variable die je nach Wert (true/false) den Zeileneinzug im Callback aktiviert oder nicht.
Oder was meinst du?
Re: automatischen Einzug deaktivieren
Verfasst: 17.04.2010 21:42
von Mok
Ich dachte, das könnte man evtl. über den Befehl selbst steuern, aber scheinbar bleibt mir kein anderer Weg.
Re: automatischen Einzug deaktivieren
Verfasst: 10.07.2010 19:43
von Mok
Wie soll ich das genau machen?
Bei
Code: Alles auswählen
Procedure RichEditCallback(hWnd, uMsg, wParam, lParam)
Protected Range.CHARRANGE
Protected PrevLine.l
Protected PrevLineContent.s
Protected Indent.s
Protected *Pointer.Character
If uMsg = #WM_CHAR And wParam = #CR
SendMessage_(hWnd, #EM_EXGETSEL, 0, @Range)
PrevLine = SendMessage_(hWnd, #EM_EXLINEFROMCHAR, 0, Range\cpMin) - 1
PrevLineContent = GetGadgetItemText(#EDITOR, PrevLine)
*Pointer = @PrevLineContent
Indent = ""
If Var = 1
While *Pointer\c And (*Pointer\c = 9 Or *Pointer\c = 32)
Indent + Chr(*Pointer\c)
*Pointer + SizeOf(Character)
Wend
Else
EndIf
SendMessage_(hWnd, #EM_REPLACESEL, 0, @Indent)
ProcedureReturn 0
EndIf
ProcedureReturn CallWindowProc_(GetWindowLongPtr_(hWnd, #GWLP_USERDATA), hWnd, uMsg, wParam, lParam)
EndProcedure
Kann ich nach dem 2. Mal klicken (AutoEinzug wieder deaktivieren) nichts mehr in die Editorbox schreiben, und beim 4. Mal bekomm ich nen Stack-Overflow.

Re: automatischen Einzug deaktivieren
Verfasst: 11.07.2010 16:46
von hjbremer
RTF Mode aktivieren
#EM_SETPARAFORMAT benutzen
Re: automatischen Einzug deaktivieren
Verfasst: 11.07.2010 16:48
von NicTheQuick
Normalerweise muss man um einen Callback zu entfernen einfach 0 übergeben statt der Callback-Procedure.
Re: automatischen Einzug deaktivieren
Verfasst: 11.07.2010 17:13
von Mok
NicTheQuick hat geschrieben:Normalerweise muss man um einen Callback zu entfernen einfach 0 übergeben statt der Callback-Procedure.
Mit
Code: Alles auswählen
If AutoCursor = 1
Protected Range.CHARRANGE
Protected PrevLine.l
Protected PrevLineContent.s
Protected Indent.s
Protected *Pointer.Character
If uMsg = #WM_CHAR And wParam = #CR
SendMessage_(hWnd, #EM_EXGETSEL, 0, @Range)
PrevLine = SendMessage_(hWnd, #EM_EXLINEFROMCHAR, 0, Range\cpMin) - 1
PrevLineContent = GetGadgetItemText(#Editor_0, PrevLine)
*Pointer = @PrevLineContent
Indent = ""
While *Pointer\c And (*Pointer\c = 9 Or *Pointer\c = 32)
Indent + Chr(*Pointer\c)
*Pointer + SizeOf(Character)
Wend
SendMessage_(hWnd, #EM_REPLACESEL, 0, @Indent)
_RET 0
EndIf
_RET CallWindowProc_(GetWindowLongPtr_(hWnd, #GWLP_USERDATA), hWnd, uMsg, wParam, lParam)
Else
_RET 0
EndIf
Geht's auch nicht

(_RET = Macro)
@hjbremer: Ist ein Editorgadget nicht standardmäßig RTF?
Re: automatischen Einzug deaktivieren
Verfasst: 11.07.2010 23:28
von hjbremer
vielleicht hilft es
näheres bei Microsoft über #PFM_OFFSETINDENT etc
kann man in x verschiedenen Variationen benutzen, viel Worte, wenig versteh
Code: Alles auswählen
Procedure.i EditGadgetSetAlignment(pbnr, wert)
Protected id = GadgetID(pbnr)
Protected format.ParaFormat2\cbSize = SizeOf(ParaFormat2)
With format
\dwMask = #PFM_OFFSETINDENT: \dxStartIndent = wert
;\dwMask = #PFM_STARTINDENT: \dxStartIndent = 150
;\dwMask = #PFM_STARTINDENT: \dxStartIndent = 0
SendMessage_(id, #EM_SETPARAFORMAT, 0, format)
EndWith
EndProcedure
Enumeration
#window
#editor1
#button1
#button2
EndEnumeration
#winbr = 450
#winhh = 400
#wrand = 8
#edix = #wrand
#ediy = #wrand
#edibr = #winbr - #wrand - #wrand
#edihh = #winhh - #wrand - #wrand - 150
Define flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
OpenWindow(#window, 0, 0, #winbr, #winhh, "EditorGadget", flags)
EditorGadget(#editor1, #edix, #ediy, #edibr, #edihh)
ButtonGadget(#button1, 10, #winhh - 30, 80, 20, "on")
ButtonGadget(#button2, 110, #winhh - 30, 80, 20, "off")
EditGadgetSetAlignment(#editor1, 250)
; -Event Schleife-------------------------------------
Repeat
Define event = WaitWindowEvent()
If event = #PB_Event_Gadget
Define wB = EventGadget()
Select wb
Case #button1: EditGadgetSetAlignment(#editor1, 250)
Case #button2: EditGadgetSetAlignment(#editor1, -250)
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
PS: ein EditorGadget ist standardmäßig im RTF Mode
kann man aber ändern, entweder via Befehl oder Streaming aus einer Datei
Re: automatischen Einzug deaktivieren
Verfasst: 12.07.2010 14:35
von Mok
@hjbremer: Ich hätte mir das so vorgestellt, dass der Andwender besstimmen kann (durch Tabs und Leerzeichen), wie weit eingezogen werden soll.
Wie ist das bei den IDEs? Wird das auch so umständlich gemacht?
Re: automatischen Einzug deaktivieren
Verfasst: 12.07.2010 14:53
von hjbremer
Mok hat geschrieben:@hjbremer: Ich hätte mir das so vorgestellt, dass der Andwender besstimmen kann (durch Tabs und Leerzeichen), wie weit eingezogen werden soll.
Wie ist das bei den IDEs? Wird das auch so umständlich gemacht?
umständlich ist relativ. entweder man legt den Wert im Programm fest, oder per Inidatei oder man schreibt ein Eingabefenster. Das betrifft auch die angesprochenen Tabs. Deren Weite kann man bestimmen, aber das Spiel ist doch das gleiche.