Drag and drop

Estoy haciendo una aplicación en Delphi 7, con CLX, y utilizo Drag&Drop para pasar imágenes desde un panel a otro. Me gustaría saber como puedo personalizar ese paso de imagen y que, o bien desaparezca el ratón y se mueva solamente la imagen o bien aparezca el ratón con la imagen en la punta...
No creo que sea muy original, pero si sabes otra manera de personalizar el ese paso de imágenes, estoy abierto a ello...
Respuesta
1
Aquí te paso una idea que, aunque primaria, quizá te pueda ayudar.
La cuestión es mover un image de un panel a otro. El problema es que los paneles al ser twincontrols (contenedores) y el image no, no lo podemos mover alegremente a menos que le cambiemos el Parent. Y para que el efecto de movimiento del image sea convincente, lo debemos insertar en un panel temporal cuyo parent sea la aplicación y así al mover este panel con la imagen dentro, conseguiremos que la imagen se desplace por encima de los demás controles y no por debajo. Si quieres esconder el cursor sólo tienes que hacer showcursor(true/false).
Ejemplo:
- 2 paneles.
- 1 image en el primero.
unit uCLXMoureImage;
Interface
Uses
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
QStdCtrls, QExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Image1: TImage;
procedure Image1DblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
APanel : TPanel;
Procedure MoverImagen(Orig, Dest : TPanel; Img : TImage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.xfm}
procedure TForm1.Image1DblClick(Sender: TObject);
begin
MoverImagen(Panel1, Panel2, (sender as TImage));
end;
procedure TForm1.MoverImagen(Orig, Dest: TPanel; Img: TImage);
const
MOVIMIENTOS = 30;
var
i, ini, fin, tramo : Integer;
ImgCoordsOrig : TPoint;
begin
APanel.Width := Img.Width;
APanel.Height := Img.Height;
APanel.Left := Orig.Left + Img.Left;
APanel.Top := Orig.Top + Img.Top;
Img.Parent := APanel;
ImgCoordsOrig := Point(Img.Left, Img.Top);
Img.Left := 0;
Img.Top := 0;
APanel.Visible := True;
ini := Orig.Left + Img.Left;
fin := Dest.Left + Img.Left;
tramo := (fin - ini) div MOVIMIENTOS;
for i := 1 to MOVIMIENTOS do
begin
APanel.Left := APanel.Left + tramo;
sleep(10);
Application.ProcessMessages;
end;
Img.Left := ImgCoordsOrig.X;
Img.Top := ImgCoordsOrig.Y;
Img.Parent := Dest;
APanel.Visible := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
APanel := TPanel.Create(self);
APanel.Parent := self;
APanel.BevelOuter := bvNone;
APanel.Visible := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
If Assigned(APanel) then
Apanel.Free;
end;
end.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas