[R] Ajout de données dans ComboBox

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] Ajout de données dans ComboBox

#1

Message 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 ?
Modifié en dernier par jpascal le lun. 18 févr. 2019 17:07, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Ajout de données dans ComboBox

#2

Message 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 !
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Ajout de données dans ComboBox

#3

Message 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.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Ajout de données dans ComboBox

#4

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Ajout de données dans ComboBox

#5

Message 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
 
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Ajout de données dans ComboBox

#6

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Ajout de données dans ComboBox

#7

Message 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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Répondre