aide sur les accelerators

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
littlechiki
Niveau 3
Niveau 3
Messages : 39
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

aide sur les accelerators

#1

Message par littlechiki » ven. 13 sept. 2019 11:57

Bonjour,
Je nécessiterai un peu de votre aide concernant les accelerators. voilà déjà mon code et je vous expose mon problème après :
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$gui = GUICreate("Ma GUI",500,500)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
$label = GUICtrlCreateLabel("i = 0",100,150,130,20)
$i = 0
GUISetState(@SW_SHOW,$gui)
Local $aAccelKey[1][2] = [["{ENTER}",$button]]
GUISetAccelerators($aAccelKey)
While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        $i += 1
                        GUICtrlSetData($label,"i = " & $i)
        EndSwitch
WEnd
Mon problème est que les accelerators répètent l'action tant que la touche est enfoncée. si j'appuie sur le bouton avec la souris, i n'augmente que de 1 mais si j'appuie sur entrer, l'action se répète à toute vitesse. Y aurait-il un moyen de faire que l'action ne s'effectue qu'une seule fois tant que ma touche est appuyée ? Je ne peut pas utiliser de HotkeySet parce que mes touches seront utilisé sur d'autres fenêtres aussi. Merci pour vos réponses !

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11431
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: aide sur les accelerators

#2

Message par Tlem » ven. 13 sept. 2019 17:06

Bonjour.
J'ai pas vraiment eu le temps de regarder en détail, mais est-ce qu'une petite pause après le GUICtrlSetData() n'améliorerais pas un peu ?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 703
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: aide sur les accelerators

#3

Message par walkson » ven. 13 sept. 2019 18:36

Bonjour,
C'est pas terrible mais ce peut être une piste...........
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>

$gui = GUICreate("Ma GUI",500,500)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
Global $label = GUICtrlCreateLabel("i = 0",100,150,130,20)
Global $i = 0, $rep
GUISetState(@SW_SHOW,$gui)
Local $aAccelKey[1][2] = [["{ENTER}",$button]]
GUISetAccelerators($aAccelKey)

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        Do
                                $rep = _IsPressed("0D")
                         Until $rep = False
                        $i += 1
                        GUICtrlSetData($label,"i = " & $i)
        EndSwitch
WEnd

 
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 39
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: aide sur les accelerators

#4

Message par littlechiki » sam. 14 sept. 2019 11:04

Bon de mon côté, j'ai trouvé ça. bon ça marche pas vraiment mais ça c'est parce que j'ai vraiment du mal avec les timers...
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>

$gui = GUICreate("Ma GUI",500,500)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
$check = GUICtrlCreateCheckbox("",1000,1000)
Global $label = GUICtrlCreateLabel("i = 0",100,150,130,20)
Global $i = 0
GUISetState(@SW_SHOW,$gui)
Local $aAccelKey[1][2] = [["{ENTER}",$button]]
GUISetAccelerators($aAccelKey)

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        Local $timer = 0
                        $timer = TimerInit
                        If Not _IsChecked($check) Then
                                $i += 1
                                GUICtrlSetData($label,"i = " & $i)
                        EndIf
                        GUICtrlSetState($check,$GUI_CHECKED)
                        If TimerDiff($timer) = 1000 Then GUICtrlSetState($check,$GUI_UNCHECKED)
        EndSwitch
WEnd

Func _IsChecked($control)
        Return BitAND(GUICtrlRead($control), $GUI_CHECKED) = $GUI_CHECKED
EndFunc
Vous auriez des idées pour faire qu'il marche ? Mon idée serait de remettre le timer à 0 à chaque fois que le bouton est appuyé, comme ça, tant que le bouton n'est pas relâché au moins une seconde, ça ne fait rien.

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 703
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: aide sur les accelerators

#5

Message par walkson » sam. 14 sept. 2019 14:09

Bonjour,
J'ai essayé plusieurs choses comme des boucles mais le bourrin continue à incrémenter $i par derrière donc la seule chose que j'ai trouvé, c'est de bloqué GUISetAccelerators() un moment et de le remettre comme ceci (J'ai mis la touche F2 car ENTER peut être trompeur)
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$gui = GUICreate("Ma GUI",500,500)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
Global $label = GUICtrlCreateLabel("i = 0",100,150,130,20)
Global $i = 0
GUISetState(@SW_SHOW,$gui)
Local $aAccelKey[1][2] = [["{F2}",$button]]
GUISetAccelerators($aAccelKey)

While 1
        $nmsg = GUIGetMsg()
                Switch $nmsg
                        Case $GUI_EVENT_CLOSE
                                Exit
                        Case $button
                                $i += 1
                                GUICtrlSetData($label,$i)

                                $aAccelKey[0][1] = 0
                                GUISetAccelerators($aAccelKey)
                                Sleep(1000)
                                $aAccelKey[0][1] = $button
                                GUISetAccelerators($aAccelKey)
        EndSwitch
WEnd
$i continue à être incrémenté mais beaucoup plus lentement
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 39
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: aide sur les accelerators

#6

Message par littlechiki » sam. 14 sept. 2019 14:28

