PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Evenement
Evenement
Débuté par David, 06 juin 2023 17:18 - 10 réponses
Posté le 06 juin 2023 - 17:18
Bonjour,

J'aimerai utiliser la fonction Evénement() pour connaître la modification d'un état d'un champ.
Je n'arrive pas à trouver le message windows qui permet de détecter la modification d'un état d'un champ ?

Sinon existe-t-il une autre manière de détecter la modification d'un état d'un champ d'une fenêtre ?
Exemple SAI_NOM..Etat = Actif qui passe à SAI_NOM..Etat = Grisé

Merci de vos retour
Membre enregistré
186 messages
Posté le 06 juin 2023 - 19:48
Bonjour,

avec un timer qui surveille le changement de l'état ?
Ex :
Procedure ScanneEtat()

gnNumTimer = TimerSys("ScanneEtat",5 s)

SI gnNumTimer = 0 ALORS

Erreur ("Timer non créé")

SINON

SELON SAI_NOM..Etat
CAS Actif : //faire
CAS Grisé : //faire
//Ect..
FIN
FIN
Message modifié, 06 juin 2023 - 19:48
Membre enregistré
397 messages
Popularité : +13 (13 votes)
Posté le 06 juin 2023 - 22:48
Bonsoir,

Dans ce cas précis de détection de l'état d'un champ de saisie, il devrait être possible de surcharger la propriété ..Etat et d'effectuer le traitement que vous souhaitez dans la partie Ecriture de la propriété.

// Récupération de la propriété Etat
Procedure Etat()

// On renvoie simplement l'état (natif) du champ de saisie
RENVOYER MoiMême..Etat

// Affectation de la propriété Etat
Procedure PUBLIQUE Etat(Valeur)

// Traitement factice, faire ici ce que l'on veut
Trace("nouvel etat",Valeur)

// Bien penser à mettre à jour l'état du champ de saisie pour refléter le changement dans l'UI
MoiMême..Etat = Valeur
Posté le 07 juin 2023 - 10:15
Bonjour,

L'idée est bonne, j'ai déjà surchargé une Fonction WLangage, mais une propriété, je ne sais pas si c'est possible.

Merci
Posté le 07 juin 2023 - 10:17
Bonjour,

Merci de la réponse, mais j'évite d'utiliser les timers qui peuvent prendre de la ressource système, pour rien.

Cordialement
Membre enregistré
450 messages
Popularité : +31 (43 votes)
Posté le 07 juin 2023 - 10:36
Bonjour

Peut être une piste avec les groupes ? mettre 2 champs de saisie dans un groupe appelé GR_saisie par exemple et ensuite faire un test sur GR_saisie.modifie = vrai

je m'en sert pour éviter d'ajouter un bouton enregistrer et de proposer automatiquement à l'utilisateur d'enregistrer que si il y'a eu des modifications

cdlt

DG
Message modifié, 07 juin 2023 - 10:39
Membre enregistré
397 messages
Popularité : +13 (13 votes)
Posté le 07 juin 2023 - 14:46
David a écrit :
Bonjour,

L'idée est bonne, j'ai déjà surchargé une Fonction WLangage, mais une propriété, je ne sais pas si c'est possible.

Merci


Ma proposition tient techniquement (il est tout à fait possible de surcharger la propriété Etat d'un champ de saisie), j'ai même re-testé sur WinDev 28 avant de poster ici.

Mon usage du conditionnel était surtout parce que je ne sais pas si ça répond exactement à votre problématique, et je n'ai pas testé si cela marche "tout le temps" : par exemple, si le champ fait partie d'un groupe et que c'est le groupe qui est grisé. C'est principalement cela qu'il faudra vérifier.
Posté le 08 juin 2023 - 13:52
Merci de ta réponse

En effet ça fonctionne bien si tu surcharges la propriété de chaque champ
Mais je ne peux pas modifier tous les champs et toutes les fenêtres de mon projet

Je continue d'investiguer
Membre enregistré
397 messages
Popularité : +13 (13 votes)
Posté le 08 juin 2023 - 18:45
Donc si je comprends bien : vous cherchez à détecter l'instant où un champ (n'importe lequel) dans n'importe quelle fenêtre passe en grisé ? Et ce si possible sans avoir à modifier chacun des champs concernés.

Cela semble assez tordu, et même si on peut sortir les EnumèreChamp() et les TimerSys() pour faire le taf, ça risque de bouffer un paquet de performances en fonction du degré de réactivité que vous souhaitez.

Donc, si on en revenait d'abord aux bases : quel est le but recherché d'une telle fonction ? Mettons qu'on arrive à une fonction qui fasse ça correctement, qu'est-ce qu'elle va faire du résultat ?

En fonction de cela il y a peut-être une solution complètement différente qui pourrait satisfaire.
Posté le 12 juin 2023 - 09:43
bchanudet a écrit :
Donc si je comprends bien : vous cherchez à détecter l'instant où un champ (n'importe lequel) dans n'importe quelle fenêtre passe en grisé ? Et ce si possible sans avoir à modifier chacun des champs concernés.

Cela semble assez tordu, et même si on peut sortir les EnumèreChamp() et les TimerSys() pour faire le taf, ça risque de bouffer un paquet de performances en fonction du degré de réactivité que vous souhaitez.

Donc, si on en revenait d'abord aux bases : quel est le but recherché d'une telle fonction ? Mettons qu'on arrive à une fonction qui fasse ça correctement, qu'est-ce qu'elle va faire du résultat ?

En fonction de cela il y a peut-être une solution complètement différente qui pourrait satisfaire.


Bonjour

C'est une gestion de droits que j'ai mis sur les fenêtres.
Chaque champ à un droit et à chaque modification de l'état d'un champ, qu'il soit par l'utilisateur ou par le programme, une procédure est lancée et met en grisé le champ si l'utilisateur n'a pas le droit.

Cette méthode fonctionnait bien avec l'événement de Windows WM_ERASEBKGND
A chaque modification graphique d'un champ une procédure était appelée et me permettait de mettre à jour le champ mais en Windev 28, ça ne fonctionne plus correctement.

Merci de votre aide

Bonne journée
Membre enregistré
3 889 messages
Popularité : +227 (347 votes)
Posté le 12 juin 2023 - 11:52
Bonjour,
Si j'ai bien tout compris, tu crées un groupware perso.
Si c'est le cas, fouille dans le code des fonctions gpu_XXX ou dans celui des fenêtres, tu devrais trouver ton bonheur.

Note : On trouve les fonctions gpu_XXX dans le composant interne créé lors de l'utilisation du GPW en manuel (le retour à l'option sans GPW conserve ce composant.)

--
Il y a peut être plus simple, mais, ça tourne