Page 1 sur 1

[R] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 11:26
par Laddy
Bonjour
Je ne suis pas encore familière des tableaux en autoit. C'est mon tout premier.
j'ai un soucis sur un tableau 1D à afficher dans une liste déroulante, j'ai lu la documentation et j'ai tenté différentes choses je me retrouve toujours avec un ou deux éléments c'est tout au lieu des 62.
Pourquoi ?

Merci aux membres qui me répondront.

Laddy

Code : Tout sélectionner

#cs
Excercice sur le tableau 1D : Lister le contenu d'un tableau dans une liste déroulante.
CloneVDIManager Laddy - but listé dans la gui CreateVM une liste déroulante des Type OS et lancer la création en utilisant le résultat
Suite du sujet : http://www.autoitscript.fr/forum/viewtopic.php?f=3&t=6647 (Amélioration)
#ce

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=

Global $i, $OsType

Global $Form1 = GUICreate("Form1", 414, 152, 192, 124)
Global $ListOsType = GUICtrlCreateCombo("", 104, 40, 145, 25)
Global $Go = GUICtrlCreateButton("Go", 152, 96, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$OsType[62] = ["Other", "Windows31", "Windows95", "Windows98", "WindowsMe", _
            "WindowsNT4", "WindowsNT", "Windows2000", "Windows2003", "Windows2003_64", "Windows2008", "Windows2008_64", _
            "WindowsXP", "WindowsXP_64", "WindowsVista", "WindowsVista_64", "Windows7", "Windows7_64", _
            "Linux", "Linux22", "Linux24", "Linux24_64", "Linux26", "Linux26_64", "ArchLinux", "ArchLinux_64", "Debian", "Debian_64", "OpenSUSE", "OpenSUSE_64", _
            "Fedora", "Fedora_64", "Gentoo", "Gentoo_64", "Mandriva", "Mandriva_64", "RedHat", "RedHat_64", "Turbolinux", "Ubuntu", "Ubuntu_64", _
            "Xandros", "Xandros_64", "Solaris", "Solaris_64", "OpenSolaris", "OpenSolaris_64", _
            "FreeBSD", "FreeBSD_64", "OpenBSD", "OpenBSD_64", "NetBSD", "NetBSD_64", _
            "OS2Warp3", "OS2Warp4", "OS2Warp45", "OS2eCS", "OS2", _
            "DOS", "Netware", "L4", "QNX"]

[color=#008000];Je pense que mon soucis est ici dans le For. Pour chaque élément ($i) dans le tableau $OsType, Lire(GuiCtrlSetData) dans la liste déroulante ($ListOsType) les éléments ($i) dans le tableau ($OsType)[/color]
[color=#FF0000]For $i In $OsType
GUICtrlSetData($ListOsType, $OsType[$i])
Next[/color]

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $Go
            Go_List()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd



Func Go_List()
  local $Os = GuiCtrlRead($ListOsType) ; tout simplement
MsgBox(0, "Tableau 1D", $Os)
EndFunc   ;==>Go_List

Re: [..] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 12:10
par poke123
tente (array.au3 requis) guictrlsetdata($combo, _arraytostring($array, "|"))

Re: [..] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 12:38
par Laddy
Bonjour
AH ben voila ça se complique toujours , j'ai inclue UDF et modifié maintenant tout est listé.
Me reste à faire fonctionner mon bouton maintenant et je vois pas comment l'utiliser :cry:

Code : Tout sélectionner

Func Go_List()
    For $i = 1 To $OsType
        [color=#FF0000]If $nMsg = $ListOsType[$i] Then[/color] ; je pense que c'est mon soucis
            MsgBox(0, "Tableau 1D", GUICtrlSetData($ListOsType, _ArrayToString($OsType, "|"), $OsType[0]))
        EndIf
    Next
EndFunc   ;==>Go_List

;C:\Documents and Settings\Caiine\Bureau\Autoit\Tableau_1D.au3 (43) : ==> Subscript used with non-Array variable.:
;If $nMsg = $ListOsType[$i] Then
;If $nMsg = $ListOsType^ ERROR
 
Merci

Re: [..] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 15:33
par jchd

Code : Tout sélectionner

Func Go_List()
    For $i = 0 To Ubound($OsType) - 1
        If $nMsg = $ListOsType[$i] Then
            MsgBox(0, "Tableau 1D", GUICtrlSetData($ListOsType, _ArrayToString($OsType, "|"), $OsType[0]))
        EndIf
    Next
EndFunc   ;==>Go_List
 

Re: [..] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 15:57
par Laddy
Bonjour
j'ai testé et j'ai toujours le même soucis

Code : Tout sélectionner

C:\Documents and Settings\Laddy\Bureau\Autoit\Tableau_1D.au3 (41) : ==> Subscript used with non-Array variable.:
If $nMsg = $ListOsType[$i] Then
If $nMsg = $ListOsType^ ERROR
->15:55:50 AutoIT3.exe ended.rc:1
>Exit code: 1    Time: 3.962

Re: [..] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 16:30
par GaRydelaMer
Bonjour

alors pour lire les données d'un contrôle, utilise GUICtrlRead().

Pour afficher des données dans un contrôle GUICtrlSetData().


Maintenant avec les ListBox:

pour ajouter des données dans le contôle GUIcrtrlSetDate($idListBox, "chaine séparer les valeurs par | ")

le GuiCtrlRead() te renverra la valeur sélectionner dans la liste.

Func Go()
local $Os = GuiCtrlRead($ListOsType) ; tout simplement
MsgBox(0, "Tableau 1D", $Os)
EndFunc

Maintenant que cela est acquis, pour en revenir a ton tableau, tu peux vouloir connaitre l'index du tableau de l'élément sélectionné dans la liste:
la on va utiliser les fonctions sur les tableaux local $Index = _ArraySearch($OSType, $Os) ici $Os = GuiCtrlRead($ListOsType).

Pour retenir tous ca, sache que tous les contrôle qui sont créer de facon standard, avec GuiCtrlCreate_xxx, te retourne seulement un ID (un entier), en gros un pointeur unique vers le contrôle en aucun cas un tableau.

Re: [..] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 16:40
par Laddy
Bonjour GaRydelaMer
En gros je me suis torturée la tête en pensant que c'était compliqué.
J'ai juste besoin dans ce cas de récupérer le nom et non l'index pour mon programme.
Bon je vais aller le compléter j'espère que ça ira :oops:
Merci pour l'explication je vais le mettre dans mon anti-sèche pour ne pas l'oublier.

Re: [R] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 16:44
par GaRydelaMer
Re,

j'espère seulement que tu as pas trop mal à la tête ;)

Re: [R] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 17:04
par Laddy
Oh que si !je suis malade en plus

En plus l'intégration ne se fait pas comme je le souhaite mon bouton Go ne fonctionne plus :(
Ah j'ai trouvé mais tiens bizzare que ça se déclenche maintenant.

Re: [R] Lister un tableau 1D dans une liste déroulante

Posté : jeu. 13 janv. 2011 18:27
par matwachich
Le problème, c'est que tu utilise GuiCtrlSetData (Le mot clef est en rouge!!!)
Set, ca veut dire que ce qu'il y avait avant dans ton control sera écraser par ce que tu y met maintenant.

En plus, le $i dans ta boucle ne prend pas la valeur de l'index de l'élément, mais l'élément lui même.
Pour avoir l'index, et l'utiliser comme tu le fait (c'est à dire $OsType[$i]), il faut utiliser une boucle For To Next
Exemple:

Code : Tout sélectionner

For $i = 0 To Ubound($OsType) - 1
ConsoleWrite($OsType[$i] & @CRLF)
Next

; Comme tu le fait, ca devrait être:
For $i In $OsType
ConsoleWrite($i & @CRLF)
Next
 
Quand à ton problème, le mieux c'est de d'abord construire le string que va mettre dans ton combo, c'est à dire (comme le dit la doc) la liste des éléments séparés par |

Exemple:

Code : Tout sélectionner

#cs
Excercice sur le tableau 1D : Lister le contenu d'un tableau dans une liste déroulante.
CloneVDIManager Laddy - but listé dans la gui CreateVM une liste déroulante des Type OS et lancer la création en utilisant le résultat
Suite du sujet : viewtopic.php?f=3&t=6647 (Amélioration)
#ce

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=

Global $Form1 = GUICreate("Form1", 414, 152, 192, 124)
Global $ListOsType = GUICtrlCreateCombo("", 104, 40, 145, 25)
Global $Go = GUICtrlCreateButton("Go", 152, 96, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Dim $OsType[62] = ["Other", "Windows31", "Windows95", "Windows98", "WindowsMe", _
            "WindowsNT4", "WindowsNT", "Windows2000", "Windows2003", "Windows2003_64", "Windows2008", "Windows2008_64", _
            "WindowsXP", "WindowsXP_64", "WindowsVista", "WindowsVista_64", "Windows7", "Windows7_64", _
            "Linux", "Linux22", "Linux24", "Linux24_64", "Linux26", "Linux26_64", "ArchLinux", "ArchLinux_64", "Debian", "Debian_64", "OpenSUSE", "OpenSUSE_64", _
            "Fedora", "Fedora_64", "Gentoo", "Gentoo_64", "Mandriva", "Mandriva_64", "RedHat", "RedHat_64", "Turbolinux", "Ubuntu", "Ubuntu_64", _
            "Xandros", "Xandros_64", "Solaris", "Solaris_64", "OpenSolaris", "OpenSolaris_64", _
            "FreeBSD", "FreeBSD_64", "OpenBSD", "OpenBSD_64", "NetBSD", "NetBSD_64", _
            "OS2Warp3", "OS2Warp4", "OS2Warp45", "OS2eCS", "OS2", _
            "DOS", "Netware", "L4", "QNX"]

; On construit le string
Global $string = ""

For $i In $OsType
    $string &= $i & "|"
Next
$string = StringTrimRight($string, 1) ; c'est pour enlever le dernier |
ConsoleWrite($string & @CRLF)

GUICtrlSetData($ListOsType, $string)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $Go
            Go_List()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func Go_List()
    local $Os = GuiCtrlRead($ListOsType) ; tout simplement
    MsgBox(0, "Tableau 1D", $Os)
EndFunc   ;==>Go_List
 
PS: l'utilisation massive de ConsoleWrite est bénéfique pour la compréhension et la poursuite des erreurs qui se glissent dans un script!