Array
(
)

TImage - Arrastar pelo form

Janete
   - 23 ago 2004

Estou tentando mover um TImage pelo form e quase dá certo, é q fica meio estranho eu consigo arrastar só q não consigo deixar o componente exatamente no ponto q eu quero quando solto o mouse, será q falta alguma coisa para funcionar corretamente, estou fazendo assim:
Vamos lá!

DragMode do form e coloquei dmAutomatic

evento onDragOver do form:
if(Source is TImage)then
Accept := True;

evento onEndDrag da Image coloquei:

Image1.Top := Y;
Image1.Left := X;

na realidade eu queria poder arrastar somente em cima de um outro TImage q está em baixo, então tentei colocar no lugar do evento OnDragOver do Form colocar no mesmo evento só q o do segundo TImage q tenho no form, mais fica do mesmo jeito

já pesquisei pelo forum e foi esse exemplo q achei, foi o q deu mais certo mais não totalmente, então se alguém souber como fazer e puder me ajudar eu agradeço


Beppe
   - 23 ago 2004

Vê se isso resolve:
#Código

Image1.Left := X - (ScreenToClient(Mouse.CursorPos).X - Image1.Left);
Image1.Top := Y - (ScreenToClient(Mouse.CursorPos).Y - Image1.Top);



Janete
   - 23 ago 2004


Citação:
Vê se isso resolve:
#Código

Image1.Left := X - (ScreenToClient(Mouse.CursorPos).X - Image1.Left);
Image1.Top := Y - (ScreenToClient(Mouse.CursorPos).Y - Image1.Top);


Obrigado pela sugestão, mas não deu certo


Ipc$
   - 23 ago 2004

Não sei se resolve seu problema, mas esse código arrasta p/ qualquer lugar do Form e se vc quiser delimitar a área de arrasto, vc implementa no código. Desabilite os eventos de Drag.
#Código


var ClicouNaImagem:Boolean; iLeft,iTop:Integer;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button <> mbLeft then
Exit;
ClicouNaImagem := true;
iLeft := Mouse.CursorPos.x;
iTop := Mouse.CursorPos.y;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not ClicouNaImagem then
Exit;
Image1.Left := Image1.Left - iLeft + Mouse.CursorPos.x;
Image1.Top := Image1.Top - iTop + Mouse.CursorPos.y;
iLeft := Mouse.CursorPos.x;
iTop := Mouse.CursorPos.y;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ClicouNaImagem := false;
end;



Janete
   - 23 ago 2004


Citação:
Não sei se resolve seu problema, mas esse código arrasta p/ qualquer lugar do Form e se vc quiser delimitar a área de arrasto, vc implementa no código. Desabilite os eventos de Drag.
#Código


var ClicouNaImagem:Boolean; iLeft,iTop:Integer;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button <> mbLeft then
Exit;
ClicouNaImagem := true;
iLeft := Mouse.CursorPos.x;
iTop := Mouse.CursorPos.y;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not ClicouNaImagem then
Exit;
Image1.Left := Image1.Left - iLeft + Mouse.CursorPos.x;
Image1.Top := Image1.Top - iTop + Mouse.CursorPos.y;
iLeft := Mouse.CursorPos.x;
iTop := Mouse.CursorPos.y;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ClicouNaImagem := false;
end;


Blz, deu certinho obrigado, agora eu não consegui implementar no código a área de arrasto q seria um panel, vc pode me dar mais uma mãozinha? :D


Ipc$
   - 23 ago 2004

A imagem já está no Panel ou não?
Se não estiver é só setar a propriedade Parent do TImage p/ TPanel do Panel que automaticamente vc só consegue arrastar dentro dele.


Janete
   - 23 ago 2004


Citação:
A imagem já está no Panel ou não?
Se não estiver é só setar a propriedade Parent do TImage p/ TPanel do Panel que automaticamente vc só consegue arrastar dentro dele.


Desculpe, mas eu não consegui achar a propriedade Parent do TImage só tem ParentShowHint. ???


Ipc$
   - 23 ago 2004

A propriedade Parent é descendente de TControl e não aparece no Object Inspector; vc tem que setá-la via código ou colocar o TImage no TPanel em tempo de projeto.