Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Arrastrar y Soltar (https://www.clubdelphi.com/foros/showthread.php?t=75249)

Panasys 09-08-2011 00:10:00

Arrastrar y Soltar
 
Hola a todos, he leido varios hilos de Drag & Drop y se ve algo complejo, he buscado en Gugle y he encontrado algo bastante sencillo.

Paso a contar, tengo una aplicacion que el usuario va a configurar a su necesidad ciertas imagenes en un panel contenedor colocandolas en la posicion que mejor le queden a su configuracion.

Para eso encontre este codigo que con una imagen anda de maravillas:


Código Delphi [-]
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TImage then
 begin
    TImage(Source).Left := X;
    TImage(Source).Top := Y;
 end;
 
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TImage) ;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if ssCtrl in Shift then Image1.BeginDrag(True) ;
end;

end.


Bien, pense, si esto funciona tambien podria funcionar esto: (le agregue un TPanel) y con el TPanel la imagen no funciona y el panel se mueve de maravillas !

Código Delphi [-]
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TImage then
 begin
    TImage(Source).Left := X;
    TImage(Source).Top := Y;
 end;
 
 if Source is TPanel then
 begin
    TPanel(Source).Left := X;
    TPanel(Source).Top := Y;
 end;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TImage) ;
  Accept := (Source is TPanel) ;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if ssCtrl in Shift then Image1.BeginDrag(True) ;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if ssCtrl in Shift then Panel1.BeginDrag(True) ;
end;

end.


Pues que no estoy viendo para poder mover el panel y la imagen en el mismo form o dentro de un mismo panel?

Es mas necesito mover como 8 imagenes y por lo menos 4 paneles pero por que no lo puedo hacer con varios componentes?

"Ya verifique el DragMode, con solo la imagen o solo el panel funciona ok, pero con estos dos componentes solo funciona el panel"

Alguna idea? Gracias de antemano y un abrazo.

Javier

ecfisa 09-08-2011 01:25:35

Hola Panasys.

Cita:

Pues que no estoy viendo para poder mover el panel y la imagen en el mismo form
Para mover cualquier control en el form, incluyendo un TPanel, asigna esto al evento OnMouseMove de cada TControl que desees mover:
Código Delphi [-]
procedure TForm.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
const
   SC_DRAGMOVE = $F012;
begin
  ReleaseCapture;
  TControl(Sender).perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;

Un saludo.

Panasys 09-08-2011 13:17:57

Excelente... Gracias!

ecfisa 09-08-2011 20:53:58

Hola Panasys.

Mis disculpas :(. Se me escapó que en el código que pusiste se verifica que esté presionada la tecla Ctrl, para lograr el mismo efecto sería:
Código Delphi [-]
procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then
  begin
    ReleaseCapture;
    (Sender as TControl).Perform(WM_SYSCOMMAND, $F012,0);
  end;
end;

Saludos.

Panasys 10-08-2011 20:28:48

Si Señor ahora si !

Funciona perfecto !

Aunque no hace falta que presione CTRL, arrastra y suelta sin problemas.

Muchas gracias.

Un abrazo.

Javier

roman 10-08-2011 21:23:15

El código original debe funcionar. El único problema que le veo es en

Código Delphi [-]
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TImage) ;
  Accept := (Source is TPanel) ;
end;

Si lo que arrastras es una imagen, la primera línea indica al formulario que debe aceptar el objeto, pero la segunda línea lo contradice puesto que Source es una imagen y no un panel.

El código debería ser así:

Código Delphi [-]
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TImage) or (Source is TPanel) ;
end;

Sin ánimos de demeritar, creo que es mejor adherirse a los eventos de la VCL que ir a "bajo nivel".

// Saludos

ecfisa 10-08-2011 21:33:52

Cita:

Empezado por roman (Mensaje 409102)
Sin ánimos de demeritar, creo que es mejor adherirse a los eventos de la VCL que ir a "bajo nivel".

Tenés toda la razón. (Eso aún sin hablar de la pérdida de compatibilidad que acarrea)

Vicios que uno tendría que sacarse...

La única y pobre escusa que puedo argumentar es mi haraganería, probás que algo funciona y...

Un saludo. :)

Panasys 11-08-2011 00:03:26

Jajajajaaaa... :p eso es lo bueno de estar entre programadores, yo solo tire una consulta para ver por donde ir y me llovieron respuestas una mejor que la otra !!!

Gracias !!! :D:D:D

Ahora no solo he aprendido a arrastrar y soltar sino como hacerlo y las diferencias entre distintos procedimientos. Es mas de lo que esperaba.

Un abrazo amigos !.

Javier


La franja horaria es GMT +2. Ahora son las 22:55:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi