Page 1 sur 1

Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 12:19
par Koudou
Bonjour,

Je continue ma découverte d'AutoIt...

J'ai besoin d'un menu permettant de choisir des lettres de disques réseau (K:, L:, M:, ...) et d'en déduire le chemin correspondant (\\serveur\partage).
J'ai donc créé un tableau lettres/chemins réseau ($paths) et je veux associer un chemin par item de menu. Il me semble que les itemData sont fait pour ça. J'essaie donc :

Code : Tout sélectionner

For $i = 1 To Ubound($paths, 1) -1
   $id = GUICtrlCreateMenuItem($paths[$i] & ":", $menuDisks)
   GUICtrlSetOnEvent($id, "DisksMenuItemClicked")
   _GUICtrlMenu_SetItemData($hMenu, $id, $i)
   ConsoleWrite("Je stocke : " & $i & " pour " & $id)
Next
Puis dans la gestion des clics sur un item du menu :

Code : Tout sélectionner

$i = _GUICtrlMenu_GetItemData(GUICtrlGetHandle($menuDisks), @GUI_CtrlId, FALSE)
ConsoleWrite("Je récupère " & $i & "pour " & @GUI_CtrlId)
Dans la deuxième partie je récupère systématiquement 0 alors qu'il me semble avoir stocké un nombre différent par item.
La sortie donne :
Je stocke : 1 pour 6
Je stocke : 2 pour 7
Je stocke : 3 pour 8
Je stocke : 4 pour 9

Et puis :
Je récupère 0 pour 9"

Quelqu'un peut m'expliquer ce qui ne va pas ?
Merci.

Re: Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 18:45
par mikell
Pourquoi faire simple quand on peut faire compliqué ? :mrgreen:

Code : Tout sélectionner

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)

Local $array[3][2] = [["A", "chemin de A"], _ 
                     ["B", "chemin de B"], _ 
                     ["C", "chemin de C"]]

GUICreate("My GUI menu", 300, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$menu = GUICtrlCreateMenu("&Lettres")
$item1 = GUICtrlCreateMenuItem($array[0][0], $menu)
GUICtrlSetOnEvent(-1, "_func")
$item2 = GUICtrlCreateMenuItem($array[1][0], $menu)
GUICtrlSetOnEvent(-1, "_func")
$item3 = GUICtrlCreateMenuItem($array[2][0], $menu)
GUICtrlSetOnEvent(-1, "_func")
GUISetState()

While 1
   Sleep(10)
WEnd
 
Func _func()
   For $i = 0 to UBound($array)-1
      If GuiCtrlRead(@GUI_CtrlId, 1) = $array[$i][0] Then Msgbox(0,"", $array[$i][1])
   Next
EndFunc

Func _exit()
  Exit
EndFunc


Re: Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 19:26
par orax
Je ne sais pas si ça te seras utile pour la suite, mais pour déduire le chemin correspondant (\\serveur\partage), tu pourrais faire :

Code : Tout sélectionner

#include <WinNet.au3>
_WinNet_GetConnection("z:") ; retourne p. ex. \\serveur\partage

Re: Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 21:12
par Koudou
Réponses intéressantes. :)

@mikell ; C'est la solution que j'avais choisie au début mais j'ai découvert SetItemData et GetItemData et je me suis dit que c'était le plus simple à utiliser pour stocker un index en lien avec un item... A la réflexion c'est vrai que c'est idiot.

@orax : Oui c'est pas bête. Ca me garantit en plus que la connexion vers le serveur existe.

Merci pour vos solutions, je vais y réfléchir.

Re: Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 21:28
par mikell
A la réflexion c'est vrai que c'est idiot
C'est pas idiot du tout, c'est juste over-compliqué :mrgreen:

Re: Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 21:43
par orax
Koudou a écrit :Ca me garantit en plus que la connexion vers le serveur existe.
Eh, ça retourne le nom sans vérifier que la connexion est établie. Si j'ai un lecteur Z: sur lequel est monté \\serveur\partage, la fonction retournera \\serveur\partage même si la connexion n'est pas possible.

Re: Utilisation de _GUICtrlMenu_SetItemData et _GUICtrlMenu_GetItemData

Posté : mer. 20 avr. 2016 21:50
par Koudou
Oui est si je veux autoriser l'utilisation du script uniquement sur certains partages ça n'empêche pas un utilisateur de connecter un autre partage sur une lettre connue... Finalement je vais choisir la solution de mikell. :D