Appel fonction a chaque appuis touche dans zone de saisie

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
Ramirez22
Niveau 1
Niveau 1
Messages : 5
Enregistré le : dim. 22 janv. 2017 12:16
Status : Hors ligne

Appel fonction a chaque appuis touche dans zone de saisie

#1

Message par Ramirez22 » dim. 22 janv. 2017 12:52

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

Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Contact :
Status : Hors ligne

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

#2

Message par parazitenew » dim. 22 janv. 2017 19:16

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

Ramirez22
Niveau 1
Niveau 1
Messages : 5
Enregistré le : dim. 22 janv. 2017 12:16
Status : Hors ligne

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

#3

Message par Ramirez22 » lun. 23 janv. 2017 07:29

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

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5715
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

Message par mikell » lun. 23 janv. 2017 12:37

ç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 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Contact :
Status : Hors ligne

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

#5

Message par parazitenew » lun. 23 janv. 2017 20:12

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?

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5715
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#6

Message par mikell » lun. 23 janv. 2017 21:15

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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Ramirez22
Niveau 1
Niveau 1
Messages : 5
Enregistré le : dim. 22 janv. 2017 12:16
Status : Hors ligne

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

#7

Message par Ramirez22 » mar. 24 janv. 2017 12:07

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+

Répondre