PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → ATTENDRE LA FIN DE SAISIE POUR EXECUTER LE CODE
ATTENDRE LA FIN DE SAISIE POUR EXECUTER LE CODE
Débuté par lammariom, 15 mar. 2010 00:02 - 16 réponses
Posté le 15 mars 2010 - 00:02
Bonjour
je m'excuses si le sujet a deja ete posé, mais j'ai beau chercher et j'ai rien trouver.
J'ai un champ de saisie, il va etre utilisé pour filtrer le contenu d'un fichier selon le mot clé tapé, le resultat s'affiche dans une aure fenetre juste sous le champ saisie et qui contient une table contenant biensure les resultats (un peu comme une illusion de combo), j'ai mis donc le code dans "A CHAQUE MODIFICATION"
le probleme c'est que ca fait tourner le code a chaque touche tapée, donc si le fichier contient plusieurs milliers d'enregistrement, ca va mettre un temps désagreable a attendre le resultat.
enfin bref, je voudrais savoir s'il y a dans windev une fonction automatique ou un code wlangage qui me permet d'executer mon code une fois la saisie dans le champs s'est arretée depuis 2 secondes par exemple ??
pour le moment j'utilise le "Multitache(-100)" mais ca ne donne pas un résultat confortable.
Merci a toute aide ;)

VOICI LA SECTION DU CODE EN QUESTION:

------------------------------------------
A CHAQUE MODIFICATION DE COMBO_PRODUIT
------------------------------------------
Multitâche(-100)

SELON FenEtat(FEN_TableProduitPopUp)
CAS Actif
HFiltreParMotCle(PRODUIT,"NOM_COM",MoiMême,FEN_TableProduitPopUp.TABLE_PRODUIT)
CAS Inexistant
OuvreFille(FEN_TableProduitPopUp)
FEN_TableProduitPopUp..X = MaFenêtre..X+64.8
FEN_TableProduitPopUp..Y = MaFenêtre..Y+158.5
DonneFocus(FEN_TEST.COMBO_Produit)
HFiltreParMotCle(PRODUIT,"NOM_COM",MoiMême,FEN_TableProduitPopUp.TABLE_PRODUIT)
FIN

---------------------------------
Touche Enfoncée De COMBO_PRODUIT
---------------------------------

SELON FenEtat(FEN_TableProduitPopUp)

CAS Actif
NavigationHFiltreContient(MoiMême,FEN_TableProduitPopUp,FEN_TableProduitPopUp.TABLE_PRODUIT)

CAS Inexistant

SI ToucheEnfoncée(teEchap) ALORS
MoiMême = ""

SINON
// On ouvre la fenetre fille fen_tableproduitpopup et on définie sa position
OuvreFille(FEN_TableProduitPopUp)
FEN_TableProduitPopUp..X = FenIntPosX(FEN_BulletindInformation)+172.5
FEN_TableProduitPopUp..Y = FenIntPosY(FEN_BulletindInformation)+242+23
FEN_TableProduitPopUp.COL_UNITE..Visible = Non
FEN_TableProduitPopUp.COL_LIB..Visible = Non
FEN_TableProduitPopUp.COL_NUM_ENR..Visible = Non
FEN_TableProduitPopUp..Largeur = 520
FEN_TableProduitPopUp.TABLE_PRODUIT..Largeur = 520

DonneFocus(SAI_ProduitServi)

FIN
FIN
Posté le 15 mars 2010 - 12:08
LammariOm a exposé le 14/03/2010 :
Bonjour
je m'excuses si le sujet a deja ete posé, mais j'ai beau chercher et j'ai
rien trouver. J'ai un champ de saisie, il va etre utilisé pour filtrer le
contenu d'un fichier selon le mot clé tapé, le resultat s'affiche dans une
aure fenetre juste sous le champ saisie et qui contient une table contenant
biensure les resultats (un peu comme une illusion de combo), j'ai mis donc le
code dans "A CHAQUE MODIFICATION" le probleme c'est que ca fait tourner le
code a chaque touche tapée, donc si le fichier contient plusieurs milliers
d'enregistrement, ca va mettre un temps désagreable a attendre le resultat.
enfin bref, je voudrais savoir s'il y a dans windev une fonction automatique
ou un code wlangage qui me permet d'executer mon code une fois la saisie dans
le champs s'est arretée depuis 2 secondes par exemple ??