En effet c'est déjà beaucoup mieux Et du coup avec un timer pour dire If $timer <=1000 Then $aAccelKey[0][1] = 0, ce serait pas possible ? (J'essaye juste de rendre mon programme le plus rapide possible donc l'utilisation de sleep ralentis le tout quoi) Mais c'est une très bonne idée ! Merci déjà !

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 703
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: aide sur les accelerators

#7

Message par walkson » sam. 14 sept. 2019 15:10

Comme ceci ?
(ne pas oubliez F2 :) )
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$gui = GUICreate("Ma GUI",500,500)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
Global $label = GUICtrlCreateLabel("i = 0",100,150,130,20)
Global $i = 0, $ret
GUISetState(@SW_SHOW,$gui)
Local $aAccelKey[1][2] = [["{F2}",$button]]
GUISetAccelerators($aAccelKey)
$tt = TimerInit()
While 1
        $nmsg = GUIGetMsg()
                Switch $nmsg
                        Case $GUI_EVENT_CLOSE
                                Exit
                        Case $button
                                $i += 1
                                GUICtrlSetData($label,$i)
                                $aAccelKey[0][1] = 0
                                GUISetAccelerators($aAccelKey)
                                $ret = 0
                EndSwitch

                                If  TimerDiff($tt) > 1500 And $ret = 0 Then
                                        $aAccelKey[0][1] = $button
                                        GUISetAccelerators($aAccelKey)
                                        $tt = TimerInit()
                                        $ret = 1 ;empèche de lancer GUISetAccelerators() inutilement
                                EndIf
WEnd
 
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 39
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: aide sur les accelerators

#8

Message par littlechiki » dim. 15 sept. 2019 11:49

Ça a presque atteint la perfection là ! merci, Je vais me servir de ça !
Maintenant pour atteindre la perfection, je me demandais, y aurait pas moyen de relancer le timer a chaque fois que le bouton est pressé ? Là ça empêcherait vraiment d’incrémenter car à chaque fois, on lui dirait d'incrémenter seulement si TimerDiff($tt) > 50 par exemple mais comme il relancerait le timer à chaque pressage de bouton, il n'atteindrait 50 que si on relâchait le bouton. Après je sais pas si ça serait possible...
Mais c'est déjà proche de la perfection comme ça !

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 703
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: aide sur les accelerators

#9

Message par walkson » dim. 15 sept. 2019 13:58

Bonjour,
Je pense que le problème est mal posé et de rattacher une touche à un bouton (dans ce cas) est une mauvaise idée.
Je vous propose d'utiliser HotKeySet() pour la touche et le bouton indépendamment comme ceci
#include <Misc.au3>
$Gui = GUICreate("", 400, 50)
Local $input = GUICtrlCreateInput(0, 10, 20, 50,25)
$button = GUICtrlCreateButton("clic", 100, 20, 50,25)
GUISetState()
Global $a = 0, $b = 1
HotKeySet("{F2}","clic")

While 1
   $msg = GUIGetMsg()
   Select
       Case $msg = -3
           Exit
           case $msg = $button
                        $a = GUICtrlRead($input)
                        $a += $b
                        GUICtrlSetData($input,$a)
   EndSelect
WEnd



Func clic()
        $a = GUICtrlRead($input)
        $a += $b
        GUICtrlSetData($input,$a)
        $b = 0
        Do
                If _IsPressed("71") = False Then $b = 1 ;F2 relaché quitte la boucle
        Until $b = 1
EndFunc
$i s'incrémente de 1 à chaque appel du bouton ou de F2
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 703
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: aide sur les accelerators  

#10

Message par walkson » dim. 15 sept. 2019 14:48

Remarquez, on peut le faire comme ceci
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>

$gui = GUICreate("Ma GUI",500,250)
$button = GUICtrlCreateButton("Affichage",100,100,130,40)
Global $label = GUICtrlCreateLabel("i = 0",100,150,130,20)
Global $i = 0, $rep = 1
GUISetState(@SW_SHOW,$gui)
Local $aAccelKey[1][2] = [["{F2}",$button]]
GUISetAccelerators($aAccelKey)

While 1
        Switch GUIGetMsg()
                        Case $GUI_EVENT_CLOSE
                                Exit
                        Case $button
                                $i += $rep
                                GUICtrlSetData($label,"i = " & $i)
                                $rep = 0
                                $aAccelKey[0][1] = 0
                                GUISetAccelerators($aAccelKey)
                                Do
                                        If _IsPressed("71") = False Then $rep = 1
                                Until $rep = 1
                                $aAccelKey[0][1] = $button
                                GUISetAccelerators($aAccelKey)
        EndSwitch
WEnd
 
mais il faut désactiver GUISetAccelerators() pour l’empêcher d'incrémenter $i. Perso, je préfère la solution au-dessus
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

littlechiki
Niveau 3
Niveau 3
Messages : 39
Enregistré le : sam. 13 avr. 2019 12:58
Status : Hors ligne

Re: aide sur les accelerators

#11

Message par littlechiki » dim. 15 sept. 2019 17:51

Oh merci ça marche parfaitement ! Je trouve aussi que la méthode avec le hotkeyset est meilleure mais comme je devrais me servir de la touche si je sors de l'application, je vais me servir de l'accelerator (tout en gardant l'idée du hotkeyset sous la main).
En tous cas, un grand merci pour ça ! Je passe le sujet en résolu !

Répondre