PureBasic
https://www.purebasic.fr/french/

[RESOLU] ComboBoxGadget() éditable.
https://www.purebasic.fr/french/viewtopic.php?f=1&t=17291
Page 2 sur 2

Auteur:  falsam [ Sam 26/Mai/2018 18:56 ]
Sujet du message:  Re: ComboBoxGadget() éditable.

Fig a écrit:
Je souhaite que ça ne donne pas lieu à un conflit.
Je n'ai pas vu de conflit. Un chahut peut être ? ^-^
Quand à être raisonnable je déteste.

Auteur:  Ollivier [ Sam 26/Mai/2018 22:39 ]
Sujet du message:  Re: ComboBoxGadget() éditable.

Fig a écrit:
Merci à toutes les personnes qui ont répondu, y compris en messages privés.
Merci aussi à toi d'avoir partagé l'idée : c'est très astucieux. Après un léger correctif, ça méritera même d'être en feature request par exemple avec une option #PB_ComboBox_ItemEditable.

Auteur:  Ollivier [ Mar 29/Mai/2018 13:19 ]
Sujet du message:  Re: [RESOLU] ComboBoxGadget() éditable.

Version corrigée.
Code:
;********************************************************************************************************************************************************************************************
#ComboKeyEnter = 'GK13' ; Valeur pseudo-aléatoire

Structure COMBO
        Window.I
        Gadget.I
        Item.I
        kMenu.I
        kMenuItem.I
        ReturnKey.I
EndStructure

Declare ComboReturnKey()
Declare ComboCallBack()

Procedure ComboCreate(Window, Gadget, kMenuItemDefault = 64000)
        Define *A.COMBO = AllocateMemory(SizeOf(COMBO) )
        With *A
                \Window = Window
                \Gadget = Gadget
                \kMenuItem = kMenuItemDefault
                BindEvent(#PB_Event_Gadget, @ComboCallBack(), \Window, \Gadget)       
                \kMenu = CreateMenu(#PB_Any, WindowID(\Window) )
                BindMenuEvent(\kMenu, \kMenuItem, @ComboReturnKey() )       
        EndWith
        ProcedureReturn *A
EndProcedure

Procedure ComboDelete(Gadget)
        Define *A.COMBO = GetGadgetData(Gadget)
        With *A
                UnbindEvent(#PB_Event_Gadget, @ComboCallBack(), \Window, Gadget)
                UnbindMenuEvent(\kMenu, \kMenuItem, @ComboReturnKey() )       
                FreeMemory(*A)
        EndWith
EndProcedure

Procedure ComboReturnKey()
        PostEvent(#PB_Event_Gadget, GetActiveWindow(), GetActiveGadget(), #PB_EventType_FirstCustomValue, 'GK13')
EndProcedure

Procedure ComboCallBack()
        Define Gadget = EventGadget()
        Define *A.COMBO = GetGadgetData(Gadget)
        Define gState = GetGadgetState(Gadget)
        If *A
                With *A
                        Select EventType()
                                Case #PB_EventType_Focus
                                        AddKeyboardShortcut(\Window, #PB_Shortcut_Return, \kMenuItem)
                                Case #PB_EventType_LostFocus
                                        RemoveKeyboardShortcut(\Window, #PB_Shortcut_Return)
                                        SetGadgetText(Gadget, GetGadgetItemText(Gadget, \Item) )
                                Case #PB_EventType_Change
                                        If gState <> -1
                                                \Item = gState
                                        EndIf
                                Case #PB_EventType_FirstCustomValue
                                        If EventData() = 'GK13'
                                                SetGadgetItemText(Gadget, \Item, GetGadgetText(Gadget) )
                                        EndIf
                        EndSelect
                EndWith
        EndIf
EndProcedure

Procedure ComboGadget(Id, x, y, w, h, kMenuItemDefault = 64000)
        Define Result
        Define Gadget
        Result = ComboBoxGadget(Id, x, y, w, h, #PB_ComboBox_Editable)
        If Id = #PB_Any
                Gadget = Result
        Else
                Gadget = Id
        EndIf
        SetGadgetData(Gadget, ComboCreate(GetActiveWindow(), Gadget, kMenuItemDefault) )   
        ProcedureReturn Result
EndProcedure

Procedure ComboItem(Gadget, Item)
        Define *A.COMBO = GetGadgetData(Gadget)
        If *A
                With *A
                        SetGadgetState(Gadget, Item)
                        \Item = Item
                EndWith
        EndIf
EndProcedure




; Exemple


If OpenWindow(10, 0, 0, 270, 180, "Combo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
        ComboGadget(20, 10, 10, 250, 21)
        AddGadgetItem(20, -1, "Option A")
        AddGadgetItem(20, -1, "Option B")
        AddGadgetItem(20, -1, "Option C")
        ComboItem(20, 1)
        ButtonGadget(21, 10, 42, 250, 21, "Ok")
        Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Auteur:  Ollivier [ Mer 30/Mai/2018 9:03 ]
Sujet du message:  Re: [RESOLU] ComboBoxGadget() éditable.

J'ai fait un topo.

Page 2 sur 2 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/