Seite 1 von 2

[erledigt] Mit RETURN von gadget zu Gadget springen...

Verfasst: 29.01.2006 17:03
von scholly
moin, moin...

Mit unten angefügtem Datensatz-Requester will ich manuell neue Datensätze in meine Video-Verwaltung eingeben.
Dabei möchte ich noch folgende Funktionalität einbauen:
- RETURN in einem String-/Combo-Gadget aktiviert ein anderes Gadget
- RETURN auf einen Butten aktiviert dasselbe Unterprogramm wie Draufklicken
Wie mach ich das ?

Es gab mal einen Thread, in dem Danilo auf das Archiv verwies, aber da komm ich nicht dran :(

tia...
scholly

Code: Alles auswählen

;#########################################################################################
create_input_window:
;{
If  OpenWindow(4,10,10,545,210, #PB_Window_ScreenCentered,"egal")
    If CreateGadgetList(WindowID(4))
      Gosub create_iw_gadgets
;      Gosub fill_combos
      If editentry
;        Gosub getentry
      EndIf
      ActivateGadget(402)
    Else
      MessageRequester("Bad news:","Gadgetlist 4 tut nich",#PB_MessageRequester_Ok)    
    EndIf
    satzfertig = 0
    Repeat
      EventID = WaitWindowEvent()
      If EventID = #PB_Event_Gadget
        If      EventGadgetID() = 403 ;Titel        --> über OpenFile und Filename
;                Gosub getfilename
                filename$ = GetFilePart(filename$)
                extension$= "." + GetExtensionPart(filename$)
                ext_offset= FindString(filename$,extension$,1)
                filename$ = Left(filename$,ext_offset - 1)
                SetGadgetText(402, filename$)
        ElseIf  EventGadgetID() = 412 ;genre        --> eigenes Fenster (5) mit 3-Fach-Auswahl
;                Gosub getgenre
        ElseIf  EventGadgetID() = 417 ;Medium-Name  --> über path-requester
;                Gosub get_med_name
        ElseIf  EventGadgetID() = 422 ;playlist     --> über OpenFile
;                Gosub getfilename
                SetGadgetText(421, filename$)    
        ElseIf EventGadgetID() = 430  ;übernehmen
;                Gosub input_2_lv
                satzfertig = 1
                ActivateGadget(101)
                CloseWindow(4)              
        ElseIf EventGadgetID() = 431  ;abbrechen
                satzfertig = 1
;                ActivateGadget(101)
                CloseWindow(4)
        EndIf;EventGadgetID    
      EndIf; EventID
      
    Until satzfertig = 1
Else
  MessageRequester("Bad news:","Datensatzfenster geht nich auf",#PB_MessageRequester_Ok)
  End    
EndIf
End
;}
;#########################################################################################
create_iw_gadgets: 
;{
g_t_titel$    = "Titel:"
g_t_genre$    = "Genre:"
g_t_mname$    = "Medium-Name:"
g_t_jahr$     = "Jahr:"
g_t_lager$    = "Lager:"
g_t_mtyp$     = "Medium-Typ:"
g_t_otitel$   = "O-Titel:"
g_t_plist$    = "Playlist:"
g_t_status$   = "Status:"
g_t_quelle$   = "Quelle:"
g_t_position$ = "Position:"
g_t_dauer$    = "Dauer:"

TextGadget      (401,  5,006, 50, 20, g_t_titel$)          
  StringGadget  (402, 55,003,330, 24, "")                 
  ButtonGadget  (403,386,003, 24, 26, "?")                
TextGadget      (404,415,006, 60, 20, g_t_quelle$)        
  ComboBoxGadget(405,480,003, 60,100)                     
 
TextGadget      (406,  5,036, 70, 20, g_t_otitel$)        
  StringGadget  (407, 75,033,335, 24, "")           
TextGadget      (408,415,036, 45, 20, g_t_jahr$)    
  StringGadget  (409,480,033, 40, 24, "", #PB_String_Numeric)
                                                       
TextGadget      (410,  5,066, 50, 20, g_t_genre$)         
  StringGadget  (411, 65,063,320, 24, "")                 
  ButtonGadget  (412,386,063, 24, 26, "?")                
TextGadget      (413,415,066, 50, 20, g_t_lager$)         
  ComboBoxGadget(414,480,063, 60,100)

TextGadget      (415,  5,096,100, 20, g_t_mname$)         
  StringGadget  (416,105,093,230, 24, "")                 
  ButtonGadget  (417,336,093, 24, 26, "?")                
TextGadget      (418,365,096, 90, 20, g_t_mtyp$)          
  ComboBoxGadget(419,460,093, 80,116)                     

TextGadget      (420,  5,126, 75, 20, g_t_plist$)      
  StringGadget  (421, 85,123,300, 24, "")               
  ButtonGadget  (422,386,123, 24, 26, "?")             
TextGadget      (423,415,126, 70, 20, g_t_position$)   
  StringGadget  (424,490,123, 20, 24, "", #PB_String_Numeric)

TextGadget      (425,  5,156, 45, 20, g_t_dauer$)         
  StringGadget  (426, 55,153, 35, 24, "", #PB_String_Numeric)                                                      
TextGadget      (427,415,156, 60, 20, g_t_status$)      
  ComboBoxGadget(428,480,153, 60,100)               
 
Frame3DGadget   (429,  1,180,543,  2,"",#PB_Frame3D_Flat) 

ButtonGadget    (430,  5,185,200,20,"Daten übernehmen")
ButtonGadget    (431,440,185,100,20,"abbrechen")
;}
  Return; create_iw_gadgets
;#########################################################################################

Verfasst: 29.01.2006 17:36
von NicTheQuick
Hi, hab mal schnell einen Kleinigkeit gebastelt:

Code: Alles auswählen

Structure SetFocusOnReturn_Struc
  OldCB.l
  NewGadgetID.l
EndStructure

Procedure CB_SetFocusOnReturn(hWnd, Msg.l, wParam.l, lParam.l)
  Protected Result.l, *p.SetFocusOnReturn_Struc
  
  *p = GetWindowLong_(hWnd, #GWL_USERDATA)
  
  If Msg = #WM_DESTROY
    FreeMemory(*p)
  EndIf
  
  Select Msg
    Case #WM_KeyDown
      If wParam = #VK_Return
        SetFocus_(GadgetID(*p\NewGadgetID))
        Result = #PB_ProcessPureBasicEvents
      EndIf
    
    Default
      Result = CallWindowProc_(*p\OldCB, hWnd, Msg, wParam, lParam)
  EndSelect
  
  ProcedureReturn Result
EndProcedure

Procedure SetFocusOnReturn(GadgetID.l, NewGadgetID.l)
  Protected *p.SetFocusOnReturn_Struc
  *p = AllocateMemory(SizeOf(SetFocusOnReturn_Struc))
  If *p
    *p\OldCB = SetWindowLong_(GadgetID(GadgetID), #GWL_WNDPROC, @CB_SetFocusOnReturn())
    *p\NewGadgetID = NewGadgetID
    SetWindowLong_(GadgetID(GadgetID), #GWL_USERDATA, *p)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure
Syntax ist ganz einfach: [c]SetFocusOnReturn(GadgetID, NewGadgetID)[/c]
GadgetID ist die ID des Gadgets, bei dem du Return drücken kannst.
NewGadgetID ist die ID des Gadgets, das dann den Focus bekommen soll.

Ich habs schon ausprobiert und es funktioniert.

Verfasst: 29.01.2006 21:12
von scholly
Hi Nic...
Ersma danke für die schnelle "Kleinigkeit", aber leider versteh ich das nicht so ganz und es tuts wohl auch nur unter Windows (siehe Sig).
Vielleicht sollte ich meinen Gedanke mal darlegen, wie ich mir das vorstelle:

In der GUI werden 3 GadgetTypen benutzt:

- StringGadgets zur direkten Eingabe von Text/Zahlen
- Comboboxen zur Auswahl
- Buttons (mit "?" als Text) zum Aufruf zusätzlicher Requester

Beim Start der GUI liegt der Focus im ersten Stringgadget ("Titel").
Wenn man will, kann man hier von Hand den Titel eingeben. Wenn man das macht und die Eingabe mit RETURN beendet, soll das Combo für "Quelle" aktiviert werden. Das ginge AFAIK mit ActivateGadget().
Wenn man aber den Titel aus dem Filenamen holen will (um z.B. FipTehler zu vermeiden), setzt man mit TAB den Focus dahinter auf den Button mit dem "?". Ich hatte gehofft, daß ich hier mit dem AdvancedGadgetEvent "#PB_EventType_Focus" arbeiten könnte, aber der tritt ja auch ein, wenn ich per TAB drüber hinwegwandern will. Nun soll RETURN bei fokussiertem Button dasselbe bewirken, als wenn ich die Hände von der Tastatur nehme und mit der Maus auf den Button klicke. Das Ergebnis des nun auftauchenden Requesters schreibe ich in das davorliegende StringGadget und aktiviere nun das Combo "Quelle".
Hier kann ich mit Cursor-up/down auswählen, auch wenn es nicht aufklappt, was mir lieber wäre. Habe ich nun den mir genehmen Eintrag gefunden, soll wieder ein RETURN dazu führen, daß das nächste Gadget (in diesem Fall "Original-Titel") zur Eingabe genutzt werden kann.

Mir ist schon klar, daß ich mit TAB statt RETURN selbiges Verhalten erreichen könnte, aber RETURN ist mir irgendwie "gewohnter" und es bliebe ja noch das vorgenannte Button-Problem.

Verfasst: 29.01.2006 21:17
von ts-soft
scholly hat geschrieben:aber RETURN ist mir irgendwie "gewohnter"
Mit Return wird sowas aber eigentlich nur in Modalen Dialogen gelöst, die sind aber Windows-Typisch und entsprechen nicht Deiner OS-Unabhängig vorgabe :wink:

Verfasst: 29.01.2006 21:24
von NicTheQuick
Ok, das macht das Problem dann etwas komplizierter.

Tja, da muss ich mal schauen, ob es da was einfaches gibt. :wink:

PS.: Das Archiv findest du auch hier.

Verfasst: 29.01.2006 21:50
von armada
hab mal kurz die hilfe durchwühlt und AddKeyboardShortcut gefunden.

das dürfte genau das sein was du gesucht hast

mfg
armada

Verfasst: 29.01.2006 21:59
von Tafkadasom2k5
armada hat geschrieben:hab mal kurz die hilfe durchwühlt und AddKeyboardShortcut gefunden.

das dürfte genau das sein was du gesucht hast

mfg
armada
Halte ich für ne Gute Idee.
Wenn Menu-Id-Return eintritt, dann testet er, welches Gadget momentan den Fokus hat und setzt es dann auf das nächste String-Gadget.
Das isn bissl Schreibarbeit, aber es geht-und uU kann man damit noch zB die F1 taste abfangen und dann ne Hilfe zu dem Gadget wiedergeben, auf dem der Fokus gerade ist.
Das is doch mal ne Idee :)

Gr33tz
Tafkadasom2k5

Verfasst: 29.01.2006 22:13
von armada
hmm ja

Code: Alles auswählen

NewList GadgetIDs()
AddElement(GadgetIDs())
GadgetIDs() = #Gadget1
AddElement(GadgetIDs())
GadgetIDs() = #Gadget2
...
FirstElement(GadgetIDs())
einfahc ne liste erstellt mit den gadgets

Code: Alles auswählen

#Shortcut_Return = 10000

AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #Shortcut_Return)

Repeat
  EventID = WaitWindowEvent()
  If EventID = #PB_Event_Menu
    EventMenuID = EventMenuID()
    If EventMenuID = #Shortcut_Return
      If ListIndex(GadgetIDs()) = (CountList(GadgetIDs()) - 1)
        FirstElement(GadgetIDs())
        ActivateGadget(GadgetIDs())
      Else
        NextElement(GadgetIDs())
        ActivateGadget(GadgetIDs())
      EndIf
    EndIf
  EndIf
Until EventID = #PB_Event_CloseWindow
und dann sowas in die richtung[/code]

Verfasst: 29.01.2006 22:56
von scholly
Hey, hey, hey....
so schnell kann ich ja garnicht lesen, wie's hier abgeht, besonders, wenn die Pizza nich kalt werden soll...

@Nic
Danke für die URL, ich hab den Alten thread gefunden und kuck mir mal an, was Danilo da von sich gegeben hat. Er hat da schon das Fehlen von einem GetFocus_()-Ersatz beklagt:
Wenn es statt GetFocus_() einen internen Befehl geben würde,
z.B. GetActiveGadget() (im Gegensatz zu ActivateGadget()),
dann könnte man das auch platformunabhängig machen.
@Thomas
Mit Return wird sowas aber eigentlich nur in Modalen Dialogen gelöst, die sind aber Windows-Typisch und entsprechen nicht Deiner OS-Unabhängig vorgabe
Ne,ne,ne,ne,ne, so nich, Alter :)
Das hab ich so schon in der Vorgänger-Verwaltung auf meinem Miggy so realisiert. Und in dem BeOS-Ansatz auch, aber da warte ich auf ein neues Basic....

@armada
Danke, kuck ich mir gleich auch genauer an...

@Tafkadasom2k5
Wenn Menu-Id-Return eintritt,
Menu-ID ? Das versteh ich (noch) nich :o

Und Schreibarbeit stört mich nicht :) Aufm Miggy gibts extra 'ne HELP-Taste, hat M$ in irgendeinem Style-Guide oder so F1 für Help vorgesehen ? Oder Linus ? Oder die Apfelmännchen ?

Ansonsten schonmal danke, ich zieh mich kurzfristig zum Studium zurück;)
scholly

Verfasst: 29.01.2006 23:32
von NicTheQuick
@scholly:
Ja, stimmt, schau dir mal die Hilfe von [c]AddKeyboardShortcut()[/c] an.
Dann fehlt wirklich nur noch der [c]GetFocus_()[/c]-Befehle für Linux, usw.