Movimentando Objetos com mouse em Runtime

Delphi

18/06/2007

aguem ai sabe como implementar a possibilidade de mover por exemplo um TShape quando precionar o mouse sobre ele, e mover o mouse?

eu estou colocando no evendo onmousedowm uma variavel, dai quando seto ela true significa q posso mover, e no onmouseup eu seto ela como false.

porem o q esta dando problema eh no mover ele:

procedure TFMain.ObjetoMovMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
    if not (mover) then
     begin
         Exit;
     end;
    with ObjetoMov do
     begin 
         left := left + X;
         top := top + Y;
     end;
end;



o problema ta q para baixo funciona mais ou menos, e para cima não funciona, pois o valor eh sempre de incrementação, entao vi q dessa forma nunuca funcionara, tentei analizar se o X eh menor q o X atual, salvando o X numa variavel, n adianto tmbm..
se alguem poder me da uma luz..

vlw


Nightshade

Nightshade

Curtidas 0

Respostas

Nightshade

Nightshade

18/06/2007

Como mover um componente em Run-time
No exemplo abaixo deve ser incluído um componente Button. Para testar este exemplo mantenha a tecla CTRL pressionada clique com o mouse no componente Button. Feito isto, basta arrastar o componente Button para qualquer lado.

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
MouseDownSpot : TPoint;
Capturing : bool;
end;
var
Form1: TForm1;

implementation
{$R *.DFM}

// Evento OnMouseDown do Form
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then begin
SetCapture(Button1.Handle);
Capturing := true;
MouseDownSpot.X := x;
MouseDownSpot.Y := Y;
end;
end;

// Evento OnMouseMove do Form
procedure TForm1.Button1MouseMove(Sender:
TObject; Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
Button1.Left:= Button1.Left-(MouseDownSpot.x-x);
Button1.Top:= Button1.Top - (MouseDownSpot.-y);
end;
end;

// Evento OnMouseUp do Form
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Capturing then begin
ReleaseCapture;
Capturing := false;
Button1.Left := Button1.Left - (MouseDownSpot.x -x);
Button1.Top := Button1.Top - (MouseDownSpot.y - y);
end;
end;


GOSTEI 0
Nightshade

Nightshade

18/06/2007

axo q resolvi.. vou testar :D


GOSTEI 0
Roberto

Roberto

18/06/2007

olá, estou usando o delphi 10.2 e gostaria de fazer um objeto mover, conseguiu a solução? vi algumas soluções, mas em quase todas usam o mouseCapture e não entendo pq o meu delphi não reconhece.
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

18/06/2007

MouseCapture faz parte da unit Controls (ou vcl.Controls para Delphi's novos).
Veja um exemplo que testei arrastando uma imagem em runtime no form:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Imaging.jpeg, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
    procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
  private
    { Private declarations }
    FDownX, FDownY: Integer;
    FDragging: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

type
  TMoveCracker = class(TControl);

procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  FDownX := X;
  FDownY := Y;
  FDragging := True;
  TMoveCracker(Sender).MouseCapture := True;
end;

procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if FDragging then
    with Sender as TControl do
    begin
      Left := X - FDownX + Left;
      Top := Y - FDownY + Top;
    end;
end;

procedure TForm1.ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  if FDragging then
  begin
    FDragging := False;
    TMoveCracker(Sender).MouseCapture := False;
  end;
end;

end.


Neste link, tem o código:
http://www.swissdelphicenter.ch/en/showcode.php?id=429

Neste link, tem um demo já pronto, baixa aí e teste:
http://www.swissdelphicenter.ch/en/demodownload.php?id=429
GOSTEI 0
POSTAR