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.