Déplacer avec la souris un composant 'Tshape' [Résolu]

Signaler
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009
-
 Developpeur -
Bonjour,

J'aimerais déplacer avec la souris un composant 'Tshape' à l'exécution.

Quelqu'un peut-il m'aider ?

J'ai tenté ceci mais en vain :

const SC_DragMove = $F014; 
begin
ReleaseCapture; 
TControl(Sender).Perform(WM_SysCommand, SC_DragMove, 0);
end;

Merci
Orélien.

1 réponse

Messages postés
205
Date d'inscription
samedi 10 mai 2003
Statut
Membre
Dernière intervention
2 juin 2005
1
Tu peux soit faire du drag and drop, il y a plein de truc ici

ou

soit faire un autogestion avec le OnMouseDown, le OnMouseMove et le OnMouseUp

Exemple
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape; // A poser sur la Form1
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    x0,y0:Integer;
    Deplace:Boolean;
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  With Shape1 do begin
    OnMouseDown := Shape1MouseDown;
    OnMouseMove := Shape1MouseMove;
    OnMouseUp   := Shape1MouseUp;
  end;

  Form1.DoubleBuffered:=true; // Pour eviter le scintillement
  Deplace:=False;

end;

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Deplace:=True;
  x0:=x;
  y0:=y;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  If not (sender is TShape) then exit;
  If Deplace then with sender as TShape do begin
    Left := Left+(x-x0);
    Top  := Top +(y-y0);
  end;
end;

procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Deplace:=False;
end;

end.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape; // A poser sur la Form1
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    x0,y0:Integer;
    Deplace:Boolean;
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  With Shape1 do begin
    OnMouseDown := Shape1MouseDown;
    OnMouseMove := Shape1MouseMove;
    OnMouseUp   := Shape1MouseUp;
  end;

  Form1.DoubleBuffered:=true; // Pour eviter le scintillement
  Deplace:=False;

end;

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Deplace:=True;
  x0:=x;
  y0:=y;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  If not (sender is TShape) then exit;
  If Deplace then with sender as TShape do begin
    Left := Left+(x-x0);
    Top  := Top +(y-y0);
  end;
end;

procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Deplace:=False;
end;

end.
Bravo pour la solution. Vraiment ça marche à mon niveau super bien.