2013-02-09 66 views
5

विंडोज एक्सप्लोरर का एक तीर है जो दर्शाता है कि कौन सा स्तंभ सूची सूची (रिपोर्ट व्यू शैली में) द्वारा क्रमबद्ध किया जाता है और किस दिशा में (एएससी बनाम डीईएससी)।TListView कॉलम पर सॉर्ट तीर कैसे दिखाएं?

क्या डेल्फी में TListView पर ऐसे सॉर्ट संकेत तीर को प्रदर्शित करना संभव है?

uses 
    Winapi.CommCtrl; 

var 
    Header: HWND; 
    Item: THDItem; 
begin 
    Header := ListView_GetHeader(ListView1.Handle); 
    ZeroMemory(@Item, SizeOf(Item)); 
    Item.Mask := HDI_FORMAT; 
    Header_GetItem(Header, 0, Item); 
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags 
    Item.fmt := Item.fmt or HDF_SORTUP;//include the sort ascending flag 
    Header_SetItem(Header, 0, Item); 
end; 

मैं सरलता के लिए जाँच त्रुटि नहीं दिखाए हैं:

उत्तर

16

यहाँ आरोही क्रम में क्रमित के रूप में एक हैडर कॉलम को चिह्नित करने के लिए कुछ सरल कोड है। यदि आप विपरीत दिशा में तीर चाहते हैं, तो मुझे यकीन है कि आप तर्क कर सकते हैं कि तर्क को कैसे स्वैप करें।

कुंजी एमएसडीएन विषय HDITEM संरचना के लिए है।

+0

मैंने Winapi.CommCtrl आपके उदाहरण के लिए खंड का उपयोग किया, धन्यवाद। –

+0

क्या ग्रिड के लिए ऐसा करने का कोई तरीका है? –

+1

@ नो ग्रिड कस्टम नियंत्रण हैं, पूरी तरह से वीसीएल कोड में लागू किए गए हैं। यदि वीसीएल ऐसी सुविधा प्रदान नहीं करता है, तो आपको अपने कोड में पेंटिंग को कस्टमाइज़ करना होगा। –

2

आप आसानी से इस कोड को सूची दृश्य में सभी कॉलम के लिए काम करने के लिए बढ़ा सकते हैं; दो चर (फॉर्म के निजी खंड में) घोषित करें:

कॉलमटॉर्ट: इंटीजर; आरोही: बूलियन;

उन्हें फॉर्म और प्रक्रिया के साथ फॉर्मक्रेट प्रक्रिया में आरंभ करें।

procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: ListColumn); 
var 
    Header: HWND; 
    Item: THDItem; 
begin 
    Header := ListView_GetHeader(ListView1.Handle); 
    ZeroMemory(@Item, SizeOf(Item)); 
    Item.Mask := HDI_FORMAT; 

    // Clear the previous arrow 
    Header_GetItem(Header, ColumnToSort, Item); 
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags 
    Header_SetItem(Header, ColumnToSort, Item); 

    if Column.Index = ColumnToSort then 
    Ascending := not Ascending 
    else 
    ColumnToSort := Column.Index; 

    // Get the new column 
    Header_GetItem(Header, ColumnToSort, Item); 
    Item.fmt := Item.fmt and not (HDF_SORTUP or HDF_SORTDOWN);//remove both flags 

    if Ascending then 
    Item.fmt := Item.fmt or HDF_SORTUP//include the sort ascending flag 
    else 
    Item.fmt := Item.fmt or HDF_SORTDOWN;//include the sort descending flag 
    Header_SetItem(Header, ColumnToSort, Item); 

    with ListView1 do 
    begin 
     Items.BeginUpdate; 
     AlphaSort; 
     Items.EndUpdate; 
    end; 
end; 

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

+0

स्टैक ओवरफ्लो में आपका स्वागत है। कड़ाई से यह मेरे प्रश्न का उत्तर नहीं है। मैं वैसे भी इसे ऊपर उठा रहा हूं, क्योंकि आपका उत्तर उपयोगी है। –

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

  • कोई संबंधित समस्या नहीं^_^