2010-03-04 9 views
3

Comment déplacer un cercle avec une souris dans Delphi?Comment déplacer un cercle avec la souris dans Delphi?

circle:Shape; 
+0

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? –

+0

C'est TShape. Je ne sais pas quel événement a choisi de faire bouger le cercle par la souris. – klaawz

Répondre

0

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.

6

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 ... :-)

+0

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) –

+0

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. –

5

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.

+0

Vous avez de très jolis composants sur votre site. Le travail du composant WMI est excellent. Brian. –

+0

@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 –