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
originalPanelWindowProc : TWndMethod;
procedure PanelWindowProc (var Msg : TMessage) ;
procedure PanelFilesDrop (var Msg : TWMDROPFILES) ;
public
end;
var
Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
Panel : TPanel;
begin
Panel := TPanel.Create(Self);
Panel.Parent := Self;
Panel.Name := 'Panel1';
Panel.Top := 2;
Panel.Left := 2;
Panel.Height := 100;
Panel.Width := 100;
Panel.Show;
Panel := TPanel.Create(Self);
Panel.Parent := Self;
Panel.Name := 'Panel2';
Panel.Top := 2;
Panel.Left := 120;
Panel.Height := 100;
Panel.Width := 100;
Panel.Show;
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.