Page 1 sur 1
[R] Ajout de données dans ComboBox
Posté : ven. 16 févr. 2018 11:18
par jpascal
Bonjour,
Souhaitant utiliser la fonction _GUICtrlComboBox_Create au lieu de GUICtrlCreateCombo, je me heurte à la problématique de remplissage de la combobox car GUICtrlSetData() ne fonctionne pas.
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>
Example()
Func Example()
$hGUI = GUICreate("My GUI") ; will create a dialog box that when displayed is centered
_GUICtrlComboBox_Create($hGUI, "", 10, 10)
GUICtrlSetData(-1, "item1|item2|item3", "item3")
GUISetState(@SW_SHOW) ; will display an empty dialog box with a combo control with focus on
; Loop until the user exits.
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
EndFunc ;==>Example
Suis-je obligé d'utiliser une boucle et la fonction _GUICtrlComboBox_AddString pour cela ?
N'y a-t-il pas possibilité d'importer le contenu à l'aide de texte et séparateur OU d'un tableau ?
Re: [..] Ajout de données dans ComboBox
Posté : ven. 16 févr. 2018 14:08
par walkson
Bonjour,
Le problème vient que
_GUICtrlComboBox_Create($hGUI, "", 10, 10)
retourne un handle et
GUICtrlSetData(-1, "item1|item2|item3", "item3")
utilise un ID
Je vous propose la solution suivante
Parce que il est plus facile de récupérer un handle à partir de l'ID
Vous remarquerez que sur mon code _GUICtrlComboBox_AddDir($g_hCombo, "", $DDL_DRIVES, False) utilise un handle et _GUICtrlComboBox_SetCurSel($combo, 2) utilise un ID. Il faut regarder ce que les fonctions utilisent !
Re: [..] Ajout de données dans ComboBox
Posté : ven. 16 févr. 2018 14:37
par jpascal
Je comprends mieux désormais.
Comme quoi parfois les explications les plus simples sont les meilleures.
En revanche, cela ne répond qu'à moitié à mon interrogation.
Est-il possible de remplir une combobox avec du texte ou un tableau en utilisant son handle ? La fonction _GUICtrlComboBox_AddDir est sympa mais bien moins utile que ce que je souhaiterais faire.
En fait j'ai l'habitude d'utiliser la fonction GUICtrlCreateCombo mais je me demandais si utiliser _GUICtrlComboBox_Create et les fonctions de GuiComboBox.au3 n'était pas une meilleure habitude de codage.
Re: [..] Ajout de données dans ComboBox
Posté : ven. 16 févr. 2018 19:54
par mikell
jpascal a écrit : ↑ven. 16 févr. 2018 11:18je me demandais si utiliser _GUICtrlComboBox_Create et les fonctions de GuiComboBox.au3 n'était pas une meilleure habitude de codage.
Pas forcément. En général il vaut mieux utiliser les fonctions intégrées, mais l'UDF est utile pour effectuer certaines actions que le mode "simple" ne permet pas
Utiliser l'UDF si les fonctions intégrées suffisent, c'est du
pourquoi faire simple quand on peut faire compliqué 
Re: [..] Ajout de données dans ComboBox
Posté : ven. 16 févr. 2018 21:13
par walkson
Pour moi, les meilleurs codes sont les codes courts, qui utilisent peu de CPU et de mémoire, et surtout, qui font ce que l'on demande
Personnellement, j'utilise rarement les fonctions GuiComboBox.au3
Voilà un exemple simple pour rentrer un tableau (array) dans un combo
#include <GUIConstantsEx.au3>#include <GuiComboBox.au3>#include <Array.au3>Example
()Func Example
() Global $hGUI = GUICreate("My GUI") ; will create a dialog box that when displayed is centered Global $combo = GUICtrlCreateCombo("",10,50) GUISetState(@SW_SHOW) ; will display an empty dialog box with a combo control with focus on Global $aArray[6][2] = [[1, "A"], [2, "B"], [3, "C"], [4, "A1"], [5, "B1"], [6, "C1"]] ;Global $aArray[5] = [1,2,3,4,5] _ArrayDisplay($aArray) ArrayToCombo_1
($combo,$aArray,"3",0) If @error Then MsgBox (0,"",@error) ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEndEndFunc ;==>Example; #FUNCTION# ====================================================================================================================; Name ..........: ArrayToCombo_1; Description ...: Array To Combobox; Syntax ........: ArrayToCombo_1($IDcombo, $aArray[, $DefaultValue = ""[, $Ncolumn = 0]]); Parameters ....: $IDcombo - return by GUICtrlCreateCombo().; $aArray - an array 1D or 2D.; $DefaultValue - [optional] The default value of combobox. Default is "".; $Ncolumn - [optional] column of array 2D. Default is 0.; Return values .: None on Success; ===============================================================================================================================Func ArrayToCombo_1
($IDcombo,$aArray, $DefaultValue = "", $Ncolumn = 0) If Not IsArray($aArray) Then Return SetError(1) If $IDcombo = "" Then Return SetError(2) Local $items If UBound($aArray,0) = 1 Then $items = _ArrayToString($aArray, "|") Else $items = _ArrayToString($aArray, "|", -1, -1, "|", $Ncolumn , $Ncolumn ) EndIf GUICtrlSetData($IDcombo,$items,$DefaultValue)EndFunc
Re: [..] Ajout de données dans ComboBox
Posté : sam. 17 févr. 2018 09:56
par mikell
walkson a écrit : ↑ven. 16 févr. 2018 14:08Pour moi, les meilleurs codes sont les codes courts
Tu peux donc supprimer le test sur UBound dans ta fonction puisque _ArrayToString le fait déjà en interne
Pour rajouter une valeur dans la liste de la combo en utilisant l'ID :
ControlCommand($hGUI, "", $combo, "AddString", $string)
NB: Utiliser les UDF peut exposer davantage à des "script breaking changes" qui ne sont pas toujours mentionnés dans les "release notes". Les paramètres par défaut de _ArrayToString en sont un bon exemple
Re: [..] Ajout de données dans ComboBox
Posté : sam. 17 févr. 2018 14:23
par walkson
Tu peux donc supprimer le test sur UBound dans ta fonction puisque _ArrayToString le fait déjà en interne

En effet, ça fait doublon (c'est la première fois que j'utilise _ArrayToString, habituellement j'utilise les boucles)
Ce qui nous donne
Func ArrayToCombo_1
($IDcombo,$aArray, $DefaultValue = "", $Ncolumn = 0) If Not IsArray($aArray) Then Return SetError(1) If GUICtrlGetHandle($IDcombo) = 0 Then Return SetError(2) If UBound($aArray,0) > 1 And $Ncolumn > UBound($aArray,2) - 1 Then Return SetError(3) Local $items $items = _ArrayToString($aArray, "|", -1, -1, "|", $Ncolumn , $Ncolumn ) GUICtrlSetData($IDcombo,$items,$DefaultValue)EndFunc