2013-02-27 31 views
8

मैं निम्नलिखित प्रक्रिया है कि खिड़कियों से फाइल droping की अनुमति देता है, छोड़ने के ठीक काम करता है लेकिन जब मैं का उपयोग कर क्रम (TStyleManager.TrySetStyle(styleName)) में शैली बदलने, रूप को स्वीकार अब और नहीं गिर रहा है! वास्तव में क्या गलत है?कार्यावधि में डेल्फी शैलियों बदलने प्रपत्र के लिए फ़ाइलों को छोड़ने की अनुमति नहीं है

public //public section of the form 
... 
procedure AcceptFiles(var msg : TMessage); message WM_DROPFILES; 

... 

procedure TMainFrm.AcceptFiles(var msg: TMessage); 
var 
    i, 
    fCount  : integer; 
    aFileName : array [0..255] of char; 
begin 
    // find out how many files the form is accepting 
    fCount := DragQueryFile(msg.WParam, {uses ShellApi is required...} 
          $FFFFFFFF, 
          acFileName, 
          255); 

    for I := 0 to fCount - 1 do 
    begin 
    DragQueryFile(msg.WParam, i, aFileName, 255); 
    if UpperCase(ExtractFileExt(aFileName)) = '.MSG' then //accept only .msg files 
    begin 
     if not itemExists(aFileName, ListBox1) then// function checks whether the file was already added to the listbox 
     begin 
     ListBox1.Items.Add(aFileName); 

     end 
    end; 
    end; 
    DragFinish(msg.WParam); 
end; 

...

procedure TMainFrm.FormCreate(Sender: TObject); 
begin 
    DragAcceptFiles(Handle, True); //Main form accepts the dropped files 
end; 

उत्तर

16

DragAcceptFiles(Handle, True); फ़ाइलों को स्वीकार करने के रूप में फार्म के लिए रिपोर्ट वर्तमान में इस्तेमाल किया खिड़की संभाल। फॉर्म में कुछ बदलाव विंडो संभाल को नष्ट और पुनर्निर्मित करने का कारण बनते हैं, और शैली बदलना उनमें से एक है। जब ऐसा होता है, FormCreate को फिर से नहीं कहा जाता है। जब खिड़की के हैंडल को फिर से बनाया जाता है, तो आपको फ़ाइलों को स्वीकार करने के रूप में नए हैंडल की भी रिपोर्ट करने की आवश्यकता होती है। आपके उत्तर के लिए

type 
    TForm1 = class(TForm) 
    private 
    { Private declarations } 
    protected 
    procedure CreateWnd; override; 
    public 
    { Public declarations } 
    end; 

implementation 

procedure TForm1.CreateWnd; 
begin 
    inherited; 
    DragAcceptFiles(Handle, True); 
end; 
+0

+1 @hvd thaks: आप बस कोड अपने FormCreate में CreateWnd है कि के लिए स्थानांतरित कर सकते हैं! एक आकर्षण की तरह काम कर रहे हैं – Raul

+2

@TLama संपादन के लिए धन्यवाद, सहमत है कि यह काफी स्पष्ट बनाता है। – hvd

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