2013-01-09 10 views
6

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; 
+0

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

+2

Duplizieren: http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –

+4

@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. –

Antwort

17

Höchstwahrscheinlich werden Sie Ihre Anwendung erhöhten ausgeführt werden. Wahrscheinlich, weil Sie Delphi erhöht ausführen. In Vista und späteren Versionen können Prozesse mit niedriger Berechtigung keine Nachrichten an Prozesse mit höheren Berechtigungen senden. Diese MSDN blog erklärt mehr.

Wenn Sie Ihre Delphi-IDE erhöht ausführen, fordere ich Sie auf, damit aufzuhören. Für die Entwicklung von Standard-Desktop-Anwendungen ist dies sehr selten erforderlich.


Wie Remy darauf hinweist, ist Ihre DestroyWnd nicht korrekt. Sie zerstören den Fenstergriff vor dem Aufruf DragAcceptFiles. Einfach die Bestellung stornieren. Persönlich würde ich WindowHandle sowohl in CreateWnd als auch in DestroyWnd verwenden. Die Eigenschaft Handle erstellt das Fensterhandle, wenn es nicht zugewiesen ist, und maskiert daher solche Fehler.

procedure TForm1.CreateWnd; 
begin 
    inherited; 
    DragAcceptFiles(WindowHandle, True); 
end; 

procedure TForm1.DestroyWnd; 
begin 
    DragAcceptFiles(WindowHandle, false); 
    inherited; 
end; 
+0

Das war es wahrscheinlich. Danke Kumpel :) –

Verwandte Themen