Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2010
Robin1 Robin1 is offline
Miembro
 
Registrado: nov 2009
Posts: 14
Poder: 0
Robin1 Va por buen camino
Drag Drop TImage

Hola todos.

La cuestión que hoy se me plantea es la siguiente:

Utilizo un TImage como contenedor de otro TImage que creo de forma dinámica.

La idea, es que este nuevo TImage creado de forma dinamica pueda hacérsele Drag and Drop dentro del TImage que hace las veces de contenedor.

Todo me funciona, es decir, crear dinámicamente el TImage, que este se vea dentro del contenedor, y que incluso, cargue la imágen.

Pero a la hora de dar las pautas para que se pueda hacer drag and drop, no sé como manejar los eventos de un objeto que se crea en tiempo de ejecución.

Muestro el código de todo lo que hago...

//A partir de un Listbox, creo de forma dinámica el TImage, que a partir de aquí, se llamará "NewPedal"

Código:
procedure TForm1.LstModelDblClick(Sender: TObject);
var
  imgPath: string;
  NewPedal: TImage;

begin
  if LstModel.Selected [0] then
    imgPath := ExtractFilePath(ParamStr(0)) + 'Rec\Boss\Boss AC-3.jpg';
    NewPedal := TImage.Create(Self);
  with NewPedal do begin
    Parent := Self;
    SetBounds(30, 200, 800, 800);
    Picture.LoadFromFile(imgPath);
  end;
end;
Como el contenedor del nuevo TImage, es otro TImage, haciendo pruebas, vi viable asignar los siguientes eventos a este TImage (El contenedor)

Código:
procedure TForm1.ImgGroundDragDrop(Sender, Source: TObject; X, Y: Integer);
//El tema del DragDrop
begin
 if Source is TImage then
    begin
      TImage(Source).Left := X;
      TImage(Source).Top := Y;
    end;
end;



procedure TForm1.ImgGroundDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
//Más del DragDrop sobre el Imageground
  begin
Accept := (Source is TImage);
end;
Muy bien, ahora ha llegado el momento de asignar el evento Mouse Down, es decir, quiero que cuando se de Click Izquierdo al Mouse, presionando sobre el TImage creado dinámicamente, se pueda dentro del contenedor arrastrar y soltar a petción... Y aquií esta mi cuello de botella:

Que hice: Intenté hacerlo igual a como lo haría con un TIMge ya creado, pero por todos lados el compilador (Delphi 2010) me tira error. Hice esto, y no tira error, pero igual nada pasa:

Código:
procedure TForm1.NewPedalMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

var
 NewPedal: TImage;
begin
if Button = mbLeft then NewPedal.BeginDrag(True) ;
end;
Agradecería mucho si alguien me puede orientar.

Un gran saludo, y mil gracias,

Julián
Responder Con Cita
  #2  
Antiguo 20-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Julián.

Probá asignando el evento en la creación del TImage.
Código Delphi [-]
  ...
  NewPedal := TImage.Create(Self);
  with NewPedal do 
  begin
     Parent := Self;
     SetBounds(30, 200, 800, 800);
     Picture.LoadFromFile(imgPath);
     OnMouseDown:= NewPedalMouseDown;
   end;
   ...

Saludos.

Última edición por ecfisa fecha: 20-09-2010 a las 04:40:38.
Responder Con Cita
  #3  
Antiguo 20-09-2010
Robin1 Robin1 is offline
Miembro
 
Registrado: nov 2009
Posts: 14
Poder: 0
Robin1 Va por buen camino
Hola Ecfisa.

Míl gracias por la pronta respuesta, y la ayuda. Verás, incialmente intenté hacerlo, pero definitivamente el compilador genera un error, ya que falta declarar qué es "NewPedalMouseDown;

El asunto, y pienso que por ahí es la cosa, sería algo como esto:

Hay que escribir correctamente el evento OnMouse Down, para el objeto TImage que se está creando de forma dinámica. Este objeto, se llama "NewPedal", pero lo que aún no logro compremder es: Si ya lo he declarado también como una variable global - Creo haberlo hecho bien con esto:

Código:
var
  Form1: TForm1;
   NewPedal: TImage;
En toda la parte superior antes de todos los procedimientos...

Ahora bien, si se pudiese escribir en su defecto una función que indique que se se le dá click izquierdo, el TImage creado dinamicamente debe hacer Drag & Drop.... y luego llamar a esa función.... Bueno, qúe podría hacer para solventar este problema?

