automatischen Einzug deaktivieren

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

automatischen Einzug deaktivieren

Beitrag 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
Zuletzt geändert von Mok am 10.07.2010 18:23, insgesamt 2-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Re: automatischen Einzug deaktivieren

Beitrag 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?
OS: Windows 8.1 Pro
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: automatischen Einzug deaktivieren

Beitrag von Mok »

Ich dachte, das könnte man evtl. über den Befehl selbst steuern, aber scheinbar bleibt mir kein anderer Weg.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: automatischen Einzug deaktivieren

Beitrag 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. :(
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: automatischen Einzug deaktivieren

Beitrag von hjbremer »

RTF Mode aktivieren
#EM_SETPARAFORMAT benutzen
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: automatischen Einzug deaktivieren

Beitrag von NicTheQuick »

Normalerweise muss man um einen Callback zu entfernen einfach 0 übergeben statt der Callback-Procedure.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: automatischen Einzug deaktivieren

Beitrag 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?
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: automatischen Einzug deaktivieren

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: automatischen Einzug deaktivieren

Beitrag 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?
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: automatischen Einzug deaktivieren

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten