Seite 1 von 1

Return in Editorgadget mit AddKeyboardShortcut abfangen

Verfasst: 24.11.2004 19:31
von rafka
Liebe Leute,
ich will in einem EditorGadget das return abfangen, um die Zeile auszuwerten, aber irritierenderweise klappt es nur manchmal, also nicht nie oder immer, sondern mal reagiert der Shortcut und mal nicht. Ich zeig mal den Code:

Code: Alles auswählen

Procedure Open_editor()
  If OpenWindow(0, 0, 0, 600, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_BorderLess, "Editor")
    If CreateGadgetList(WindowID())
      EditorGadget(0, 0, 0, 600, 300)
           
    EndIf
  EndIf
EndProcedure


Open_editor()
AddKeyboardShortcut(0, #PB_Shortcut_Return, 101) 


Repeat 
ActivateGadget(0)
Select WaitWindowEvent() 
   Case #PB_Event_menu
      If EventMenuID() = 101   
       MessageRequester("MENU","Enter gedrückt" ,0) 
        
      EndIf
       
   EndSelect

Until WaitWindowEvent() = #PB_Event_CloseWindow 
Irgendwas ist da ganz komisch und deswegen bitte ich um Hilfe. Danke!

Verfasst: 24.11.2004 20:22
von bobobo
Addkeyboardshortcut() ist zum Hinzufügen eines KeyboardEvents zu einem MENÜ !!
und ein EditorGadget ist nunmal kein Menü ..

und folgendes hilft wohl auch nur bedingt weiter..

Code: Alles auswählen

; DEBUGGER ANMACHEN!!

; PureBasic Visual Designer v3.90 build 1360
;- Window Constants
;
Enumeration
#Window_0
#Editor_0
EndEnumeration
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 300,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
    If CreateGadgetList(WindowID())
      EditorGadget(#Editor_0, 80, 50, 350, 190)
      
    EndIf
  EndIf
EndProcedure
Open_Window_0()
Repeat
  Event = WaitWindowEvent()
  If Event = #PB_EventGadget
    ;Debug "WindowID: " + Str(EventWindowID())
    GadgetID = EventGadgetID()
    If GadgetID = #Editor_0
      If Right(GetGadgetText(#Editor_0),2)=Chr(13)+Chr(10)
        Debug "Enter gedrückt"
      EndIf
    EndIf
  EndIf
  
Until Event = #PB_EventCloseWindow
End
vermutlich wird es für Deine Anwendung eh besser sein wenn du ein ListViewGadGet statt des EditorGadget benutzt weil du dort besser an die einzelnen Zeilen zur weiteren auswertung herankommst ..

Verfasst: 24.11.2004 21:16
von ts-soft
@bobobo

hast'n "EndIf" vergessen

Verfasst: 25.11.2004 12:06
von bobobo
ts-soft hat geschrieben:@bobobo

hast'n "EndIf" vergessen
aha

Verfasst: 25.11.2004 13:28
von rafka
Danke für den Lösungsvorschlag, tatsächlich hilft es nur bedingt weiter, denn auch bei einem zurückgehen mit DEL innerhalb einer Zeile wird das "Enter"-Ereignis ausgelöst. Außerdem dürfte die Variante dazu führen, dass ich mich nicht innerhalb meines Editorfensters bewegen kann und da irgendwo enter drücken kann.

Wo fehlt denn das EndIf?

So ein ListviewGadget ermöglich mir aber nicht gerade das freie Eingeben, das ich mir wünsche, oder?

Gruß

Re: Return in Editorgadget mit AddKeyboardShortcut abfangen

Verfasst: 25.11.2004 15:09
von Danilo
rafka hat geschrieben:Irgendwas ist da ganz komisch und deswegen bitte ich um Hilfe. Danke!
Das komische kommt dadurch, das Du 2 mal WaitWindowEvent()
aufrufst, und somit Nachrichten verloren gehen.

Mit 1 x WaitWindowEvent() funktioniert es:

Code: Alles auswählen

Procedure Open_editor()
  If OpenWindow(0,0,0,600,300,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_Borderless,"Editor")
    CreateGadgetList(WindowID())
    EditorGadget(0,0,0,600,300)
  EndIf
EndProcedure

Open_editor()

AddKeyboardShortcut(0,#PB_Shortcut_Return, 101)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Menu
      MessageRequester("MENU","Enter gedrueckt",0)
      ActivateGadget(0)
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
AddKeyboardShortcut() setzt allerdings Tasten für das ganze
Fenster, so daß hier Return abgefangen wird und nicht mehr
im Editor funktioniert.

Ist sicherlich nicht das was Du willst, deshalb hier der RichEdit-Weg,
da das EditorGadget auf Windows ein RichEdit-Control ist:

Code: Alles auswählen

Procedure WndProc(hWnd,Msg,wParam,lParam)
  Select Msg
    Case #WM_SIZE                                  ; Window Resize
      ResizeGadget(0,0,0,lParam&$FFFF,(lParam>>16)&$FFFF)
    Case #WM_NOTIFY
      If lParam
        *msgfilter.MSGFILTER = lParam
        If *msgfilter\nmhdr\hwndFrom = GadgetID(0) ; Message vom EditorGadget?
          If *msgfilter\msg = #WM_KEYDOWN          ; Taste gedrueckt?
            If *msgfilter\wParam = #VK_RETURN      ; Return-Taste?
              Beep_(800,50)
              ;MessageRequester("Info","Enter gedrueckt",0)
              ;ActivateGadget(0)
            EndIf
          EndIf
        EndIf
      EndIf
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


Procedure Open_editor()
  If OpenWindow(0,0,0,600,300,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_Borderless,"Editor")
    CreateGadgetList(WindowID())
    EditorGadget(0,0,0,600,300)
      ; Tasten- und Maus-Events fuer EditorGadget/RichEdit freischalten
      SendMessage_(GadgetID(0),#EM_SETEVENTMASK,0,#ENM_KEYEVENTS)

  EndIf
EndProcedure

Open_editor()

SetWindowCallback(@WndProc())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver

Verfasst: 25.11.2004 15:58
von rafka
Ganz toll! Danke für Analyse, Lösung und Alternative! Mir ist geholfen :wink: