2012-02-24 31 views
7

Tôi biết rằng tôi có thể đặt màu tùy chỉnh thành các mục khi tôi thêm chúng vào danh sách bằng Sự kiện OnDraw nhưng tôi muốn thay đổi màu của các mục tại một điểm nhất định sau khi chúng đã có trong danh sách.Các mục màu ListView khi chạy

Có cách nào để thực hiện việc này không?

+0

Tôi không hiểu. Bạn nói bạn có thể vẽ một màu cụ thể trong 'OnDraw'. Nếu vậy, thì vấn đề là gì? –

+0

@DavidHeffernan Nếu tôi vẽ lại listview nó có một flicker gây phiền nhiễu vì vậy tôi đã tự hỏi nếu có một phương pháp khác trong việc đạt được chức năng như vậy. – opc0de

+0

Tại sao bạn gọi điện thoại là 'Repaint'? Dù sao, có vẻ như với tôi rằng bạn đã hỏi một câu hỏi XY. Những gì bạn thực sự muốn làm là tránh nhấp nháy. –

Trả lời

12

Để vẽ lại chỉ một số mục nhất định, hãy sử dụng phương thức UpdateItems. Nó có hai tham số đầu vào nơi bạn có thể chỉ định phạm vi của các mục sẽ được vẽ lại. Nếu bạn sẽ vẽ lại chỉ một mục, thì chỉ cần chỉ định một mục chỉ mục làm một phạm vi.

Trong ví dụ này, tôi lưu trữ màu của mục vào thuộc tính TListItem.Data và làm mờ màu này trong sự kiện của bộ hẹn giờ. Sau khi thay đổi giá trị, tôi gọi hàm UpdateItems buộc sự kiện mục vẽ phải kích hoạt. Và có, nếu không có DoubleBuffered được đặt, nó sẽ nhấp nháy (ngay cả khi bạn đặt khoảng thời gian của bộ hẹn giờ, ví dụ: 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; 
Các vấn đề liên quan