Problem mit der Ereignisbehandlung von shortCuts

Für allgemeine Fragen zur Programmierung mit PureBasic.
Forsti
Beiträge: 23
Registriert: 21.01.2011 12:46

Problem mit der Ereignisbehandlung von shortCuts

Beitrag von Forsti »

Hallo liebe Forumer!
Trotz jahrelanger Arbeit mit PureBasic (z.Zt. verwendete Version 5.30) habe ich immer noch Probleme mit der Ereignisbehandlung. Ich will mit Ctrl + K den Inhalt eines Stringfeldes in ein weiteres Stringfeld kopieren oder mit Ctrl + L
letzters wieder löschen. Die Codierung lautet

Code: Alles auswählen

  #Window01 = 1
  #Menue_0 = 2   
  #Feld01 = 11
  #Feld02 = 12
  #PB_SCut_1 = 21
  #PB_SCut_2 = 22
  #PB_SCut_3 = 23

If OpenWindow(#Window01, 100, 200, 500, 400, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
   SetWindowColor(#Window01, $98FB98)

  CreateStatusBar(#Window01, WindowID(#Window01))

  AddStatusBarField(100)
  AddStatusBarField(100)
  StringGadget(#Feld01, 250, 100, 100, 20, "")
  StringGadget(#Feld02, 250, 150, 100, 20, "")
  
  AddKeyboardShortcut(#Window01, #PB_Shortcut_Control | #PB_Shortcut_K, #PB_SCut_1) ;Kopieren
  AddKeyboardShortcut(#Window01, #PB_Shortcut_Control | #PB_Shortcut_L, #PB_SCut_2) ;Löschen
  AddKeyboardShortcut(#Window01, #PB_Shortcut_Control | #PB_Shortcut_F3, #PB_Shortcut_F3)

  Repeat
    Event0 = WaitWindowEvent()
    EventT = EventType()
    EventG = EventGadget()
    WindowID_LL = EventWindow()
    EventMen_IL = EventMenu()
    Flg_SL$ = "A"
    
    If Event0 = 0
      Txt_SL$ ="Nix los"
    Else      
      If EventG < 1
        Txt_SL$ ="Nix los"
      Else  
        If EventG = #PB_SCut_1 Or EventG = #PB_SCut_2 Or EventG = #PB_SCut_3
          Txt_SL$ ="Prufen"  
        EndIf
        If EventT < 0 And EventG <> #PB_SCut_1 And EventG <> #PB_SCut_2 And EventG <> #PB_SCut_3
          Txt_SL$ ="Nix los"
        Else  
          Select EventG
            Case #Feld01
                Txt_SL$ = "Feld 1"
                StatusBarText(#Window01, 0, Txt_SL$)
                Flg_SL$ = "K"
            Case #Feld02
                Txt_SL$ = "Feld 2"
                StatusBarText(#Window01, 0, Txt_SL$)
                Flg_SL$ = "K"
            Case #PB_SCut_1
                Txt_SL$ = "Kopiert"
                SetGadgetText(#Feld02, GetGadgetText(#Feld01))
                StatusBarText(#Window01, 0, Txt_SL$)
                Flg_SL$ = "J"
              Case #PB_SCut_2 
                Txt_SL$ = "Gelöscht"
                SetGadgetText(#Feld02, "")
                StatusBarText(#Window01, 0, Txt_SL$)
                Flg_SL$ = "J"
                
            Case #PB_SCut_3
                Txt_SL$ = "Kopiert"
                SetGadgetText(#Feld02, "")
                StatusBarText(#Window01, 0, Txt_SL$)
                Flg_SL$ = "J"

            Default
                Txt_SL$ = "außerhalb"
                Flg_SL$ = "O"
          EndSelect    
        EndIf  
      EndIf    
    EndIf
     If Flg_SL$ = "J" Or Flg_SL$ = "K"
       Debug Flg_SL$ + ": " + "EventG " + Str(EventG) + "  EventMen_IL " + Str(EventMen_IL) + "  " + Txt_SL$
       Flg_SL$ = "E"
     EndIf
    If Event0 = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
 
   Until Quit = 1  
EndIf
Die Codeausführung klappt zwar, allerdings wird das Ereignis EventMenu statt abgebaut sondern endlos wiederholt, wie auch das debug-Fenster zeigt. Erst wenn ein anderes Ereignis gegeben wird ( z.B. Focus neu setzen ) hört letztere Zyklus auf.
Meine Fragen: Muß der Eventtyp hier Focus mit abgefragt werden, was bedeuten Event = 0 oder Event = -1 dies ist nirgens beschrieben.
Auf eine Antwort von euch bin ich schon gespannt.

Gruß forsti

Edit by NicTheQuick: Code-Tags gesetzt
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Problem mit der Ereignisbehandlung von shortCuts

Beitrag von Kiffi »

beim ersten Überfliegen: Keyboard-Shortcuts erzeugen Menu-Events.

Du testest in Deinem Code allerdings Deine Shortcuts auf Gadget-Events ( ... EventG <> #PB_SCut_1 ... ).

Vielleicht bringt das ja was als erste Groschen-Fall-Hilfe ;-)

Grüße ... Peter
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3056
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Problem mit der Ereignisbehandlung von shortCuts

Beitrag von HeX0R »

Die Event-Schleife ist doch völlig falsch!
Du musst doch erst untersuchen welcher Event überhaupt aufgetreten ist, bevor Du EventGaget() und co. auswerten darfst.
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Problem mit der Ereignisbehandlung von shortCuts

Beitrag von mk-soft »

Ungefähr so.

Code: Alles auswählen

;-TOP

; Basis

; Konstanten

Enumeration ;Window
  #Main
EndEnumeration

Enumeration ; Menu
  #Menu
EndEnumeration

Enumeration ; MenuItems
  #MenuExit
EndEnumeration
  
Enumeration ; Gadgets
  #Splitter
  #List
  #Edit
EndEnumeration

Enumeration ; Statusbar
  #Status
EndEnumeration

; Global Variable
Global exit

; Functions
Procedure UpdateWindow()
  
  Protected x, y, dx, dy, menu, status
  
  menu = MenuHeight()
  If IsStatusBar(#Status)
    status = StatusBarHeight(#Status)
  Else
    status = 0
  EndIf
  x = 0
  y = 0
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - menu - status
  ResizeGadget(#Splitter, x, y, dx, dy)
  
EndProcedure

; Main
Procedure Main()
  
  Protected event, style, dx, dy
  
  style = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
  dx = 800
  dy = 600
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, dx, dy, "Main", style)
    
    ; Menu
    ; CreateMenu(#Menu, WindowID(#Main))
    ; MenuItem(#MenuExit, "Be&enden")
    
    ; Gadgets
    ListViewGadget(#List, 0, 0, 0, 0)
    EditorGadget(#Edit, 0, 0, 0, 0)
    SplitterGadget(#Splitter, 0, 0, dx ,dy, #List, #Edit)
    SetGadgetState(#Splitter, dy * 2 / 3)
    
    ; Statusbar
    CreateStatusBar(#Status, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; For Mac
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      ; Enable Fullscreen
      Protected NewCollectionBehaviour
      NewCollectionBehaviour = CocoaMessage(0, WindowID(#Main), "collectionBehavior") | $80
      CocoaMessage(0, WindowID(#Main), "setCollectionBehavior:", NewCollectionBehaviour)
      ; Mac default menu´s
      If Not IsMenu(#Menu)
        CreateMenu(#Menu, WindowID(#Main))
      EndIf
      MenuItem(#PB_Menu_About, "")
      MenuItem(#PB_Menu_Preferences, "")
    CompilerEndIf
    
    UpdateWindow()
    
    ; Main Loop
    Repeat
      event = WaitWindowEvent()
      Select event
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                MessageRequester("Info", "Basis v1.0")
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                exit = #True
                
            CompilerEndIf
              
            Case #MenuExit
              exit = #True
              
          EndSelect
          
              
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #List
              
            Case #Edit
              
          EndSelect
          
        Case #PB_Event_SizeWindow
          Select EventWindow()
            Case #Main
              UpdateWindow()
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              exit = #True
              
          EndSelect
          
      EndSelect
      
    Until exit
    
  EndIf
  
EndProcedure : Main()

End
Verwende ich als Basis zum testen
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten