Page 1 sur 1
[R] Gestion dynamique de boutons
Posté : lun. 17 nov. 2014 15:43
par Y01
Bonjour,
J'ai commencé à créer une petite GUI avec gestion dynamique des boutons mais je bloque un peu pour "lier" les boutons à une action.
En effet, je souhaite que pour chaque fichier (TXT & JPG) situé dans un dossier précis, un bouton apparaisse avec le nom du fichier et qu'en cliquant sur le bouton le fichier s'ouvre.
Voici le bout de code que j'ai fait jusque la :
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <Date.au3>
#include <DateTimeConstants.au3>
#include <GUIConstants.au3>
#Include <GuiEdit.au3>
#include <ComboConstants.au3>
#include <Array.au3>
#include <File.au3>
Global $chemin = @UserProfileDir & "\Downloads" ; Chemin où se situe les fichiers
Global $txt = _FileListToArray($chemin, "*.txt", 1, false) ; Récupération des fichiers TXT
Global $jpg = _FileListToArray($chemin, "*.jpg", 1, false) ; Récupération des fichiers JPG
Global $GUI = GUICreate("Liseuse", 617, 439, 1029, 162)
Example()
GUISetState(@SW_SHOW, $GUI)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE ; Lorsqu'on clic sur la croix de fermeture, on ferme l'application.
Exit
Case $boutontxt ; Essai de création d'un lien sur chaque bouton...
ShellExecute($chemin & "\" & $txt[$i])
EndSwitch
WEnd
Func Example()
If @error = 1 Then
MsgBox($MB_SYSTEMMODAL, "", "Mauvais chemin !")
Exit
EndIf
If @error = 4 Then
MsgBox($MB_SYSTEMMODAL, "", "Aucun fichier trouvé.")
Exit
EndIf
Global $totaltxt = $txt[0] + 1 ; Calcul du nombre d'element TXT
Global $totaljpg = $jpg[0] + 1 ; Calcul du nombre d'element JPG
Global $boucletxt = 1 ; Renommage de la sempiternel variable $i
Global $bouclejpg = 1
Global $placementtxt = 10 ; Place du premier bouton qui sera créé
While $boucletxt < $totaltxt ; On fais un tour de boucle par fichier TXT jusqu'au dernier
global $boutontxt = GUICtrlCreateButton($txt[$boucletxt] & @LF, 10, $placementtxt, 200, 20) ; Chaque fichier donne lieu à un bouton
$placementtxt = $placementtxt + 30 ; Chaque bouton est placé 30px en dessous du précédent.
$boucletxt = $boucletxt + 1 ; Incrémentation de la variable
WEnd
Global $placementjpg = $placementtxt ; A la fin de la boucle des fichiers TXT, on donne la valeur de la dernière position (+30) à la position de la premiere image.
While $bouclejpg < $totaljpg
global $boutonjpg = GUICtrlCreateButton($jpg[$bouclejpg] & @LF, 10, $placementjpg, 200, 20)
$placementjpg = $placementjpg + 30
$bouclejpg = $bouclejpg + 1
WEnd
EndFunc
(J'ai récupérer "bêtement" les includes d'un programme beaucoup plus gros que j'avais déjà fait sans savoir les quels m'étaient indispensables.)
J'ai vainement tenter de faire un case afin de "lier" les boutons aux fichiers mais ça ne fonctionne pas.
Si quelqu'un a une piste, j'en serais très reconnaissant.
Cordialement,
Y01
EDIT : Je rajoute le code fonctionnel et corrigé grâce à Mikell
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
#include <File.au3>
Global $chemin = @UserProfileDir & "\Downloads" ; Chemin où se situe les fichiers
Global $files = _FileListToArrayRec($chemin, "*.txt;*.jpg", 1) ; Récupération des fichiers
Global $GUI = GUICreate("Liseuse", 617, 439, 1029, 162)
GUISetState(@SW_SHOW, $GUI)
Local $boutons[$files[0]]
Local $placement = 10
For $i = 1 to $files[0]
$boutons[$i-1] = GUICtrlCreateButton($files[$i] & @LF, 10, $placement, 200, 20)
$placement = $placement + 30
Next
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE ; Lorsqu'on clic sur la croix de fermeture, on ferme l'application.
Exit
EndSwitch
For $i = 1 to $files[0]
If $nMsg = $boutons[$i-1] Then ShellExecute($chemin & "\" & $files[$i])
Next
WEnd
Re: [..] Gestion dynamique de boutons
Posté : lun. 17 nov. 2014 19:16
par mikell
Récupère tous les noms de fichier dans la même array tu t'emmerderas infiniment moins
Code : Tout sélectionner
Global $files = _FileListToArrayRec($chemin, "*.txt;*.jpg", 1)
Ensuite fais une array pour stocker les ids des boutons au fur et à mesure de leur création
Code : Tout sélectionner
Local $boutons[$files[0]]
For $i = 1 to $files[0]
$boutons[$i-1] = GUICtrlCreateButton($files[$i], ...etc
Next
Enfin qqe chose comme ça dans la boucle While
Code : Tout sélectionner
For $i = 1 to $files[0]
If $nMsg = $boutons[$i-1] Then ShellExecute($chemin & "\" & $files[$i])
Next
Ouala

Re: [..] Gestion dynamique de boutons
Posté : mar. 18 nov. 2014 09:36
par Y01
J'avoue ne pas avoir trouvé comment mettre plusieurs extensions de fichiers dans une seule array ce qui explique la double boucle.
Je testerais tes modifications demain lorsque j'aurais le code sous la main et, si j'arrive à le faire fonctionner, je mettrais la balise [R].
Merci Mikell !
EDIT : ça marche du tonnerre !
Merci encore Mikell
