Seite 1 von 2

Mit Return zum nächsten Textfeld??

Verfasst: 14.05.2006 14:38
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

Verfasst: 14.05.2006 15:03
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

Verfasst: 14.05.2006 15:12
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

Verfasst: 14.05.2006 15:25
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:

Verfasst: 14.05.2006 15:36
von Scream
vielen Dank :mrgreen:

Verfasst: 14.05.2006 18:14
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.

Verfasst: 14.05.2006 20:20
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:

Verfasst: 15.05.2006 10:32
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

Verfasst: 15.05.2006 15:48
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

Verfasst: 15.05.2006 15:57
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