2012-02-24 12 views
7

मुझे पता है कि जब मैं ऑनड्रा घटनाओं का उपयोग करके उन्हें सूची में जोड़ता हूं तो मैं आइटम पर कस्टम रंग सेट कर सकता हूं लेकिन मैं सूची में पहले से ही सूची में रंगों को बदलना चाहता हूं।रनटाइम पर कलर आइटम देखें

क्या ऐसा करने का कोई तरीका है?

+0

मुझे समझ नहीं आता। आप कहते हैं कि आप 'ऑनड्रा' में एक विशिष्ट रंग में आकर्षित कर सकते हैं। यदि हां, तो समस्या क्या है? –

+0

@ डेविड हेफरनन यदि मैं सूचीदृश्य को दोबारा लिखता हूं तो यह एक परेशान झिलमिलाहट है इसलिए मैं सोच रहा था कि ऐसी कार्यक्षमता प्राप्त करने में कोई और तरीका है या नहीं। – opc0de

+0

आप 'रिपेंट' क्यों कॉल कर रहे हैं? वैसे भी, ऐसा लगता है कि आपने एक एक्सवाई सवाल पूछा है। आप वास्तव में क्या करना चाहते हैं झिलमिलाहट से बचें। –

उत्तर

12

पुनः बनाने का केवल कुछ वस्तुओं का उपयोग UpdateItems विधि। इसमें दो इनपुट पैरामीटर हैं जहां आप वस्तुओं को फिर से खींचे जाने के लिए निर्दिष्ट कर सकते हैं। यदि आप केवल एक आइटम को फिर से निकालना चाहते हैं, तो बस एक आइटम इंडेक्स को एक श्रेणी के रूप में निर्दिष्ट करें।

इस उदाहरण में मैं आइटम का रंग TListItem.Data संपत्ति में संग्रहीत कर रहा हूं और टाइमर की घटना में इस रंग को लुप्त कर रहा हूं। मूल्य बदलने के बाद मैं UpdateItems फ़ंक्शन को कॉल करता हूं जो ड्रॉ आइटम ईवेंट को आग लगाने के लिए मजबूर करता है। और हाँ, DoubleBuffered सेट के बिना, यह झिलमिलाहट (यहां तक ​​कि जब आप टाइमर के अंतराल को 500ms तक सेट करते हैं)।

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ListView1.AddItem('Item 1', TObject(clWhite)); 
    ListView1.AddItem('Item 2', TObject(clWhite)); 
    ListView1.AddItem('Item 3', TObject(clWhite)); 
    Timer1.Enabled := True; 
end; 

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; 
    Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 
begin 
    ListView1.Canvas.Brush.Color := TColor(Item.Data); 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
    C: Byte; 
    I: TColor; 

    procedure ChangeItemColor; 
    begin 
    I := TColor(ListView1.Items[0].Data); 
    C := GetRValue(I); 
    if C < 150 then C := 255 else Dec(C); 
    I := RGB(C, C, C); 
    ListView1.Items[0].Data := TObject(I); 
    end; 

begin 
    // color change 
    ChangeItemColor; 
    // repaint of the item with index 1 
    ListView1.UpdateItems(1, 1); 
end; 
संबंधित मुद्दे