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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

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

Beitrag 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
;#########################################################################################
Zuletzt geändert von scholly am 21.04.2008 23:45, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
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 »

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:
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
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
armada
Beiträge: 100
Registriert: 10.10.2005 18:00
Kontaktdaten:

Beitrag von armada »

hab mal kurz die hilfe durchwühlt und AddKeyboardShortcut gefunden.

das dürfte genau das sein was du gesucht hast

mfg
armada
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
armada
Beiträge: 100
Registriert: 10.10.2005 18:00
Kontaktdaten:

Beitrag 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]
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Antworten