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

Signaler
Messages postés
12
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
9 juin 2009
-
JulioDelphi
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
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

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

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

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(
Messages postés
12
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
9 juin 2009

précisions:même erreur lorsque j'essai d'utiliser la fonction setcursor...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Essaie peut être de mettre windows dans les uses de ta form.

uses
  windows, ...;

Mais ton code ne sera plus portable linux; mac, etc...
Messages postés
12
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
9 juin 2009

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?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Sous Lazarus, tu as peut être WidgetSet.SetCursorPos.
Messages postés
12
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
9 juin 2009

...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?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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.
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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.
Messages postés
12
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
9 juin 2009

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!
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
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.
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Messages postés
12
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
9 juin 2009

Merci rt15, c'est exactement ce que je recherchais!

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