Ho provato ad accettare i file che vengono trascinati e rilasciati in un modulo da Esplora file ma non funziona. Il mio gestore WM_DROPFILES non viene mai chiamato. Sto usando Windows 8 se questo fa alcuna differenza.Trascinare i file sul modulo Delphi non funzionanti
Ecco un semplice esempio di quello che faccio (ho solo un TMemo sulla forma):
type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
procedure WMDROPFILES(var msg : TWMDropFiles) ; message WM_DROPFILES;
procedure CreateWnd; override;
procedure DestroyWnd; override;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.CreateWnd;
begin
inherited;
DragAcceptFiles(Handle, True);
end;
procedure TForm1.DestroyWnd;
begin
inherited;
DragAcceptFiles(Handle, false);
end;
procedure TForm1.WMDROPFILES(var msg: TWMDropFiles);
var
i, fileCount: integer;
fileName: array[0..MAX_PATH] of char;
begin
fileCount:=DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAX_PATH);
for i := 0 to fileCount - 1 do
begin
DragQueryFile(msg.Drop, i, fileName, MAX_PATH);
Memo1.Lines.Add(fileName);
end;
DragFinish(msg.Drop);
end;
Ho testato il codice e funziona. Windows 7, Delphi XE. Ho solo scambiato le righe in 'DestroyWnd' ma non dovrebbe avere importanza - funziona come previsto. – kludg
Duplicato: http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –
@Serg: l'ordine in 'DestroyWnd () "importa. 'DragAcceptFiles()' deve essere chiamato prima di 'inherited', perché' inherited' distruggerà effettivamente 'HWND'. La prossima volta che il 'Handle' viene letto dopo essere stato distrutto, viene creato un nuovo' HWND' tramite 'CreateWnd()'. Se l'ordine è retrocesso, il risultato finale sarà che "DragAcceptFiles (FALSE)" viene chiamato per ultimo, disabilitando Drag & Drop. –