Return in Editorgadget mit AddKeyboardShortcut abfangen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
rafka
Beiträge: 7
Registriert: 15.11.2004 18:08

Return in Editorgadget mit AddKeyboardShortcut abfangen

Beitrag 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!
Rafka RS Sunday
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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 ..
Zuletzt geändert von bobobo am 25.11.2004 12:05, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@bobobo

hast'n "EndIf" vergessen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

ts-soft hat geschrieben:@bobobo

hast'n "EndIf" vergessen
aha
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
rafka
Beiträge: 7
Registriert: 15.11.2004 18:08

Beitrag 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ß
Rafka RS Sunday
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Return in Editorgadget mit AddKeyboardShortcut abfangen

Beitrag 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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
rafka
Beiträge: 7
Registriert: 15.11.2004 18:08

Beitrag von rafka »

Ganz toll! Danke für Analyse, Lösung und Alternative! Mir ist geholfen :wink:
Rafka RS Sunday
Antworten