Array
(
)

existe algum jeito de mover um componente com o mouse?

Salsa
   - 30 nov 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


Emerson
   - 30 nov 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.

#Código

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



Emerson
   - 30 nov 2005

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


Salsa
   - 30 nov 2005

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


Emerson
   - 01 dez 2005

declare na seção private do form:

MouseDownSpot : TPoint;
Capturing : bool;


Salsa
   - 02 dez 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 :/


Weber
   - 03 dez 2005

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

#Código

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



Salsa
   - 03 dez 2005

valeu weber esse funcionou legal... brigadao :)


Marco Salles
   - 03 dez 2005

no meu caso deu das duas maneiras

Talves voce deva ter esquecido de fazer isto:


Citação:
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


Salsa
   - 04 dez 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:

#Código


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


Salsa
   - 05 dez 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