Seite 1 von 2

Cursor im StringGadget verschieben

Verfasst: 18.08.2008 18:30
von iostream
Ich habe folgendes Problem:
Ich möchte manuell per Klick auf ein ButtonGadget den Cursor in einem StringGadget eine "Position" weiterschieben (wie wenn ich im StringGadget die rechte oder linke Pfeiltaste drücke)...wie stell ich das an?

Mfg
iostream

Verfasst: 18.08.2008 18:35
von Kaeru Gaman
hm...
wenn du einen Button klickst, dann bekommt der Button den Focus, und nicht mehr das Stringgadget.
du müßtest dir eine komplett eigene Oberfläche proggen, also nicht den standard-cursor benutzen.

Verfasst: 18.08.2008 18:39
von X0r
Vielleicht meint er ja, dass erst der Fokus auf das Stringgadget gesetzt werden soll.

Verfasst: 18.08.2008 18:48
von Kaeru Gaman
aber in dem moment, wo er auf den button klickt, ist der cursor vom stringgadget verschwunden,
also wenn man auf das button-event reagiert, ist der cursor nicht mehr irgendwo,
wo man gucken könnte wo er ist und ihn versetzen.

btw: wie war der Urlaub?

Verfasst: 18.08.2008 19:00
von marco2007
Naja, er könnte die Position in einer Variable speichern:
Soll ähnlich könnte es klappen (schnell hingeschrieben):

Code: Alles auswählen

If OpenWindow(0, 0, 0, 200, 60, "") 
  If CreateGadgetList(WindowID(0)) 
    StringGadget(0, 0, 0, 80, 20, "Zeile 1") 
    ButtonGadget(1, 10, 25, 40, 20, "+")
    SendMessage_(GadgetID(0), #EM_SETSEL, 0, 0) 
    SendMessage_(GadgetID(0), #EM_GETSEL, @b, @a)
    Debug a
    Debug b
    SetActiveGadget(0) 
  EndIf 
EndIf 

Repeat 
event= WaitWindowEvent()
  Select event: Case #PB_Event_Gadget: Select EventGadget()
    Case 1
      a+1
      SetActiveGadget(0)
      SendMessage_(GadgetID(0), #EM_SETSEL, a, 0)
      SendMessage_(GadgetID(0), #EM_GETSEL, @b, @a)
    Debug a
    Debug b
  EndSelect: EndSelect      
Until event = #PB_Event_CloseWindow
...mußt Dich ein bißchen spielen.

lg
Marco

Verfasst: 18.08.2008 19:03
von edel

Code: Alles auswählen

hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,260,50,"")

CreateGadgetList(hwnd)

StringGadget(0,10,10,150,23,"test")
ButtonGadget(1,165,10,28,23,"<")
ButtonGadget(2,190,10,28,23,">")

Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		
		If EventGadget() = 2
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#EM_GETSEL,@start,@ende)
			start + 1
			SendMessage_(GadgetID(0),#EM_SETSEL,start,start)			
		EndIf 
		
		If EventGadget() = 1
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#EM_GETSEL,@start,@ende)
			start - 1
			SendMessage_(GadgetID(0),#EM_SETSEL,start,start)			
		EndIf 
		
	EndIf
	
	
Until event = #PB_Event_CloseWindow

Verfasst: 18.08.2008 19:10
von marco2007
marco2006 hat geschrieben:...mußt Dich ein bißchen spielen.
...das Spielen ist natürlich nach Edel`s Code überflüssig geworden.

Verfasst: 18.08.2008 19:16
von ts-soft
Hier das ganze nochmal für EditorGadget:

Code: Alles auswählen

Procedure Editor_GetCursorX(Gadget)
  Protected Range.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_EXGETSEL, 0, Range)
  ProcedureReturn (Range\cpMax - (SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, SendMessage_(GadgetID(Gadget), #EM_EXLINEFROMCHAR, 0, Range\cpMin), 0)) + 1)
EndProcedure

Procedure Editor_GetCursorY(Gadget)
  Protected Range.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_EXGETSEL, 0, Range)
  ProcedureReturn SendMessage_(GadgetID(Gadget), #EM_EXLINEFROMCHAR, 0, Range\cpMin) + 1
EndProcedure

Procedure Editor_SetCursorPos(Gadget, x, y)
  Protected CharIdx
  Protected LLength
  Protected Range.CHARRANGE
  CharIdx = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, y-1, 0)
  LLength = SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, CharIdx, 0)
  If LLength >= x - 1
    CharIdx + x - 1
  EndIf
  Range\cpMin = CharIdx
  Range\cpMax = CharIdx
  ProcedureReturn SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, Range)
EndProcedure

If OpenWindow(0, 0, 0, 322, 180, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  EditorGadget(0, 8, 8, 306, 133) 
  ButtonGadget(1, 160, 150, 60, 25, "=>")
  ButtonGadget(2, 100, 150, 60, 25, "<=")
  Define I.l, X.l, Y.l, Text.s
  
  For I = 1 To 8
    Text + "Feel the ..Pure.. Power" + #CRLF$
  Next
  SetGadgetText(0, Text)
  Editor_SetCursorPos(0, 5, 5)
  SetActiveGadget(0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      
      Case #PB_Event_Gadget
        If EventGadget() > 0
          X = Editor_GetCursorX(0)
          Y = Editor_GetCursorY(0)
          If EventGadget() = 1
            Editor_SetCursorPos(0, X + 1, Y)
          Else
            Editor_SetCursorPos(0, X - 1, Y)
          EndIf
          SetActiveGadget(0)
        EndIf
    EndSelect
  ForEver 
EndIf 

und marco2006 baut jetzt noch rauf und runter rein :mrgreen:

Verfasst: 18.08.2008 19:44
von iostream
thx :mrgreen:

Verfasst: 18.08.2008 19:47
von edel

Code: Alles auswählen


hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,280,250,"")

CreateGadgetList(hwnd)

EditorGadget(0,10,10,150,100)
ButtonGadget(1,165,10,25,23,"<")
ButtonGadget(2,190,10,25,23,">")
ButtonGadget(3,215,10,25,23,"^")
ButtonGadget(4,240,10,25,23,"v")

SetGadgetText(0,"test" + #LF$  + "lala")


Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		
		If EventGadget() = 1
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_LEFT,0)			
		EndIf 
		
		If EventGadget() = 2
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_RIGHT,0)
		EndIf 
		
		If EventGadget() = 3
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_UP,0)
		EndIf 
						
		If EventGadget() = 4
			SetActiveGadget(0)
			SendMessage_(GadgetID(0),#WM_KEYDOWN,#VK_DOWN,0)
		EndIf 
		
		
	EndIf
	
	
Until event = #PB_Event_CloseWindow


:mrgreen: