Ik ben een beetje aan het prullen met een projectje en daarbij had ik het nodig om een TShape (of welk visueel component dan ook) over een TForm (of b.v. TPanel) te slepen. Koste een beetje tijd om de juiste aanpak te vinden, dus hier mijn code die misschien behulpzaam kan zijn voor anderen.
Als eerste moeten we dus een TShape (of ander visueel component) op onze From (of Panel, of wat dan ook) plaatsen, en in mijn geval noemde ik het MijnShape.
Vervolgens hebben we een globale variable nodig om de start coordinaten op te slaan, voor wanneer we gaan slepen.
Hiervoor heb ik een TPoint gebruikt (heeft netjes X en Y) en de declaratie in de private sectie van de TForm gezet.
private
{ private declarations }
MouseOriginatePosition : TPoint;
Zet van de TShape vervolgens de property "DragMode" op "dmAutomatic".
Daarna moeten we code toevoegen aan de "
OnMouseDown" event van betreffende TShape:
procedure TForm1.MijnShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
MouseOriginatePosition.X := X;
MouseOriginatePosition.Y := Y;
end;
Ook voor het "OnMouseMove" event van de TShape hebben we wat code nodig:
procedure TForm1.MijnShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if Mouse.IsDragging then
begin
TShape(Sender).Left := TShape(Sender).Left + X - MouseOriginatePosition.X;
TShape(Sender).Top := TShape(Sender).Top + Y - MouseOriginatePosition.Y;
end;
end;
En dat is alles ... start jouw programma en test het slepen ...
Mocht je overigens niet een TShape gebruiken, pas dan de twee type-casts aan. B.v. als je een TPanel gebruikt, doe dan TPanel(Sender) in plaats van TShape(Sender).