Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Lazarus/Delphi - Slepen van een TShape op een TForm

2 Berichten
1 Gebruikers
0 Reactions
1,276 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
Topic starter  

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

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
Topic starter  

Een beter leesbare en misschien nettere methode ipv bovenstaande type cast kan zijn:

procedure TForm1.MijShapeMouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
  if Mouse.IsDragging then
    with (Sender as TShape) do
      begin
        Left := Left + X - MouseOriginatePosition.X;
        Top := Top + Y - MouseOriginatePosition.Y;
      end;
end;          

   
BeantwoordenCiteren
Deel: