jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 2007
-
30 mai 2006 à 19:43
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 2007
-
1 juin 2006 à 19:20
Yo,
Actuellement, pour le programme sur lequel je bosse, j'ai le problème suivant:
je veux afficher une boite d'information quand la souris se déplace au dessus d'un composant et evidemment quand la souris n'est plus au dessus, la boite disparait.
j'ai ajouté à ce composant le code suivant trouvé sur internet pour pouvoir gérer le fait que la boite apparaisse ou disparraisse:
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
......
procedure TForm1.CMMouseEnter(var Msg: TMessage);
begin
// mon code d'affichage de la boite
end;
procedure TForm1.CMMouseLeave(var Msg: TMessage);
begin
// mon code pour cacher la boite
end;
code que l'on retrouve dans certains composants standards de Delphi.
ce composant à la propriété align à alclient.
Le problème :
quand la souris passe au dessus du composant pas de problème, la boite s'affiche. Par contre quand je déplace trop rapidement la souris à l'extérieur de ma fiche où le composant a la propriété align : alclient , alors la boite reste affiché et je suis obligé de gérer sa disparition avec un timer.
l'appel à la procédure CMMouseLeave(var Msg: TMessage) marche seulement quand je déplace lentement la souris.
Si quelqu'un avait une explication (voire la solution) à ce problème, merci d'avance à lui.
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 30 mai 2006 à 23:10
merci d'avoir regardé, c'est justement la solution que j'ai adopté, sauf que j'utilise
pointdansmonrepere := chart1.ScreenToClient(mouse.CursorPos); getcursorpos, ne marchant, apparemment et sauf erreur de ma part, qu'avec des TCHART (le chart1 que j'utilise est juste un canvas où je dessine, mais c'est pas le sujet).
ce qui me saoule, c'est de me trimbaler dans mon pgm un timer qui soit dédié à ca même quand je n'ai pas envie d'afficher la boite.
la question au final est : existe-t-il une méthode "absolue" qui évite de bouffer de la cpu a faire un test à la con toutes les 100ms par exemple pour masquer cette boite( il existe une solution qui consiste a ne pas afficher mes infos dans cette boite, mais dans un panel, mais je souhaiterais, ca fait plus "classe", garder cette boite).
s'il n'y a pas de solution miracle, je me contenterais alors de cette solution.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 31 mai 2006 à 00:38
si tu veux pas te prendre la tete ... tu fait une simple ToolBox que l'utilisateur affiche ou non, c'est bien plus simple et ça eviteras de faire des methodes wouechwouechtalulabracadabranlettedeneuronnes.
Vous n’avez pas trouvé la réponse que vous recherchez ?
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 1 juin 2006 à 00:02
En cherchant autre chose, j'ai eu une idée pour résoudre ce problème (pas encore implémenté) mais je souhaiterais votre avis, car les threads ne sont pas encore rentré dans mes habitudes:
créer un thread qui se déclenche lorsque la souris rentre sur le composant, pour surveiller la position de la souris par rapport au composant et si cette position est incompatible avec la position de la souris alors le thread renvoie l'ordre de stopper l'affichage de la boite. ca me parait plus propre qu'un timer , non?
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 1 juin 2006 à 00:34
Effectivement ce serait plus propre, mais après il faut voir ce que ça consomme au niveau CPU...
Autre alternative : il me semble que juliodelphi avait développé un composant permettant de bien exploiter la souris... Je cherche...
jace1975
Messages postés81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 1 juin 2006 à 19:20
ben finalement, la meilleure solution est celle de japee, qui consiste à mettre un nouveau timer qui se declenche on mouse enter , et qui s'arrete dès que la position de la souris n'est plus dans la zone de dessin.