Utilise un Timer que tu mets à 2-3 secondes.

Dans ton code de modif :
FinTimer
Timer


et dans ta procédure appelée : FinTimer dès le début.

Tant que tu taperas, le code ne sera pas déclenché, si tu attend la
durée de ton timer, le code sera déclenché.
Posté le 15 mars 2010 - 14:16
Merci de ta réponse, je vais essayer avec cette commande cette aprés-midi ;)
Posté le 15 mars 2010 - 15:59
Pourquoi ne pas utiliser simplement l'évènement Sortie de... ?

Puisque dès lors que tu frappes Tab ou Entrée, tu sors.
Posté le 15 mars 2010 - 17:11
Bonjour,

Pourquoi ne pas utiliser "Sortie de xxxxx" au lieu de "A chaque modif "???

Cordialement

Christian
Posté le 15 mars 2010 - 17:40
CHRISTIAN LANOE avait prétendu :
Bonjour,

Pourquoi ne pas utiliser "Sortie de xxxxx" au lieu de "A chaque modif "???


Parce que c'est moins "user friendly"

Voir le raffraichissement en cours de frappe c'est plus visuel.
Avec un timer on limite l'impact du raffraichissement à chaque lettre
tapée.
Posté le 15 mars 2010 - 23:21
Exacte, l'utilisateur ne sort pas du champs, il tape un mot clé du produit, et quand il s'arrete d'ecrire pendant disant une demi seconde, la fenetre s'affiche contenant le resultat dans une table, s'il rajoute une lettre le resultat se filtre aussitot et le focus reste toujours dans le chmaps de saisie, c'est l'illusion d'une combo mais en plus beau que proposé dans windev (selon moi) et plus rapide.

Merci pour vos réponses, dans 1 heure je vais essayer le timer et je vais vous tenir compte ;) !
Cordialement.
Posté le 16 mars 2010 - 07:34
Ça marche :D !!!! Merci infiniment Gilles, c'est exactement le résultat que je cherchais, j'ai jamais travaillé avec le Timer, c'est trés intélligent comme méthode, trés bien pensée bravo et encore Merci beaucoups Gilles ;) !
et merci a toutes vos réponses :)
Posté le 16 mars 2010 - 10:08
LammariOm a exprimé avec précision :
Ça marche :D !!!! Merci infiniment Gilles, c'est exactement le résultat que
je cherchais, j'ai jamais travaillé avec le Timer, c'est trés intélligent
comme méthode, trés bien pensée bravo et encore Merci beaucoups Gilles ;) !
et merci a toutes vos réponses :)


Ravi d'avoir aidé ;)
Posté le 27 mars 2010 - 18:39
Pourquoi ne pas tester la taille de la saisie? car à 1 ou 2 ou 3 carractères celà n'est pas significatif pour une base de donnée.

si taille(combo..valeur) < 2 (par exemple) alors retour

