Comment déplacer un cercle avec une souris dans Delphi?Comment déplacer un cercle avec la souris dans Delphi?
circle:Shape;
Comment déplacer un cercle avec une souris dans Delphi?Comment déplacer un cercle avec la souris dans Delphi?
circle:Shape;
Eh bien, je n'ai pas trop aller, mais ayant quelque chose se déplacer pour suivre la souris fonctionne généralement comme ceci:
Demandez quelque part un drapeau « IsFollowingMouse ». Allumez-le quand vous devriez suivre la souris. sur l'événement MouseMove du formulaire, faire quelque chose comme ceci:
procedure TMyForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FIsFollowingMouse then
begin
myCircle.left := x + fShapeOffsetX;
myCircle.top := y + fShapeOffsetY;
end;
end;
Les décalages sont variables que vous utilisez qui donne la différence entre l'emplacement du pointeur de la souris et le coin supérieur gauche de la TShape.
Assurez-vous de convertir les coordonnées du client Mouse X, Y que vous obtenez de MouseMove sur votre Control au client Parent en utilisant ClientToScreen
et ScreenToClient
.
La procédure suivante déplace le centre d'un contrôle au point (X, Y), il coordonne son client:
procedure MoveControl(AControl: TControl; const X, Y: Integer);
var
lPoint: TPoint;
begin
lPoint := AControl.Parent.ScreenToClient(AControl.ClientToScreen(Point(X, Y)));
AControl.Left := lPoint.X - AControl.Width div 2;
AControl.Top := lPoint.Y - AControl.Height div 2;
end;
Maintenant pour déplacer votre TShape quand quand vous cliquez dessus, vous devez fournir les renseignements suivants gestionnaire d'événements MouseMove:
procedure TForm1.ShapeToMoveMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then // only move it when Left-click is down
MoveControl(Sender as TControl, X, Y);
end;
Et pour le tester, déposez un bouton dans votre formulaire avec ce code:
procedure TForm1.ButtonTestClick(Sender: TObject);
begin
with TShape.Create(nil) do
begin
Name := Format('ShapeToMove%d',[Self.ControlCount + 1]);
Parent := Self; // Parent will free it
Shape := stCircle;
Width := 65;
Height := 65;
OnMouseMove := ShapeToMoveMouseMove;
end;
end;
Maintenant, c'est un exemple minimaliste, mais il devrait vous aider à démarrer.
Pour le plaisir, accrochez simplement d'autres contrôles avec ce gestionnaire d'événements MouseMove ... :-)
Je pensais que le 'propriétaire' l'a libéré, le parent passe des messages, comme wm_paint. Je changerais le constructeur pour créer (auto) –
Le propriétaire ou le parent le libérera, celui qui tire en premier. Si c'est purement visuel, vous pouvez laisser le travail au parent, c'est son rôle. –
Si vous allez à ma page Web, vous pouvez trouver des exemples (tous avec le code inclus) qui peuvent vous aider à propos de cette question. "Sample for visual work with figures and plans"; Utilisez deux composants pour gérer, déplacer, redimensionner et enregistrer des éléments visuellement; Un pour la sélection, le mouvement, le redimensionnement, ... (TSeleccOnRuntime) et d'autres (TSaveComps) pour sauvegarder l'état (position, taille, ...). alt text http://neftali-mirror.site11.com/images/imagen_ej_restaurante.png
Select Shapes Visually; Échantillon pour expliquer deux modes pour sélectionner visuellement des formes et des images.
Create, move and resive controls on Runtime (like IDE); Un autre exemple de composant TSeleccOnRuntime. Simuler et IDE.
alt text http://neftali-mirror.site11.com/images/image_ej_form_designer.png
Et enfin un autre échantillon pour Create/destroy components in runtime and move with mouse; Cet échantillon est fait sans composants. Tout le code à l'échantillon.
alt text http://neftali-mirror.site11.com/images/imagen_ej_mover_mouse.png
J'espère que vous est utile pour.
Cordialement
P.D: Excuse pour mon mauvais anglais.
Vous avez de très jolis composants sur votre site. Le travail du composant WMI est excellent. Brian. –
@Neftali: Voudriez-vous regarder ma question ci-dessous s'il vous plaît? http://stackoverflow.com/questions/2386169/how-to-find-available-parallel-ports-and-their-i-addresses-using-delphi-and-wmi –
Combien vous avez jusqu'à présent? Le cercle est-il représenté par un composant 'TShape', ou est-ce quelque chose que vous dessinez pour vous-même sur un objet canvas plus grand? –
C'est TShape. Je ne sais pas quel événement a choisi de faire bouger le cercle par la souris. – klaawz