2013-01-09 11 views
6

मैंने फ़ाइलों को स्वीकार करने की कोशिश की है जो फ़ाइल एक्सप्लोरर से किसी फॉर्म में खींचे गए हैं और गिराए गए हैं लेकिन यह काम नहीं करता है। मेरा 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; 
+0

मैंने आपके कोड का परीक्षण किया है और यह काम करता है। विंडोज 7, डेल्फी एक्सई। मैंने केवल 'DestroyWnd' में लाइनों को बदल दिया लेकिन इससे कोई फर्क नहीं पड़ता - यह अपेक्षा के अनुसार काम करता है। – kludg

+2

डुप्लिकेट: http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –

+4

@ सर्ग: 'DestroyWnd में ऑर्डर () 'मायने रखता है। 'वंचित' से पहले DragAcceptFiles() को कॉल करने की आवश्यकता है, क्योंकि 'विरासत' वास्तव में 'HWND' को नष्ट कर देगा। अगली बार 'हैंडल' को नष्ट होने के बाद पढ़ा जाता है, 'CreateWnd() 'के माध्यम से एक नया' HWND' बनाया जाता है। यदि ऑर्डर पीछे की ओर है, तो अंतिम परिणाम यह होगा कि 'ड्रैगएसेप्टफाइल (FALSE)' को अंतिम रूप से कॉल किया जाता है, ड्रैग और ड्रॉप अक्षम करता है। –

उत्तर

17

सबसे अधिक संभावना आप अपने आवेदन ऊंचा चल रहे हैं। शायद क्योंकि आप डेल्फी को बढ़ा रहे हैं। Vista और बाद में, कम विशेषाधिकार प्रक्रिया उच्च विशेषाधिकार प्रक्रियाओं को संदेश नहीं भेज सकती है। यह MSDN blog और बताता है।

यदि आप अपना डेल्फी आईडीई बढ़ा रहे हैं, तो मैं आपको ऐसा करने से रोकने का आग्रह करता हूं। मानक डेस्कटॉप एप्लिकेशन विकास के लिए ऐसा करने की बहुत आवश्यकता नहीं है।


रेमी पॉइंट के रूप में, आपके DestroyWnd गलत है। DragAcceptFiles पर कॉल करने से पहले आप विंडो हैंडल को नष्ट कर रहे हैं। बस आदेश को उलट दें। व्यक्तिगत रूप से मैं WindowHandle दोनों CreateWnd और DestroyWnd दोनों का उपयोग करता हूं। Handle प्रॉपर्टी विंडो हैंडल बनाता है अगर इसे असाइन नहीं किया गया है और इसलिए ऐसी त्रुटियों को मास्क करता है।

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

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

शायद यह था। धन्यवाद दोस्त :) –

संबंधित मुद्दे