j'ai utilisé ce type de code sur des bases sql à distance et ça fonctionne bien, j'avais ammélioré la procédure en testant si le code réentais dans ma procédure (en ce cas j'annule la requete et reexecute)

les avantages sont les suivants:
1/ une seule procedure (suceptible d'etre mise dans une classe) au lieu d'avoir 3 codes séparés
2/ evite une requete sur 1 ou 2 carractere ce qui ne sert a rien
3/ controle du backspace ou modifs (en gerant la taille de la saisie)
4/cheksum selon la vitesse de la frappe de l'utilisateur (quel tempo à donner au timer?

la taille peut etre même parametrable selon la taille de la base de donnée (pour eviter la surcharge du serveur)
Posté le 27 mars 2010 - 21:06
Stoltz avait prétendu :
Pourquoi ne pas tester la taille de la saisie? car à 1 ou 2 ou 3 carractères
celà n'est pas significatif pour une base de donnée.

si taille(combo..valeur) < 2 (par exemple) alors retour

j'ai utilisé ce type de code sur des bases sql à distance et ça fonctionne
bien, j'avais ammélioré la procédure en testant si le code réentais dans ma
procédure (en ce cas j'annule la requete et reexecute)

les avantages sont les suivants:
1/ une seule procedure (suceptible d'etre mise dans une classe) au lieu
d'avoir 3 codes séparés 2/ evite une requete sur 1 ou 2 carractere ce qui ne


A priori quand un utilisateur commence à taper, il s'arrête rarement à
2 caractères.

On peut rajouter en plus ce genre de test, mais pas le substituer.
Posté le 30 mars 2010 - 16:43
Stoltz a écrit dans le message de news
...
4/cheksum selon la vitesse de la frappe de l'utilisateur (quel tempo à donner au timer?


Bonjour,

Pourrais-tu nous en dire plus sur l'utilisation de ce cheksum ?

J'utilise moi même cette technique (timer de 1/2 seconde qui est relancé à chaque fois que l'utilisateur introduit un caractère.)
Mais je suis confronté aux personnes qui tapent à 1 doigts : elle mettent en général plus de 1/2 sec entre l'intro de 2 caractères consécutifs => la recherche s'effectue à chaque caractère introduit.

Didier
Posté le 01 avril 2010 - 08:54
Bonjour
débutant en windev je n'ai pas reussi à utiliser la methode donnée par Gilles , ci dessous, avec la fonction timer

dans ma zone de saisie:
"A chaque modification " , j'ai ecris
FinTimer()
Timer(test,500)

j'ai defini une procedure "test" avec comme premiere ligne
fintimer()

mais cela ne fonctionne pas.
pourriez vous m'aider ?
Merci
Cordialement
DBro
Posté le 01 avril 2010 - 10:53
Bonjour

J'ai repris l'idee du timer est c'est excellent. J'ai codé de la façon suivante et cela fonctionne à merveille :

ds "A chaque modification":

FinTimer(1)
Timer(maproc,100,1)


et ds la procedure appelée:
FinTimer(1)
.../... le code de ma proc .../...

Bon dev

Christian
Posté le 04 avril 2010 - 12:17
merci ... j'ai reessaé et cela fonctionne.
Cordialement
DBro
Posté le 06 avril 2010 - 16:48
a la base si l'on teste une base de donnée a partir de 3 carractere ou plus , la réponse du serveur de fichier (selon la taille du fichier) est inferieure a la seconde , d'autant plus qu'il est inutile d'afficher à l'utilisateur une tartine dépassant + de 100 occurences (limiter la requete a 100 lignes pas exemple)

Au niveau du cheqsum, celà depend de l'instruction sql utilisée

sqlexecute ou wdexetute
mais l'idee de base est d'interrompre l'execution de la requette si l'utilisateur reentre dans le programme

Encore une fois je n'utilise pas de timer mais directement multitache()

si celà t'interresse t'enverai mes codes de l'époque ... suis entrain de les modifier...
Membre enregistré
4 messages
Posté le 13 juillet 2023 - 14:15
Super, merci pour les explications. J'utilise une procédure interne pour améliorer la lisibilité de mon code. Voici un exemple :
Dans l'événement 'À chaque modification' :
FinTimerSys(1)
TimerSys(pi_ModificationTimer,100,1)

PROCEDURE INTERNE pi_ModificationTimer()
FinTimerSys(1)
// Insérez le traitement à effectuer ici.
FIN