PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Problème avec des traitements dans la prise de focus d'une fenêtre
Problème avec des traitements dans la prise de focus d'une fenêtre
Débuté par Fabrice, 12 juil. 2019 16:46 - 10 réponses
Posté le 12 juillet 2019 - 16:46
Bonjour à toutes et à tous.

Je travaille sur un projet donc le menu exécute du code dans la partie "Prise de focus".

Lorsque qu'une option est sélectionnée sur ce menu, une nouvelle fenêtre de saisie s'ouvre.
Le menu est donc grisé et n'est plus actif.

Si je lance une autre application (client mail, bureautique, etc …) alors mon projet n'est plus visible … normal puisqu'une autre application est lancée devant.
Lorsque je clique sur l'icône de mon projet sur la barre des tâches alors mon projet revient au 1er plan et le code présent dans la partie "Prise de focus" du menu s'exécute (???).

Le menu étant grisé (puisqu'une fenêtre de saisie est toujours ouverte) comment se fait-il que le code s'exécute ?

Comment peut-on faire pour que ce code ne s'exécute que lorsque le menu récupère réellement le focus ?

Merci par avance pour votre aide.
Posté le 13 juillet 2019 - 18:02
Bonjour,

Peut être avec la fonction FenPrécédente() à placer dans le code de prise de focus de la fenêtre.

SI FenPrécédente() ~= "nomdelafenêtre" ALORS
...
FIN


https://doc.pcsoft.fr/fr-FR/?3038014

Alain
Posté le 15 juillet 2019 - 09:37
Bonjour.

Merci pour votre réponse mais la fonction renvoie dans tous les cas le nom du menu … qu'il ait le focus ou qu'une (ou plusieurs) fenêtre(s) soi(en)t ouverte(s) par dessus.
Membre enregistré
54 messages
Popularité : +5 (5 votes)
Posté le 15 juillet 2019 - 09:57
Bonjour,
Pourquoi ne pas mettre votre code de prise de focus du menu dans la partie Prise de focus de la fenêtre que le menu ouvre, qui elle n'est pas grisée.

Vous pouvez faire dans la prise de focus de la fenetre ouverte par le menu : ExecuteTraitenement(Menu,trtPriseFocus)
Message modifié, 15 juillet 2019 - 09:59
Membre enregistré
54 messages
Popularité : +5 (5 votes)
Posté le 15 juillet 2019 - 10:04
Réponse à coté de la plaque, j'avais pas bien lu le sujet, désolé.
Posté le 15 juillet 2019 - 10:18
Bonjour.

Mon problème est que ce code ne doit s'exécuter que lorsque l'utilisateur revient sur le menu.
C'est pour cette raison qu'il n'est que dans la prise de focus du menu.
Ce code sert à actualiser des données affichées sur le menu. Ces données évoluent en fonction des saisie effectuées dans les traitements appelés depuis le menu.

Si un traitement de stat (relativement long) est lancé et que l'utilisateur passe sur son application de bureautique et qu'il revient sur le projet pour voir si le traitement est terminé, il provoque assez souvent un plantage, car le code de prise de focus du menu s'effectue et les mêmes fichiers sont lus par le traitement de stat et le code de prise de focus du menu.

Le message d'erreur est le plus souvent "Aucun parcours n'a été amorcé pour la rubrique xxxxxxx sur le fichier yyyyyyy".
Membre enregistré
54 messages
Popularité : +5 (5 votes)
Posté le 15 juillet 2019 - 10:46
Une vérification si la fenêtre est grisée avant l’exécution du code "Prise de focus" du menu peut être une solution peut être ?

SI PAS MoiMême..grisé ALORS
//Code prise focus
FIN
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 15 juillet 2019 - 11:04
Bonjour Fabrice,

l'exécution du traitement de prise de focus de la fenêtre principale alors qu'une autre fenêtre est ouverte arrive oui.
Pour palier à ce genre de soucis pour votre utilisation, il faut contrôler dans votre code de prise de focus de la fenêtre principale si il n'y a pas d'autre fenêtre ouverte, et n'exécuter votre code que si il n'y a qu'une seule fenêtre ouverte.

il y a la fonction NombreFenêtre() qui vous renvoie le nombre de fenêtre, mais perso j'ai eu quelques soucis avec ^^
Du coup, je stock les fenêtres du projet au démarrage dans un tableau avec EnumèreElément(enumFenêtre)

Puis j'ai créé une petite fonction qui va remplacer NombreFenêtre() ,
Elle reprend le tableau des fenêtres, et va contrôler leur état , si l'état est différent de inexistant alors on incrémente un compteur.


// var globale
vgp_fenetres_projet est un tableau de chaîne



// fonction pour charge les fenêtres au démarrage
Procedure Chargement_Fenetre_Projet()
_fen est une chaîne=EnumèreElément(enumFenêtre)
TANTQUE _fen<>""
Ajoute(vgp_fenetres_projet,_fen)
_fen=enumerelement()
FIN


Et enfin une fonction de test à ajouter à votre code de prise de focus

Procedure IHM_Nb_Fenetre_Ouverte() : entier
_nb_fen est un entier=0
pour TOUT _fen de vgp_fenetres_projet
SI FenEtat(_fen)<>Inexistant ALORS _nb_fen++
FIN
RENVOYER _nb_fen



// PRISE DE FOCUS
SI IHM_Nb_Fenetre_Ouverte()=1 ALORS
// Lancer l'exécution de votre code uniquement si il n'y a qu'une seul fenetre
FIN
Posté le 16 juillet 2019 - 12:29
Bonjour.

Merci pour votre réponse.
Du coup je vais partir sur cette piste.
Posté le 16 juillet 2019 - 15:54
Re-bonjour Christophe.

J'ai mis en place le mécanisme avec le tableau listant les fenêtres du projet et j'ai constaté que le code de prise de focus de mon menu s'exécutait quand même (???)

J'ai ajouter un info(sNomFenetre) dans la procédure contrôlant les fenêtres ouvertes et la fenêtre n'est plus visible à l'écran mais son état est encore différent de "Inexistant".

C'est comme si le code dans la prise de focus du menu s'exécutait dès que la fenêtre commençait à se fermer (plus visible à l'écran) mais que la fermeture n'était pas complètement terminée.
Posté le 16 juillet 2019 - 16:26
C'est encore moi.

Le mécanisme fonctionne pour un projet en WinDev24 mais pas pour un projet en WevDev16.

Or j'ai les 2 (avec le même fonctionnement).