Ich habe versucht, Dateien, die gezogen werden und auf ein Formular aus dem Datei-Explorer ablegen, aber es funktioniert nicht. Mein WM_DROPFILES-Handler wird nie aufgerufen. Ich betreibe Windows 8, wenn das einen Unterschied macht.Drag & Drop-Dateien in Delphi-Formular funktioniert nicht
Hier ist ein einfaches Beispiel dafür, was ich zu tun (ich habe nur ein TMemo auf dem Formular):
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;
Ich habe Ihren Code getestet und es funktioniert. Windows 7, Delphi XE. Ich habe nur Zeilen in 'DestroyWnd' getauscht, aber das sollte nichts ausmachen - es funktioniert wie erwartet. – kludg
Duplizieren: http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –
@Serg: die Reihenfolge in 'DestroyWnd () 'ist wichtig. 'DragAcceptFiles()' muss vor 'geerbt' aufgerufen werden, da 'geerbt' das' HWND' tatsächlich zerstört. Wenn das 'Handle' das nächste Mal gelesen wird, nachdem es zerstört wurde, wird ein neues' HWND' über 'CreateWnd()' erzeugt. Wenn die Reihenfolge rückwärts ist, lautet das Endergebnis, dass 'DragAcceptFiles (FALSE)' zuletzt aufgerufen wird und Drag & Drop deaktiviert wird. –