मैंने फ़ाइलों को स्वीकार करने की कोशिश की है जो फ़ाइल एक्सप्लोरर से किसी फॉर्म में खींचे गए हैं और गिराए गए हैं लेकिन यह काम नहीं करता है। मेरा WM_DROPFILES हैंडलर कभी नहीं कहा जाता है। मैं विंडोज 8 चला रहा हूं अगर इससे कोई फर्क पड़ता है।डेल्फी फॉर्म में फ़ाइलों को खींचें और छोड़ें
यहाँ मैं क्या कर का एक सरल उदाहरण है (मैं सिर्फ फार्म पर एक TMemo है):
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;
मैंने आपके कोड का परीक्षण किया है और यह काम करता है। विंडोज 7, डेल्फी एक्सई। मैंने केवल 'DestroyWnd' में लाइनों को बदल दिया लेकिन इससे कोई फर्क नहीं पड़ता - यह अपेक्षा के अनुसार काम करता है। – kludg
डुप्लिकेट: http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –
@ सर्ग: 'DestroyWnd में ऑर्डर () 'मायने रखता है। 'वंचित' से पहले DragAcceptFiles() को कॉल करने की आवश्यकता है, क्योंकि 'विरासत' वास्तव में 'HWND' को नष्ट कर देगा। अगली बार 'हैंडल' को नष्ट होने के बाद पढ़ा जाता है, 'CreateWnd() 'के माध्यम से एक नया' HWND' बनाया जाता है। यदि ऑर्डर पीछे की ओर है, तो अंतिम परिणाम यह होगा कि 'ड्रैगएसेप्टफाइल (FALSE)' को अंतिम रूप से कॉल किया जाता है, ड्रैग और ड्रॉप अक्षम करता है। –