existe algum jeito de mover um componente com o mouse?

30/11/2005

eu queria colocar um componente ex um panel sei la.. onde qndo eu clickasse nele eu pudesse arrastar ele pra onde quiser....

se for panel melhor ... pra poder colocar coisas nele ex botoes dentro de uma panel e pode arrastar o panel pro lugar q eu quiser no form...

num sei se expliquei direito masss....

se alguem souber de algum componente ou alguma funçao q faça esse eskema de movimentar um componente pelo form clickando com um mouse e arrastando.. eu agradeceria... valeu :p


Salsa

Respostas

30/11/2005

Emerson

acho que esse exemplo pode te ajudar:
crie os três procedimentos abaixo e aponte os eventos OnMouseDown, OnMouseMove e OnMouseUp de todos os componentes que precisam ser movidos em run-time para a respectiva procedure.

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

// Evento OnMouseMove
procedure TForm1.ComponenteMouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
begin
  if Capturing then
    try
      TWinControl(Sender).Left:= TWinControl(Sender).Left - (MouseDownSpot.x-x);
      TWinControl(Sender).Top:= TWinControl(Sender).Top - (MouseDownSpot.y-y);
    except
    end;
end;

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



Responder Citar

30/11/2005

Emerson

esqueci de mencionar:
é preciso segurar o CTRL e clicar no componente para poder movimentá-lo.


Responder Citar

30/11/2005

Salsa

a variavel MouseDownSpot eh q tipo de variavel?
eu declaro como?


Responder Citar

01/12/2005

Dedi

veja nesta pagina: [url]http://www.forumweb.com.br/foruns/index.php?showtopic=15069&mode=linearplus[/url]


Responder Citar

01/12/2005

Emerson

declare na seção private do form:

MouseDownSpot : TPoint;
Capturing : bool;


Responder Citar

02/12/2005

Salsa

no meu nao rolou nao esse eskema de arrastar e fiz igualzinho os exemplos :( tento arrastar com o mouse ou sem o mouse como no ex do link e nada :/


Responder Citar

03/12/2005

Weber

Se for só pra mover usando o mouse tá ai:

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  TWinControl(Sender).perform(WM_SYSCOMMAND, $f012, 0);
end;



Responder Citar

03/12/2005

Salsa

valeu weber esse funcionou legal... brigadao :)


Responder Citar

03/12/2005

Marco Salles

no meu caso deu das duas maneiras

Talves voce deva ter esquecido de fazer isto:

crie os três procedimentos abaixo e aponte os eventos OnMouseDown, OnMouseMove e OnMouseUp de todos os componentes


mas sem dúvida que o codigo que o weber sugeriu é mais enxuto


Responder Citar

04/12/2005

Salsa

aproveitando a funçao to tentando fazer o seguinte....

eu to movimentando o panel com o mouse como weber explicou ... blz....
agora coloquei um botao do lado do panel.. pra qndo eu arrastar o botao ir junto... como se tivesse grudado sabe... mas nao to conseguindo fazer direito...

aqui eu arrasto e soh qndo solto o meu panel q o botao vai pra posiçao...
queria q ele arrastasse junto tb :)


o jeito q nao tah dando certo eh esse:

ReleaseCapture;
TWinControl(Sender).perform(WM_SYSCOMMAND, $f012, 0);
Botao.Left := TWinControl(Sender).Left + TWinControl(Sender).Width;
Botao.Top := TWinControl(Sender).Top;



alguem ae pode me dar um help pra fazer isso? :)

valeu!!!!


:p


Responder Citar

05/12/2005

Salsa

jah tentei colocar um Application.ProcessMessage tb e nada..

ninguem ae sabe como posso mover o panel e o botao como se eles tivessem grudados?


valeu :P


Responder Citar