Controler position de la souris en mouvement [Résolu]

cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 3 juin 2009 à 13:39 - Dernière réponse : JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention
- 9 juin 2009 à 13:47
Bonjour à tous,

je suis confronté à un problème (oh rien de bien méchant, je pense que vous n'en ferez qu'une bouchée ;o)

Je souhaite interdire à la souris de sortir d'un cadre d'un tpanel.

circonstances:

J'ai un timage que je peux déplacer avec la souris. Ainsi, à l'évenement

Tform.timageMouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);

je déplace l'image dans un panel (le panel est parent de cette image) et je souhaiterais au cours du déplacement, interdir à l'utilisateur de faire sortir la souris du cadre du tpanel.

solution? :

Je suppose donc qu'il faut rajouter un controle sur la position de la souris dans la procedure tform.timagemousemove ...mais laquelle?

Merci d'avance pour vos réponses ou suggestions!

sulliwane.
Afficher la suite 

17 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 9 juin 2009 à 10:30
+3
Utile
...
Je peux vous organiser un concours de "qui pisse le plus loin" si vous voulez.

Pour la question faudrait peut être regarder par là.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 3 juin 2009 à 13:47
0
Utile
Salut,

Pour déplacer la souris, SetCursorPos. Mais il y a peut être mieux dans ton cas, car ça risque de pas être beau visuellement.
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 3 juin 2009 à 13:49
0
Utile
ClipCursor



procedure TForm1.Button1Click(Sender: TObject);
var
  rect: TRect;
begin
  rect.Top:= 0;
  rect.Left:= 0;
  rect.Right:= 500;
  rect.Bottom:= 400;
  ClipCursor(@rect);
end;
Commenter la réponse de cs_rt15
cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 3 juin 2009 à 14:11
0
Utile
merci pour cette réponse éclaire :o)

Cependant lorsque je copie ce code le débogeur me renvoie:

"identifier not found: clipcursor"

est-ce à cause du mon programme (lazarus ?)

Cette fonction demande t-elle la déclaration d'un uses particulier?

