2012-02-10 16 views
7

प्राप्त करने का सबसे तेज़ तरीका मैं खोल आइकन (विंडोज एक्सप्लोरर में प्रदर्शित एक) प्राप्त करने के लिए इस कोड का उपयोग कर रहा हूं।
क्या किसी को इन आइकनों को पाने के लिए एक तेज़ तरीका है? SHGetFileInfo काफी धीमा प्रतीत होता है।खोल आइकन

procedure TForm2.Button1Click(Sender: TObject); 
var 
    FileInfo: TSHFileInfo; 
begin 
    FillChar(FileInfo, SizeOf(FileInfo), 0); 
    if SHGetFileInfo(PChar('c:\windows\'), 0, FileInfo, SizeOf(FileInfo), 
    SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX) <> 0 then 
    DrawIconEx(Canvas.Handle, 10, 10, FileInfo.hIcon, 0, 16, 16, 0, DI_IMAGE or 
     DI_MASK); 
end; 

धन्यवाद!

+3

मैंने इस विधि को अतीत में उपयोग किया है जिसमें सी ++ एप्लिकेशन से कोई समस्या नहीं है। हालांकि थोड़ा सा अंतर है, मैंने केवल झंडे 'SHGFI_ICON' और 'SHGFI_USEFILEATTRIBUTES' का उपयोग किया था। – alf

+1

हां, अगर गति एक मुद्दा है तो निश्चित रूप से 'SHGFI_USEFILEATTRIBUTES' का उपयोग करें। इसके साथ, 'SHGetFileInfo()' अपनी विशेषताओं के लिए वास्तविक फ़ाइल से पूछताछ छोड़ देता है, जिसमें कुछ समय लग सकता है। –

उत्तर

8

SHGFI_USEFILEATTRIBUTES ध्वज का उपयोग करने का प्रयास करें। अधिक जानकारी के लिए लेख Tuning SHGetFileInfo for Optimum Performance और What does SHGFI_USEFILEATTRIBUTES mean? देखें।

+2

+1, माप की एक त्वरित श्रृंखला (फ़ाइल आइकन जानकारी 10k बार प्राप्त करने) ने मुझे पुष्टि की है कि आपका सुझाव सबसे अच्छा है (लगभग 18 से 11 तक)। मेरा सुझाव (खोल छवि सूची का उपयोग करें) लगभग उस तक ट्यून करें। 10s जहां लगभग 0.5s छवि सूची हैंडल की प्रारंभिक हो रही है। – TLama

3

मैंने SHGetFileInfo का उपयोग करते समय कैश का उपयोग किया है। जब तक यह एक .exe या .ico फ़ाइल (और शायद कुछ और नहीं) आइकन एक ही फ़ाइल एक्सटेंशन के लिए समान होगा, इसलिए जब आप एक डीआईआर सूची दिखाते हैं तो आप उसी प्रकार की फ़ाइलों के लिए उसी आइकन का उपयोग कर सकते हैं और आप SHGetFileInfo को दोबारा कॉल करने की प्रतीक्षा न करें (और प्रतीक्षा करें)।

+2

आप कैसे जानते हैं कि कैश करना है? किसी भी प्रकार में गतिशील आइकन, .ico और .bmp आदि के लिए% 1 और किसी भी प्रकार के खोल एक्सटेंशन ... – Anders

+0

@TLama, कैश के साथ विचार प्रत्येक फ़ाइल के लिए SHGetFileInfo को कॉल करने से बचने के लिए है क्योंकि यह धीमा है इसलिए यह केवल नए फ़ाइल प्रकारों का सामना करते समय इसे कॉल करने के लिए आवश्यक है। –

+1

@ एंडर्स, हाँ, आप सही हैं, यह पूरी तरह से सुरक्षित नहीं है क्योंकि विभिन्न प्रकारों में निश्चित आइकन नहीं हो सकते हैं। –