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
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>

Example()

Func Example()
   $hGUI = GUICreate("My GUI") ; will create a dialog box that when displayed is centered
   $combo = GUICtrlCreateCombo("",10,50)
   GUICtrlSetData(-1,"AA|BB")
   $g_hCombo = GUICtrlGetHandle($combo)

    _GUICtrlComboBox_BeginUpdate($g_hCombo)
    _GUICtrlComboBox_AddDir($g_hCombo, "", $DDL_DRIVES, False)
    _GUICtrlComboBox_EndUpdate($g_hCombo)
   
   _GUICtrlComboBox_SetCurSel($combo, 2)

   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
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é :wink:

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 :mrgreen:
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
   WEnd
EndFunc   ;==>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 :wink:

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 :wink:
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