(j'ai regardé sur le site msdn mais j'avoue ne pas y comprendre grand chose :o(
Commenter la réponse de cs_sulliwane
cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 3 juin 2009 à 14:13
0
Utile
précisions:même erreur lorsque j'essai d'utiliser la fonction setcursor...
Commenter la réponse de cs_sulliwane
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 3 juin 2009 à 14:23
0
Utile
Essaie peut être de mettre windows dans les uses de ta form.

uses
  windows, ...;

Mais ton code ne sera plus portable linux; mac, etc...
Commenter la réponse de cs_rt15
cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 3 juin 2009 à 14:32
0
Utile
j'ai rajouté windows...et là "unit window not find"

...c'est peut-être parce que je travail sur ubuntu ;o)

mince alors...setcursor et clipcursor sont réservé delphi..? c'est bizzare pourtant, car lazarus est presque la copie de delphi.

Dans tous les cas la solution existe (j'espere)...des suggestions?
Commenter la réponse de cs_sulliwane
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 3 juin 2009 à 14:40
0
Utile
Ah oui, effectivement... En fait SetCursorPos et ClipCursor ne sont pas réservés à Delphi. Ils sont réservés à Windows.

Il faudrait donc plutôt passer par autre part... Peut être que Lazarus propose une fonction toute faite dans sa librairie (On peut rêver).
Sinon je suppose que ton Lazarus utilise GTK en interne pour l'interface graphique. Peut être qu'une fonction GTK fait le boulot.
Et sinon, couche encore plus basse, il reste le X11 qui est la couche de base pour les interfaces graphiques Unix/Linux.

En X11, la fonction pour déplacer le curseur est XWarpPointer. Mais je ne sais pas comment interagir avec la couche X11 depuis Lazarus...
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 3 juin 2009 à 14:53
0
Utile
Sous Lazarus, tu as peut être WidgetSet.SetCursorPos.
Commenter la réponse de cs_rt15
cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 3 juin 2009 à 15:42
0
Utile
...j'ai crié de joie (enfin presque) lorsque tu m'as trouvé cette jolie fonction

...et j'ai faillit désinstaller lazarus lors du message:

"widgetset identifier not found".... :o(

mais bon là c'est pas normal, c'est censé être de fonction lazarus (au passage, bravo pour la trouvaille)

pourquoi sur la page, les fonctions ressemblent à ça:

procedure TMouse.SetCursorPos(AValue : TPoint);
begin
WidgetSet.SetCursorPos(AValue.X, AValue.Y);
end;

Qu'est-ce que Tmouse ? faut-il faire une manipulation particulère avant d'utiliser widgetset.setcursorpos(X,Y); ?

lorsque j'écrit la procedure ci-dessus, le message est:
"unit1.pas(206,18) Error: overloaded functions have the same parameter list"

bref....je suis perdu là (d'autant que mes connaissance sont assez pauvres en pascal)

merci pour ton aide...qu'en penses tu?
Commenter la réponse de cs_sulliwane
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 3 juin 2009 à 15:51
0
Utile
Bin tu peux utiliser une TMouse, une souris quoi.

Quelque chose comme ça :

var
  mouse: TMouse;
  pos: TPoint;
begin
  mouse:= TMouse.Create();
  pos.X:= 200;
  pos.Y:= 200;
  mouse.SetCursorPos(pos);
  mouse.Free();
end;

Il te faut peut être une unité particulière dans tes uses pour utiliser directement WidgetSet.
Commenter la réponse de cs_rt15
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 8 juin 2009 à 15:42
0
Utile
Moi j'ai ri avec :
j'ai rajouté windows...et là "unit window not find"

Petit zoom :
j'ai rajouté windows...et là "unit window not find"

Allez pour ceux qui ont toujours rien compris : WINDOWS =/= WINDOW

Et pour ceux qui sont en train de ramper de mal de tête à essayer de déchiffrer mon énigme :
WINDOWS prends un S,  tu as écrit "WINDOW" c'est pourtant clair comme message ...

Merci, j'ai bien ri.
Commenter la réponse de JulioDelphi
cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 9 juin 2009 à 08:29
0
Utile
Merci pour le cours magistrale, je t'ai toujours admiré en secret (pour tes posts tellement intelligents) je n'en suis que plus admiratif en lisant cette réponse constructive (pas besoin de préciser également ta finesse d'esprit, elle brille déjà par son absence).

Bref, donc question destinée au non-troll:

Toujours dans les controles de la souris, je souhaite la faire disparaitre au survol d'un timage.

Pour cela j'ai essayé de faire "timage.cursor:=Crnone" ou même n'importe quel autre type de flèche, rien de ne se passe (la souris n'a pas le moindre soubresaut)

tandis que si je change le type de curseur pour la forme de mon application, le curseur est modifié au survol des zones Tform, et reviens en position normale lorsqu'elle est au dessus d'un bouton ou d'un image...

Avez vous des idées? Je reprécise que je travail sous lazarus (linux), la fonction setcursor ou même showcursor n'est pas trouvée (peut-être est-ce mon UNIT WINDOWS ;o)

Merci d'avance!
Commenter la réponse de cs_sulliwane
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 9 juin 2009 à 09:18
0
Utile
Aucun problème !
"je t'ai toujours admiré en secret (pour tes posts tellement
intelligents)" : remarque que quand je poste, soit c'est pour dire "lis le règlement boulet" ou alors je réponds vraiment à la question. Il m'arrive aussi de me tromper en répondant ce qui ne veux pas dire que je suis un imbécile ^^
"je n'en suis que plus admiratif en lisant cette réponse
constructive" : non, ce n'est pas une réponse constructive, juste j'ai ri en lisant ça, tellement drôle sans le faire expres ^^
"(pas besoin de préciser également ta finesse d'esprit,
elle brille déjà par son absence)." : briller par son absence ... comment ça peut briller si ce n'est pas présent ... aucune idée ^^
Allez bonne journée
ps : crNone et non pas Crnone même si c'est "la même chose" c'est tout de même différent niveau lecture de code. Si tu ne comprends pas la différence, tu as un problème de compréhension du langage.
Commenter la réponse de JulioDelphi
Commenter la réponse de JulioDelphi
cs_sulliwane 12 Messages postés vendredi 29 mai 2009Date d'inscription 9 juin 2009 Dernière intervention - 9 juin 2009 à 13:07
0
Utile
Merci rt15, c'est exactement ce que je recherchais!

ps: pisser loin encore c'est pas trop dur, pisser haut en revanche..
Commenter la réponse de cs_sulliwane
JulioDelphi 2354 Messages postés dimanche 5 octobre 2003Date d'inscription 18 novembre 2010 Dernière intervention - 9 juin 2009 à 13:47
0
Utile
Pareil que "il faut éviter de péter plus haut que son cul, on risque de se faire un trou entre les vertèbres" ? ^^
Commenter la réponse de JulioDelphi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.