Je n'ai pas vu de conflit. Un chahut peut être ? ^-^Fig a écrit :Je souhaite que ça ne donne pas lieu à un conflit.
Quand à être raisonnable je déteste.
Je n'ai pas vu de conflit. Un chahut peut être ? ^-^Fig a écrit :Je souhaite que ça ne donne pas lieu à un conflit.
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.Fig a écrit :Merci à toutes les personnes qui ont répondu, y compris en messages privés.
Code : Tout sélectionner
;********************************************************************************************************************************************************************************************
#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