2013-01-09 8 views
6

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

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

+2

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

+4

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

risposta

17

Molto probabilmente si esegue l'applicazione elevata. Probabilmente perché stai eseguendo Delphi elevato. In Vista e versioni successive, i processi con privilegi bassi non possono inviare messaggi a processi di privilegi più elevati. Questo MSDN blog spiega di più.

Se si sta eseguendo l'IDE Delphi elevato, è necessario interrompere l'operazione. Raramente c'è bisogno di farlo per lo sviluppo di applicazioni desktop standard.


Come ricorda Remy, il tuo DestroyWnd non è corretto. Stai distruggendo l'handle della finestra prima di chiamare DragAcceptFiles. Basta invertire l'ordine. Personalmente userei WindowHandle in entrambi CreateWnd e DestroyWnd. La proprietà Handle crea l'handle di finestra se non è assegnato e quindi maschera tali errori.

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

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

Probabilmente era così. Grazie compagno :) –

Problemi correlati