Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-10-2011
jumasuro jumasuro is offline
Registrado
 
Registrado: feb 2007
Posts: 7
Poder: 0
jumasuro Va por buen camino
Asignar Drag&Drop a paneles creados en tiempo de ejecución

Hola a todos,
aunque llevo años consultando este foro, y aunque hasta ahora no me había visto en la necesidad de preguntar ya que siempre había encontrado la solución rebuscando un poco entre todos los mensajes, en esta ocasión no consigo solucionar el problema que tengo y por eso recurro a vosotros, a ver podéis echarme una mano.

Tengo un formulario en el que creo varios paneles en tiempo de ejecución y estoy intentando hacer que se puedan arrastrar archivos sobre cada uno de ellos desde el explorador de windows (sólo en los paneles).
El caso es que se como "asignar" el drag&drop a un panel, pero no como hacerlo para todos los que se creen durante la ejecución.
Este es el código que tengo en mi formulario para asignar el drag&drop a un panel:

Código Delphi [-]
unit Unit1;  

interface  
uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, ShellApi, ExtCtrls, StdCtrls;  
type   
  TForm1 = class(TForm)     
    Memo1: TMemo;     
    procedure FormCreate(Sender: TObject);   
  private     { Private declarations }     
    originalPanelWindowProc : TWndMethod;     
    procedure PanelWindowProc (var Msg : TMessage) ;     
    procedure PanelFilesDrop (var Msg : TWMDROPFILES) ;  
  public     { Public declarations }   
  end;  

var   
  Form1: TForm1;  

implementation  {$R *.dfm}  

procedure TForm1.FormCreate(Sender: TObject); 
var   
  i : integer;   
  Panel : TPanel; 
begin   
  //Creo el panel1   
  Panel := TPanel.Create(Self);   
  Panel.Parent := Self;   
  Panel.Name := 'Panel1';   
  Panel.Top := 2;   
  Panel.Left := 2;   
  Panel.Height := 100;   
  Panel.Width := 100;   
  Panel.Show;    
  //Creo el panel2   
  Panel := TPanel.Create(Self);   
  Panel.Parent := Self;   
  Panel.Name := 'Panel2';   
  Panel.Top := 2;   
  Panel.Left := 120;   
  Panel.Height := 100;   
  Panel.Width := 100;   
  Panel.Show; 
  //Esto sería para asignar el drag&drop a un sólo panel (panel1) 
  {  originalPanelWindowProc := Panel1.WindowProc;   Panel1.WindowProc := PanelWindowProc;   DragAcceptFiles(Panel1.Handle,true) ; }  
  //Esto sería para asignar dinámicamente el mensaje del drag&drop a todos los paneles (Esto es lo que no se hacer)  
  for i := 0 to ComponentCount-1 do   
  begin     
    if (Components[i] is TPanel) then     
    begin       
      originalPanelWindowProc := (Components[i] as TPanel).WindowProc;       
        (Components[i] as TPanel).WindowProc := PanelWindowProc;       
     DragAcceptFiles((Components[i] as TPanel).Handle,true) ;     
    end;   
  end; 
end;  

procedure TForm1.PanelWindowProc(var Msg: TMessage); 
begin   
  if Msg.Msg = WM_DROPFILES then     
    PanelFilesDrop(TWMDROPFILES(Msg))   
  else     
    originalPanelWindowProc(Msg) ; 
end;  

procedure TForm1.PanelFilesDrop(var Msg: TWMDROPFILES); 
const   
  MAXFILENAME = 255; 
var   
  cnt, fileCount : integer;   
  fileName : array [0..MAXFILENAME] of char; 
begin   
  fileCount := DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAXFILENAME) ;    
  for cnt := 0 to -1 + fileCount do   
  begin     
     DragQueryFile(msg.Drop, cnt, fileName, MAXFILENAME) ;      
     memo1.Lines.Insert(0, fileName) ;   
  end;    
  DragFinish(msg.Drop) ; 
end;

El ejemplo anterior consta únicamente de un formulario, un memo (memo1) donde muestro la ruta de los ficheros que se han arrastrado sobre los paneles y 2 paneles creados en tiempo de ejecución.
El problema lo tengo con el "originalPanelWindowProc" y el procedimiento "PanelWindowProc (var Msg : TMessage)", que cuando sólo hay un panel funciona correctamente pero en cuanto hay más ya no funciona. Si mis pocos conocimientos de delphi no me engañan, el problema es que no se puede asignar el mismo "originalPanelWindowProc" y procedimiento "PanelWindowProc (var Msg : TMessage)" a todos los paneles creados, pero no se como generar dichos mensajes de forma dinámica para cada uno de los paneles creados.

¿Podéis echarme una mano?.
Muchas gracias.

Última edición por ecfisa fecha: 24-10-2011 a las 18:20:55. Razón: Corregir problema de etiquetas bajo interfaz WYSIWYG
Responder Con Cita
 



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
Controlar componentes creados en tiempo de ejecución. damirua OOP 1 13-05-2010 14:03:58
Error TStringList creados en tiempo de ejecución subzero Varios 14 26-01-2008 13:58:05
Destruir Qrlabels creados en tiempo de ejecucion Ade Impresión 6 08-10-2006 19:46:28
Eventos en componentes creados en tiempo de ejecucion joumont OOP 3 27-12-2005 14:48:23
Objetos creados en tiempo de ejecución Scocc OOP 4 13-06-2003 20:55:29


La franja horaria es GMT +2. Ahora son las 01:53:31.


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