Page 1 sur 1

Appel fonction a chaque appuis touche dans zone de saisie

Posté : dim. 22 janv. 2017 12:52
par Ramirez22
Bonjour à toutes et à tous et mes meilleur voeux pour cette nouvelle année.

Je suis en train de découvrir AutoIt et j'avoue que ce petit langage me plait bien.
Par contre, je débute (ainsi qu'en programmation de manière générale) et forcément, je rencontre quelques difficultés.

J'ai (pour l'instant) une zone de saisie (GUICtrlCreateInput) et un label (GUICtrlCreateLabel) dans un formulaire.

Je voudrais modifier le label en fonction de ce que je tape dans la zone de saisie, mais de manière continue et instantanée, pas lorsque je valide par Entrée.
La fonction On_change n'est appelée que lorsque je tape sur Entrée, ce qui ne correspond pas à ce que je veux faire.
J'ai regardé sur le forum, mais je n'ai pas trouvé d'info.

Merci de votre aide

Cdt,
Ramirez22

Re: Appel fonction a chaque appuis touche dans zone de saisie

Posté : dim. 22 janv. 2017 19:16
par parazitenew
Bonsoir,

Quelque chose dans le genre?
#include <guiconstants.au3>

AdlibRegister("update",100)

GUICreate('',200,200)
$input = GUICtrlCreateInput('',10,20,100,30)
GUICtrlSetFont(-1,14)
$label = GUICtrlCreateLabel("",15,70,150,50)
GUICtrlSetFont(-1,14)

GUISetState(@SW_SHOW)

While 1
   $msg = GUIGetMsg()
   Select
      Case $msg = $GUI_EVENT_CLOSE
         Exit
   EndSelect
WEnd

Func update()
   $data = GUICtrlRead($input)
   GUICtrlSetData($label,$data)
EndFunc

Re: Appel fonction a chaque appuis touche dans zone de saisie

Posté : lun. 23 janv. 2017 07:29
par Ramirez22
Bonjour et merci de votre réponse.

C'est exactement la fonction que je recherche.

Par contre, j'aurais 2 petites questions :
- Est-ce que cette méthode est compatible avec une programmation en mode séquentiel ?
- Est-ce que cela ne va pas "saccader" l'exécution du code ?
Pour la deuxième question, ce n'est pas primordial (mon application est un moteur de recherche dans une BD SQLite), mais cela me semble assez brutal (appel d'une fonction toutes les x ms pour vérifier un champs txt, ça me semble assez bourin :lol: ).

En tout cas, c'est une piste que je vais explorer, merci encore.

Cordialement,
Ramirez22

Re: Appel fonction a chaque appuis touche dans zone de saisie  

Posté : lun. 23 janv. 2017 12:37
par mikell
ça me semble assez bourin
C'est pas complètement faux :mrgreen:

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3> 
#include <EditConstants.au3>
     
GUICreate('', 200, 200)
$input = GUICtrlCreateInput('',10,20,100,30)
$label = GUICtrlCreateLabel("",15,70,150,50)
GUISetState()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") 
     
While 1
    $msg = GUIGetMsg()
    Select
         Case $msg = $GUI_EVENT_CLOSE
                Exit
    EndSelect
WEnd
     
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam) 
  If BitAND($wParam, 0x0000FFFF) = $input AND BitShift($wParam, 16) = $EN_UPDATE Then _ 
        GUICtrlSetData($label, GUICtrlRead($input))
   Return 'GUI_RUNDEFMSG'
EndFunc 

Re: Appel fonction a chaque appuis touche dans zone de saisie

Posté : lun. 23 janv. 2017 20:12
par parazitenew
Toutes mes solutions sont radicales :mrgreen:
@ramirez, j'ai vérifier chez moi, ça ne consomme pas plus de CPU ou de RAM. 8)

@mikell, j'ai pensé au WM_COMMAND, mais ça ne reviendrait pas au même? La fonction continue de vérifier un changement dans l'input en interne. C'est comme un adlibregister au fond non?

Re: Appel fonction a chaque appuis touche dans zone de saisie

Posté : lun. 23 janv. 2017 21:15
par mikell
Bin non. WM_COMMAND n'est appelée que si tu touches au controle, alors qu'avec Adlibregister la fonction s'exécute en permanence, même quand c'est inutile, et peut donc interférer avec le déroulement du script
Je cite le fichier d'aide :
The adlib function should be kept simple as it is executed often and during this time the main script is paused. Also, the time parameter should be used carefully to avoid CPU load.
En général quand on a affaire à des controles il est de loin préférable d'utiliser un GuiRegisterMsg plutôt qu'un Adlibregister (ou qu'une fonction lancée directement en continu dans la boucle While principale)

Re: Appel fonction a chaque appuis touche dans zone de saisie

Posté : mar. 24 janv. 2017 12:07
par Ramirez22
Bonjour à vous.

Merci Mikell pour ton aide et ton exemple. En effet, le code me semble moins solliciter le CPU que la version de Parazitenew (encore plus après avoir lu tes explications :lol: ).
Cela n'enlève rien aux remerciement que j'adresse également à Parazitenew pour son aide.

Avec ça, je devrais pouvoir avancer sur mon soft.

A+