Con ese problema, he quedado bloqueado :-)

Si la pregunta es: ¿Por que lo créo dinamicamente? Es que en este programa que desarrollo trabajaré aproximadamente con unas 300 referencias diferentes. Por eso creo, el mejor camino es crear en Runtime el objeto, y de forma global darle a este la posibilidad de hacer drag drop sin importar que tipo de imágen cargue...

Míl gracias, y haber como soluciono esto. Un gran abrazo, Ecfisa!!!

Julián

Última edición por Robin1 fecha: 20-09-2010 a las 05:55:57.
Responder Con Cita
  #4  
Antiguo 20-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola de nuevo.
Cita:
Míl gracias por la pronta respuesta, y la ayuda. Verás, incialmente intenté hacerlo, pero definitivamente el compilador genera un error, ya que falta declarar qué es "NewPedalMouseDown;
Ahora te entiendo...

Dentro del form, declará el procedimiento como private:
Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    procedure NewPedalMouseDown(Sender: TObject; Button: TMouseButton;  
              Shift: TShiftState; X, Y: Integer); 
  public
end;
Podés declararlo como public, pero no creo que convenga en este caso.

Saludos.

Última edición por ecfisa fecha: 20-09-2010 a las 16:29:39.
Responder Con Cita
  #5  
Antiguo 20-09-2010
Robin1 Robin1 is offline
Miembro
 
Registrado: nov 2009
Posts: 14
Poder: 0
Robin1 Va por buen camino
Hola Ecfisa, nuevamente, míl gracias por la ayuda. Te cuento que definitivamente, no funciona. Es decir, el compilador no genera error, la imagen se carga, pero no hace Drag & Drop.

Verás, tengo una tienda de pedales de guitarra. Se me ocurrió la bonita idea de crear (no soy programador profesional, pero llevo algunos años trasteando con Delphi y me ha servido mucho en mi negocio.

Lo que quiero es que el usuario entre al programa, y valla conformando su cadena de pedales para ir viendo como le queda conformada. De ahí la necesidad del Drag & Drop.

Veamos: ¿Qué modo utilizarías para crear en tiempo de ejecución un TIMage que carge un .jpg y que puedas hacerle Drag Drop?

Digámos que mi problema, se resume a eso.

Un gran abrazo, y mil gracias nuevamente por la ayuda!!!

Julián
Responder Con Cita
  #6  
Antiguo 20-09-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola nuevamente Julián.

Mirá, yo trabajo don Delphi 7 pero supongo que no tendría que haber diferencia en esto con Delphi 2010.
Hice una prueba que funciona bién, seguramente tengas que adaptarla a tu necesidad; pero tal vez algo te pueda servir.

El ejemplo consta de un TImage destino, creado en diseño dentro de un TPanel (para visualizar donde dejo la imágen) y
otro TImage origen creado en en ejecución.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    ImgDestino: TImage;
    procedure FormCreate(Sender: TObject);
    procedure ImagenDestinoDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure ImagenDestinoDragDrop(Sender, Source: TObject; X,
      Y: Integer);
  private
    FImgOrigen: TImage;
    procedure ImagenOrigenClick(Sender:TObject);
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

uses Jpeg;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImgOrigen:= TImage.Create(nil);
  with FImgOrigen do
  begin
    Picture.LoadFromFile('C:\Tucan.jpg');
    Parent:= Self;
    OnClick:= ImagenOrigenClick;
  end;
end;

procedure TForm1.ImagenOrigenClick(Sender: TObject);
begin
  FImgOrigen.BeginDrag(True);
end;

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

procedure TForm1.ImagenDestinoDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  ImgDestino.Picture.Assign(FImgOrigen.Picture);
end;

end.

Nota: No realizé la liberación de los recursos por que no hace al funcionamiento, pero lógico que deberías liberarlos al finalizar.

Espero te ayude en algo.

Saludos.

Última edición por ecfisa fecha: 20-09-2010 a las 20:14:28.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Drag and Drop... dvlt .NET 0 07-02-2008 09:42:59
Drag & Drop DanForever Varios 2 01-06-2006 14:24:25
Drag&Drop !!! rafstyle OOP 6 27-07-2004 04:39:41
Drag&Drop xflo Lazarus, FreePascal, Kylix, etc. 0 13-10-2003 19:31:22
Drag & Drop cone220 Varios 1 26-05-2003 19:06:34


La franja horaria es GMT +2. Ahora son las 18:40:28.


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
Copyright 1996-2007 Club Delphi