Seite 1 von 1

Cursor-Position im Editorgadget bei gedrückter Shift-Taste

Verfasst: 02.09.2006 16:33
von Eckhard.S
Im CodeArchiv findet sich ein toller Code, der die Cursor-Position angibt. Wenn man allerdings ans Ende des Textes klickt, dann die Shifttaste gedrückt hält (markieren), und mit den Pfeiltasten nach links und oben läuft, dann zeigt der x-Wert nicht das richtige Ergebnis. Der y-Wert stimmt.

Kann das jemand reparieren?

Code: Alles auswählen

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1953&highlight=
; Author: Danilo
; Date: 08. August 2003
; 
; by Danilo, 08.08.2003 - german forum 
; transformed to PB 4.0 by ECS
; 
Procedure EditorGadgetCursorX(Gadget) 
  ; returns X-Pos of Cursor 
  REG = GadgetID(Gadget) 
  SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE) 
  ProcedureReturn (Range\cpMax-(SendMessage_(REG,#EM_LINEINDEX,SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin),0))+1) 
EndProcedure 

Procedure EditorGadgetCursorY(Gadget) 
  ; returns Y-Pos of Cursor 
  REG = GadgetID(Gadget) 
  SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE) 
  ProcedureReturn SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin)+1 
EndProcedure 

Procedure EditorGadgetCursorPos(Gadget) 
  ; returns relative Position of Cursor 
  SendMessage_(GadgetID(Gadget),#EM_EXGETSEL,0,Range.CHARRANGE) 
  ProcedureReturn Range\cpMax 
EndProcedure 

Procedure EditorGadgetLocate(Gadget,x,y) 
  ; Set cursor position 
  REG = GadgetID(Gadget) 
  CharIdx = SendMessage_(REG,#EM_LINEINDEX,y-1,0) 
  LLength = SendMessage_(REG,#EM_LINELENGTH,CharIdx,0) 
  If LLength >= x-1 
    CharIdx + x-1 
  EndIf 
  Range.CHARRANGE 
  Range\cpMin = CharIdx 
  Range\cpMax = CharIdx 
  SendMessage_(REG,#EM_EXSETSEL,0,Range) 
EndProcedure 



OpenWindow(1,200,200,300,200,"EditorGadget",#PB_Window_SystemMenu) 
  CreateGadgetList(WindowID(1)) 
  EditorGadget(1,5,5,290,190) 
  
  AddGadgetItem(1,-1,"Hallo!") 
  AddGadgetItem(1,-1,"") 
  AddGadgetItem(1,-1,"Hier ein paar Proceduren") 
  AddGadgetItem(1,-1,"zur Steuerung des Cursors") 
  AddGadgetItem(1,-1,"im EditorGadget.") 

  EditorGadgetLocate(1,7,2) 

  SetActiveGadget(1) 

Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow: End 
  EndSelect 
  SetWindowText_(WindowID(1),"X: "+Str(EditorGadgetCursorX(1))+" Y: "+Str(EditorGadgetCursorY(1))+" -- Position: "+Str(EditorGadgetCursorPos(1))) 
ForEver 

; ExecutableFormat=Windows
; FirstLine=1
; EnableXP
; EOF

Verfasst: 02.09.2006 17:32
von ts-soft
Das Eventloop sollte in PB4 besser so aussehen:

Code: Alles auswählen

Repeat
  Select WaitWindowEvent(200)
    Case #PB_Event_CloseWindow: End
    Default
      SetWindowText_(WindowID(1),"X: "+Str(EditorGadgetCursorX(1))+" Y: "+Str(EditorGadgetCursorY(1))+" -- Position: "+Str(EditorGadgetCursorPos(1)))
  EndSelect
  
ForEver
Das Timeout gabs ja in PB3.94 noch nicht.
Mit dem Shift weiß ich jetzt auch nicht.

// Nachtrag:
Die Verwendung von SetWindowText_ ist auch nicht mehr erforderlich,
dafür gibt es SetWindowTitle(

Die Werte zwischenspeichern und nur bei Veränderung neu in den Title
schreiben, würde auch ein unnötiges Flimmern vermeiden
:wink:

Re: Cursor-Position im Editorgadget bei gedrückter Shift-Tas

Verfasst: 02.09.2006 20:46
von Donald
Hallo Eckhard.S

hier mal eine meiner Routinen.
Habe mal auf die schnelle ein kleines lauffähiges Programm draus gemacht, damit du es besser Testen kannst.

Vielleicht kannst Du ja davon was gebrauchen.

Code: Alles auswählen

;
; Ermittelt die Cursor Position und den selectierten Bereich.
; 02.09.2006 by Donald for PB 4.00
;
Enumeration
#window
#Editor
#Status
EndEnumeration

OpenWindow(#window,50,50,400,425,"Editor Cursor Positionen anzeigen")
CreateGadgetList(WindowID(#window))
EditorGadget(#Editor,0,0,400,400)
CreateStatusBar(#Status ,WindowID(#window))
AddStatusBarField(400)

Procedure.s Editor_Cursor_Position(Editor)
  CursorChar_lo    = SendMessage_(GadgetID(Editor),#EM_GETSEL,0,0) & $FFFF
  CursorLine_lo    = SendMessage_(GadgetID(Editor),#EM_LINEFROMCHAR,CursorChar_lo,0)
  LineStartChar_lo = SendMessage_(GadgetID(Editor),#EM_LINEINDEX,CursorLine_lo,0)
  CursorColumn_lo  = CursorChar_lo - LineStartChar_lo
  If CursorColumn_lo < 0 : CursorColumn_lo = CursorColumn_lo + 65536 : EndIf
  CursorChar_hi    = (SendMessage_(GadgetID(Editor),#EM_GETSEL,0,0) >> 16) & $FFFF 
  CursorLine_hi    = SendMessage_(GadgetID(Editor),#EM_LINEFROMCHAR,CursorChar_hi,0)
  LineStartChar_hi = SendMessage_(GadgetID(Editor),#EM_LINEINDEX,CursorLine_hi,0)
  CursorColumn_hi  = CursorChar_hi - LineStartChar_hi
  If CursorColumn_hi < 0 : CursorColumn_hi = CursorColumn_hi + 65536 : EndIf
  If CursorLine_lo = CursorLine_hi And CursorColumn_lo = CursorColumn_hi
    If CursorLine_lo1 <> CursorLine_lo Or CursorColumn_lo1 <> CursorColumn_lo
      CursorLine_lo1   = CursorLine_lo
      CursorColumn_lo1 = CursorColumn_lo
      ProcedureReturn "Zeile: " + Str(CursorLine_lo+1) + "  Spalte: "+Str(CursorColumn_lo)
    EndIf
  Else
    If CursorLine_lo1 <> CursorLine_lo Or CursorColumn_lo1 <> CursorColumn_lo Or CursorLine_hi1 <> CursorLine_hi Or CursorColumn_hi1 <> CursorColumn_hi
      CursorLine_lo1   = CursorLine_lo
      CursorColumn_lo1 = CursorColumn_lo
      CursorLine_hi1   = CursorLine_hi
      CursorColumn_hi1 = CursorColumn_hi
      ProcedureReturn  "von " + Str(CursorLine_lo1 + 1) + "-" + Str(CursorColumn_lo1) + " bis " + Str(CursorLine_hi1+1) + "-" + Str(CursorColumn_hi1)
    EndIf
  EndIf
EndProcedure

Repeat 
  EventID  = WaitWindowEvent() 
  StatusBarText(#Status,0,Editor_Cursor_Position(#Editor))
Until EventID=#PB_Event_CloseWindow 

Verfasst: 02.09.2006 21:10
von ts-soft
Da fehlt was :wink:

Code: Alles auswählen

Macro RH_LoWord(long)
  long & $FFFF
EndMacro
Wie es original aussieht weiß ich natürlich nicht

Verfasst: 02.09.2006 21:23
von Donald
ts-soft hat geschrieben:Da fehlt was :wink:

Code: Alles auswählen

Macro RH_LoWord(long)
  long & $FFFF
EndMacro
Wie es original aussieht weiß ich natürlich nicht
Danke Thomas,
hab ich eine Zeile Übersehen gehabt zu ändern.
Habs oben aber schon geändert.

Die RH_String Userlib ist noch einer meiner ganz ersten, als ich
einiges gesammelt hatte und in eine Lib gepackt hatte.
Das eine oder andere darin ist heute noch interessant, aber
einiges davon braucht man nicht mehr, da PB4 es nun auch ohne
lib kann :D