existe algum jeito de mover um componente com o mouse?

Delphi

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

Salsa

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

30/11/2005

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;



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/11/2005

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


GOSTEI 0
Salsa

Salsa

30/11/2005

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


GOSTEI 0
Dedi

Dedi

30/11/2005

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


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/11/2005

declare na seção private do form:

MouseDownSpot : TPoint;
Capturing : bool;


GOSTEI 0
Salsa

Salsa

30/11/2005

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 :/


GOSTEI 0
Weber

Weber

30/11/2005

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;



GOSTEI 0
Salsa

Salsa

30/11/2005

valeu weber esse funcionou legal... brigadao :)


GOSTEI 0
Marco Salles

Marco Salles

30/11/2005

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


GOSTEI 0
Salsa

Salsa

30/11/2005

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


GOSTEI 0
Salsa

Salsa

30/11/2005

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


GOSTEI 0
POSTAR