Mit Return zum nächsten Textfeld??

Anfängerfragen zum Programmieren mit PureBasic.
Scream
Beiträge: 32
Registriert: 26.12.2005 15:10

Mit Return zum nächsten Textfeld??

Beitrag von Scream »

Hallo,
will jetzt endlich meine Progs zu ende proggen welche ich früher angefangen hab. Dabei bin ich wieder auf ein paar Probs gestoßen welche ich auch nicht durch die Suche beantwortet bekommen hab.
Und zwar wie lege ich den Focus automatisch auf ein Textfeld??
Wie kann ich es machen das wenn man die Eingabetaste drückt man zum nächsten Textfeld kommt bzw zu einem OK Button??

Vielen Dank schonmal

Gruß
Scream
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 »

Der Wechsel geschieht eigentlich per TAB und nicht mit Return, ist also absolut unüblich. Hier mal ein simples Beispiel, wie kompliziert das ist :mrgreen:

Code: Alles auswählen

EnableExplicit

Procedure SetCallbackEx(hWnd.l, Proc.l)
  Protected OldProc = SetWindowLong_(hWnd, #GWL_WNDPROC, Proc)
 
  If OldProc
    SetWindowLong_(hWnd, #GWL_USERDATA, OldProc)
  EndIf
 
  ProcedureReturn OldProc
EndProcedure

Procedure Callback(hWnd,Msg,wParam,lParam)
  Protected OldProc = GetWindowLong_(hWnd, #GWL_USERDATA)
 
  If #WM_KEYUP = Msg
    If wParam = #VK_RETURN
      SetActiveGadget(1)
    EndIf
  EndIf
 
  ProcedureReturn CallWindowProc_(OldPROC, hWnd, Msg, wParam, lParam)
EndProcedure

OpenWindow(0, #PB_Ignore,0, 200, 200, "")

If CreateGadgetList(WindowID(0))
  StringGadget(0,10,10,100,20,"")
  SetCallbackEx(GadgetID(0), @callback())
  ButtonGadget(1, 20, 80, 50, 25, "Okay")
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
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
Scream
Beiträge: 32
Registriert: 26.12.2005 15:10

Beitrag von Scream »

okay dankeschön....
und wenn ich das doch (unüblicherweise :wink: ) mit der eingabetaste machen möchte(wegen nem barcodeleser)??
und geht das vllt auch mit weniger code??
weil das scheint fast das komplizierteste in meinem ganzen prog zu sein :mrgreen:

Gruß Scream
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 »

Okay, dann eben so

Code: Alles auswählen

EnableExplicit

OpenWindow(0, #PB_Ignore,0, 200, 200, "")
AddKeyboardShortcut(0, #PB_Shortcut_Return, 0)
If CreateGadgetList(WindowID(0))
  StringGadget(0,10,10,100,20,"")
  ButtonGadget(1, 20, 80, 50, 25, "Okay")
EndIf
SetActiveGadget(0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Menu
      If EventMenu() = 0
        SetActiveGadget(GetActiveGadget()!1)
      EndIf
  EndSelect
ForEver
:mrgreen:
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
Scream
Beiträge: 32
Registriert: 26.12.2005 15:10

Beitrag von Scream »

vielen Dank :mrgreen:
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Beitrag von H.Brill »

Hallo,
Sowas hat mich auch interessiert. Da es mit dem XOR - Operator (!)
für den einen oder anderen Neuen etwas verwirrend ist, habe ich
obiges Beispiel etwas modifiziert. So sieht man denn auch, wie man
es mit mehreren StringGadgets macht.

Code: Alles auswählen

EnableExplicit 

OpenWindow(0, #PB_Ignore,0, 200, 220, "") 
AddKeyboardShortcut(0, #PB_Shortcut_Return, 0) 
If CreateGadgetList(WindowID(0)) 
  StringGadget(0,10,10, 100,20,"") 
  StringGadget(1,10,40, 100,20,"")
  StringGadget(2,10,70, 100,20,"")
  StringGadget(3,10,100,100,20,"")
  StringGadget(4,10,130,100,20,"")
  ButtonGadget(5, 20, 180, 50, 25, "Okay") 
EndIf 
SetActiveGadget(0) 
Repeat 
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
          Break
    Case #PB_Event_Menu
          If EventMenu() = 0
             Select GetActiveGadget()
               Case 0 To 3
                  ; StringGadget 1 bis 3 : eins weiter schalten 
                  SetActiveGadget(GetActiveGadget() +1)
               Case 4
                  ; bei StringGadget 4 (das letzte) --> wieder zum Ersten
                  SetActiveGadget(0)
             EndSelect         
          EndIf
    Case #PB_Event_Gadget
        If EventGadget() = 5
           ; Button Okay --> Ende
           Break
        EndIf     
  EndSelect
ForEver
End
PS : In meiner Firma arbeite ich auch mit einer Eingabemaske, die
mit Return die Eingabefelder verläßt. Die anderen Funktionen sind
über die Funktionstasten erreichbar (CSB Warenwirtschaftssystem).
Ich habs selber nicht geglaubt, wie schnell man mittags seine Bestellungen
eingetippt hat. Das geht (brauch ja nur Kundenr. , Datum und Artikelnr. einzugeben) über den Nummernblock und ganz rechts mit der Returntaste ganz fix. Die Maus brauch ich da in den seltensten Fällen.
Benutzeravatar
mk-soft
Beiträge: 3846
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hab da was im englischen Forum gefunden.

Code: Alles auswählen

Procedure SendKey(Option.l)
  ; Author : Oliv
  keybd_event_(Option,0,0,0) ; Simulate Keypress
  keybd_event_(Option,0,#KEYEVENTF_KEYUP,0) ; Simulate release key
  Delay(60)
EndProcedure


; Delay(5000)
; SendKey(#VK_F5)     ; Simulate F5 Keystroke
; SendKey(#VK_RETURN) ; Simulate Enter Keystroke

open_window_0()

  AddKeyboardShortcut(0, #PB_Shortcut_Return, 1)
  exit = 0
  
  Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 0,1,2,3: 
           
         EndSelect
       
       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : SendKey(#VK_TAB)
         EndSelect

       Case #PB_Event_CloseWindow
          exit = 1
     EndSelect
  Until exit

End
Common.pb

Code: Alles auswählen

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #String_1
  #String_2
  #String_3
  #Button
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 229, 111, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 10, 10, 110, 30, "")
      StringGadget(#String_1, 140, 10, 110, 30, "")
      StringGadget(#String_2, 270, 10, 110, 30, "")
      StringGadget(#String_3, 400, 10, 100, 30, "")
      ButtonGadget(#Button, 10, 60, 110, 40, "Ok")
      
    EndIf
  EndIf
EndProcedure

Über Menu SendKey auslösen.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag von Karl »

Was ne sinnvolle Ergänzung wäre:

Bei einem gefüllten Stringgadget automatisch ins nächste zu springen. Dazu muss die Anzahl der Zeichen natürlich begrenzt sein. Dann ist das mit der Return-Taste entbehrlich und so eigentlich am schnellsten.

Kenn ich auch so von meinem ERP-System.

Gruß Karl
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Scream
Beiträge: 32
Registriert: 26.12.2005 15:10

Beitrag von Scream »

H.Brill hat geschrieben:

Code: Alles auswählen

EnableExplicit 

OpenWindow(0, #PB_Ignore,0, 200, 220, "") 
AddKeyboardShortcut(0, #PB_Shortcut_Return, 0) 
If CreateGadgetList(WindowID(0)) 
  StringGadget(0,10,10, 100,20,"") 
  StringGadget(1,10,40, 100,20,"")
  StringGadget(2,10,70, 100,20,"")
  StringGadget(3,10,100,100,20,"")
  StringGadget(4,10,130,100,20,"")
  ButtonGadget(5, 20, 180, 50, 25, "Okay") 
EndIf 
SetActiveGadget(0) 
Repeat 
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
          Break
    Case #PB_Event_Menu
          If EventMenu() = 0
             Select GetActiveGadget()
               Case 0 To 3
                  ; StringGadget 1 bis 3 : eins weiter schalten 
                  SetActiveGadget(GetActiveGadget() +1)
               Case 4
                  ; bei StringGadget 4 (das letzte) --> wieder zum Ersten
                  SetActiveGadget(0)
             EndSelect         
          EndIf
    Case #PB_Event_Gadget
        If EventGadget() = 5
           ; Button Okay --> Ende
           Break
        EndIf     
  EndSelect
ForEver
End
Danke nochmal für die überarbeitung, habe das system auch mehr oder weniger verstanden....doch ist das eigentlich quelltext für pb4.0 ???
Weil das mit EventMenu() = 0 kommt mir grad spanisch vor.......

Gruß Scream
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag von Karl »

Nö, ist doch alles bestens und funkt auch unter 3.94.

Die EventMenuID ist gerade die 0 aus dem AddKeyboardShortcut (letztere!).

Siehe Hilfe.

Gruß Karl
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Antworten