Page 1 sur 1

aide sur les accelerators

Posté : ven. 13 sept. 2019 12:57
par littlechiki
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 !

Re: aide sur les accelerators

Posté : ven. 13 sept. 2019 18:06
par Tlem
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 ?

Re: aide sur les accelerators

Posté : ven. 13 sept. 2019 19:36
par walkson
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

 

Re: aide sur les accelerators

Posté : sam. 14 sept. 2019 12:04
par littlechiki
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.

Re: aide sur les accelerators

Posté : sam. 14 sept. 2019 15:09
par walkson
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

Re: aide sur les accelerators

Posté : sam. 14 sept. 2019 15:28
par littlechiki
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à !

Re: aide sur les accelerators

Posté : sam. 14 sept. 2019 16:10
par walkson
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
 

Re: aide sur les accelerators

Posté : dim. 15 sept. 2019 12:49
par littlechiki
Ç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 !

Re: aide sur les accelerators

Posté : dim. 15 sept. 2019 14:58
par walkson
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

Re: aide sur les accelerators  

Posté : dim. 15 sept. 2019 15:48
par walkson
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

Re: aide sur les accelerators

Posté : dim. 15 sept. 2019 18:51
par littlechiki
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 !