Page 1 sur 1
[R] Génération dynamique de boutons
Posté : mer. 02 avr. 2014 10:09
par Fox177
Bonjour,
J'ai besoin de générer dynamiquement des boutons mais je n'arrive pas à différencier les boutons lorsqu'on leur clique dessus. Je m'explique:
Je génère les boutons de la manière suivante:
Code : Tout sélectionner
for $i = 1 to $total_count
$manage_image_list_btn[$i] = _GuiLabelCreateButton(IniRead(@ScriptDir & "\data\main.ini", "Images Urls", $i, False), 0, $total_top, 11, 700, -1, 0xb5b5b5)
$total_top = $total_top + 30
Next
Mon problème est d'arriver à récupérer quelle est la case du tableau $manage_image_list_btn[] associée au bouton sur lequel on a cliqué...
J'ai essayé de la manière suivante mais ça ne fonctionne malheureusement pas

:
Code : Tout sélectionner
while 1
$nMsg = GUIGetMsg()
Switch $nMsg
case $GUI_EVENT_CLOSE
Exit
Case $manage_image_list_btn
for $i = 1 to $total_count
if GUIGetMsg() = $manage_image_list_btn[$i] Then
MsgBox('','',$i)
EndIf
Next
EndSwitch
WEnd
En gros ce que je voudrais:
Lorsque que l'on clique sur un de ces boutons, ça exécute une fonction avec en paramètre le numéro du bouton sur lequel on a cliqué.
J'espère avoir été clair.
Merci pour votre aide

Re: [..]Génération dynamique de boutons
Posté : mer. 02 avr. 2014 12:29
par PandiPanda
Bonjour, ceci?
► Afficher le texte
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 109, 222, 192, 114)
Local $button[5]
For $i = 0 To 4
$button[$i] = GUICtrlCreateButton("Button "&$i,0, ($i*40), 105, 33)
Next
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
_buttonPressed($button,$nMsg)
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _buttonPressed($array,$msgGui)
For $i = 0 To UBound($array)-1
If $msgGui == $array[$i] Then
MsgBox(0,"Boutton presser","Bouton n°"&$i)
ExitLoop
EndIf
Next
EndFunc
Re: [..]Génération dynamique de boutons
Posté : mer. 02 avr. 2014 12:33
par TommyDDR
Bonjour,
Il me semble que GUIGetMsg() va vous renvoyer ET retirer les éléments présent dans la file.
Je vous conseille fortement d'activer le mode événementiel.
Voici votre script (J'ai spéculé quant au contenu de la fonction _GuiLabelCreateButton) intégrant le mode événementiel et vous indiquant le bouton/label cliqué.
► Afficher le textecode
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt("MustDeclareVars", 1)
Opt("GuiOnEventMode", 1)
Global $total_count = 10
Global $manage_image_list_btn[$total_count]
Global $gui
$gui = GUICreate("Test", 150, 305)
GUISetOnEvent($GUI_EVENT_CLOSE, "quit", $gui)
For $i = 0 to $total_count-1
$manage_image_list_btn[$i] = _GuiLabelCreateButton(IniRead(@ScriptDir & "\data\main.ini", "Images Urls", $i, False), 5, 5+$i*30, 11, 700, -1, 0xb5b5b5)
GUICtrlSetOnEvent($manage_image_list_btn[$i], "clicButton")
Next
GUISetState(@SW_SHOW, $gui)
While(True)
Sleep(100)
WEnd
Func clicButton()
Local $indice = GetIndiceFromID(@GUI_CtrlId)
If($indice >= 0) Then
ToolTip("Clic bouton : " & GUICtrlRead($manage_image_list_btn[$indice]))
EndIf
EndFunc
Func GetIndiceFromID($ctrlId)
Local $retour = -1
For $i = 0 To UBound($manage_image_list_btn, 1)-1
If($manage_image_list_btn[$i] = $ctrlId) Then
$retour = $i
ExitLoop
EndIf
Next
Return $retour
EndFunc
Func _GuiLabelCreateButton($texte, $x, $y, $fontSize, $fontWeight, $style, $color)
Local $ctrl = GUICtrlCreateLabel($texte, $x, $y, 140, 25, $style)
GUICtrlSetBkColor($ctrl, $color)
GUICtrlSetFont($ctrl, $fontSize, $fontWeight)
Return $ctrl
EndFunc
Func quit()
Exit
EndFunc
EDIT : Grillé par pandipanda

Re: [..]Génération dynamique de boutons
Posté : mer. 02 avr. 2014 14:06
par mikell
Le mode événementiel est préférable dans ce genre de cas
On peut aussi passer par GUIRegisterMsg
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
Global $Form1 = GUICreate("Form1", 109, 222, 192, 114)
Local $button[5]
For $i = 0 To 4
$button[$i] = GUICtrlCreateButton("Button "& $i, 0, ($i*40), 105, 33)
Next
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg, $lParam
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0x0000FFFF)
Switch $nNotifyCode
Case $BN_CLICKED
For $i = 0 to UBound($button)-1
If $nID = $button[$i] Then Msgbox(0,"", $i)
Next
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Ce n'est qu'un exemple (mettre une msgbox bloquante dans "Func WM_COMMAND" n'est pas conseillé)
Re: [R] Génération dynamique de boutons
Posté : mer. 02 avr. 2014 19:56
par Fox177
Merci pour vos réponses aussi rapides.
Grâce à vous, je me coucherais moins bête ce soir

Re: [..]Génération dynamique de boutons
Posté : mer. 11 juin 2014 15:23
par davzell
mikell a écrit :Le mode événementiel est préférable dans ce genre de cas
On peut aussi passer par GUIRegisterMsg
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
Global $Form1 = GUICreate("Form1", 109, 222, 192, 114)
Local $button[5]
For $i = 0 To 4
$button[$i] = GUICtrlCreateButton("Button "& $i, 0, ($i*40), 105, 33)
Next
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg, $lParam
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0x0000FFFF)
Switch $nNotifyCode
Case $BN_CLICKED
For $i = 0 to UBound($button)-1
If $nID = $button[$i] Then Msgbox(0,"", $i)
Next
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Ce n'est qu'un exemple (mettre une msgbox bloquante dans "Func WM_COMMAND" n'est pas conseillé)
Est ce qu'il serait possible de faire le même genre de gui dynamique en utilisant des répertoires Windows pour créer les bouton
je m'explique, dans un répertoires (par exemple C:\software) j'ai différents sous répertoires (C:\software\prog1, C:\software\soft1,...) contenant chacun un .exe du même nom que le sous répertoire ou il est placé.
je voudrais que la gui dynamique me crée différents boutons avec le nom du sous répertoire et que quand j'appuis sur le bouton ça me lance l'exe présent dans le sous répertoire.
Comme ça des que j'ajoute des programmes dans mon C:\software je n'ai pas besoin de refaire la gui.
merci d'avance