Cherche une vraie fonction Onmouseleave

Résolu
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 - 30 mai 2006 à 19:43
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 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.

7 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 mai 2006 à 22:47
GetCursorPos avec timer ...
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
31 mai 2006 à 11:12
Salut,

Pour l'économie de ressources CPU, tu pourrais déclencher Timer := Enabled dans l'évènement CMMouseLeave...

Bonne prog'
3
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
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.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
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? 
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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...

@+
Nico  { www.ni69.info }

<hr size="2" width="100%" />
N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient ! 
0
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
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.

merci encore de votre aide 
0
Rejoignez-nous