Ver Mensaje Individual
  #1  
Antiguo 24-10-2011
jumasuro jumasuro is offline
Registrado
 
Registrado: feb 2007
Posts: 7
Reputación: 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