Để 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;
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ì? –
@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
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. –