roud59
Messages postés99Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention26 juillet 2007
-
25 oct. 2005 à 16:14
roud59
Messages postés99Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention26 juillet 2007
-
27 oct. 2005 à 10:27
Bonjour à tous
Voila mon problème : à l'arrivée de certains évènements (sur la liaison série par exemple), mon application ouvre une fenêtre modale dans laquelle l'utilisateur doit saisir des informations. Si un autre évènement arrive, une deuxième fenêtre modale est crée (c'est voulu) mais la première fenêtre perd le focus (et çà ce n'est pas voulu). L'utilisateur doit alors compléter et fermer la fenêtre 2 avant de finir de compléter et de fermer la fenêtre 1.
Pour résoudre ce problème lors de la création d'une fenêtre modale, mon application :
1) regarde si une fenêtre modale a le focus
2) crée une nouvelle fenêtre modale et lui passe un pointeur vers la fenêtre modale précédente
3) une fois la nouvelle fenêtre crée et dessinée, elle tente de rendre active la fenêtre précédente dont elle a eu le pointeur
Pour 3), j'ai testé SetFocus, SetForeground, .... La fenêtre précédente se remet bien au dessus mais n'a pas le focus.
Quelqu'un aurait-il une idée ou une solution ?
Merci d'avance de votre aide
roud59
Messages postés99Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention26 juillet 20072 25 oct. 2005 à 17:01
Merci pour ta réponse fOxi
Je pense que le pannel n'est pas adapté car les fenêtres sont assez grandes, et je voudrais qu'elles soient supperposées.
J'ai pensé à uiliser des fenêtres non modales mais ceci me pose d'autres soucis :
- je veux à tout prix que l'utilisateur lise la fiche, réponde à la question et valide (c'est une fenêtre alarme) et ne puisse rien faire d'autre. Il faudrait donc désactiver toutes les autres fenêtres de l'application qui ne sont pas d'alarme
- l'information arrive par liaison série ou par modem ou par socket tcp/ip chacun dans des threads séparés. Comme l'affichage se fait dans le thread principal, le ShowMessage facilite grandement la synchronisation des threads. Si j'utilise une fenêtre non modale, il faut renvoyer la réponse de l'utilisateur au thread qui a reçu l'évènement et compliquer mes threads et mon application.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 25 oct. 2005 à 17:31
mmm en gros ... avec ton systeme l'appli est bloquée tant qu'il n'y a pas eu de reponse de la part de la fenetre modal.
et en cas de flood du a un bug ... l'utilisateur vas se retrouver avec des dizaines de fenetres a l'ecran...
si j'exagere un peu... ^^
ça me parait un peu redondant comme methode.
bon deja, peut importe de ou arrive le message, le resultat est qu'un message arrive.
> pouf j'ouvre une fenetre que l'utilisateur doit remplir.
> mais plop, une nouvelle fenetre arrive faisant perdre le focus a celle ouverte.
> l'utilisateur tolerant remplis cette deuxieme fenetre (alors que l'autre attend toujours)
> mais plop plop, une troisieme fenetre arrive faisant perdre encore le focus a la deuxieme..
> l'utilisateur exasperer desinstall ton appli et cherche une alternative.
conclusion > appli mal concue.
non je pense qu'il faut, coter serveur, empecher l'envois tant qu'une tache est en cours.
lui mettre un Wait en gros.
meme si cela doit complexifier le serveur.
mais a mon humble avis, ce serat moins dur a faire que de developer un systeme tirer par les cheveux qui au final
serat plus complexe et lourd qu'une amelioration du serveur.
mais je pense qu'il vaut mieux se prendre la tete a developper un truc qui serat simple d'utilisation que de faire l'inverse.
car tu seras d'accord avec moi, y'a rien de plus exasperant qu'une application qui fonctionne de maniere irradique et illogique.
maintenant ... trouver la bonne methode a appliquer.
et si tu utiliser un PageControl ? tu pourrais jouer avec la propriete
"Visible" des pages tout en restant dans une modal qui recevrais a la
chaine les messages du serveur.
vois le probleme comme cela, deux personne se rencontre en ville.
normalement la rencontre se ferat comme cela :
client - bonjour
serveur - tiens salut! comment ça va ?
client - ca va bien et toi ?
serveur - bien bien! quoi de neuf ?
client - oh pas grand chose ... et toi ?
tu vois chaque question est traitée l'une aprés l'autre ...
prenons maintenant la meme situation mais avec ton programme voila ce qui ce passe :
client - bonjour !
serveur
- tiens salut ! ca va ? moi ça va ! quoi de neuf ? moi pas grand chose
! t'as vus a la tele hier soir ? pfff il abuse serieux ! franchement
dans quel monde on vie! moi je serais eux ... blablalblablalb...
client - ... O_o ...
faut eviter de faire un serveur "petasse" qui laisseras pas le temps au client de parler.
roud59
Messages postés99Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention26 juillet 20072 27 oct. 2005 à 10:27
Bonjour fOxi
Mon système est un peu plus complexe car :
- j'ai (actuellement) 3 serveurs tcp/ip
- j'ai plus de 1200 'serveurs modem' qui ne sont pas des PC mais des petites cartes électronique avec un petit microcontrolleur et un petit modem.
- je gère des pannes (pas très urgentes) mais aussi des demandes de secours (franchement urgent). Et il ne faut pas que le demande de secours soit retardé parce que l'utilisateur prend son temps à aquitter une panne.Heureusement je ne reçois pas 10 alarmes en même temps en permanence, mais 2 alarmes simultanées peuvent arriver de temps en temps.
Je viens de consulter les utilisateurs, ils souhaitent une fenêtre par alarme, dont la couleur indique l'importance.
Pour ces fenêtres, j'ai donc 2 solutions : modale ou non. La modale m'arrange car le code est très simple mais j'ai le problème objet de mon post. Et comme je n'ai pas de réponse satisfaisante (excuse moi), je vais m'orienter vers les fenêtres non modales. Comme ça se situe dans un thread, je peux attendre sans bloquer le thread principal. Et puis mon nombre de fenêtres sera limité par mon nombre de threads (nombre de modem de réception + nombre de clients IP connectés). Si ça fonctionne, je ferai un post.
Merci quand même de tes réponses : elles m'ont permis de me demander s'il n'y avait pas d'autres manière de faire et de demander l'avis les utilisateurs sur ce sujet