Controler position de la souris en mouvement

Résolu
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009 - 3 juin 2009 à 13:39
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 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.

17 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
9 juin 2009 à 10:30
...
Je peux vous organiser un concours de "qui pisse le plus loin" si vous voulez.

Pour la question faudrait peut être regarder par là.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juin 2009 à 13:47
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juin 2009 à 13:49
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;
0
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009
3 juin 2009 à 14:11
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(
0

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

Posez votre question
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009
3 juin 2009 à 14:13
précisions:même erreur lorsque j'essai d'utiliser la fonction setcursor...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juin 2009 à 14:23
Essaie peut être de mettre windows dans les uses de ta form.

uses
  windows, ...;

Mais ton code ne sera plus portable linux; mac, etc...
0
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009
3 juin 2009 à 14:32
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?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juin 2009 à 14:40
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...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juin 2009 à 14:53
Sous Lazarus, tu as peut être WidgetSet.SetCursorPos.
0
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009
3 juin 2009 à 15:42
...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?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juin 2009 à 15:51
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.
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
8 juin 2009 à 15:42
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.
0
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009
9 juin 2009 à 08:29
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!
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
9 juin 2009 à 09:18
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.
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
9 juin 2009 à 10:44
0
cs_sulliwane Messages postés 12 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 9 juin 2009
9 juin 2009 à 13:07
Merci rt15, c'est exactement ce que je recherchais!

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