ListView 在运行时的颜色项

发布于 2025-01-08 20:50:33 字数 94 浏览 0 评论 0原文

我知道当我使用 OnDraw 事件将项目添加到列表时,我可以为项目设置自定义颜色,但我想在项目已经位于列表中后的某个时刻更改项目的颜色。

有办法做到这一点吗?

I know that i can set custom colors to items when i add them to the list using OnDraw Events but i want to change colors of the items at a certain point after they are already in the list.

Is there a way to do this ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

離人涙 2025-01-15 20:50:33

要仅重绘某些项目,请使用 UpdateItems 方法。它有两个输入参数,您可以在其中指定要重绘的项目的范围。如果您只想重绘一项,则只需将该一项索引指定为范围即可。

在此示例中,我将项目的颜色存储到 TListItem.Data 属性并在计时器事件中淡出此颜色。更改值后,我调用 UpdateItems 强制触发绘制项目事件的函数。是的,没有 DoubleBuffered 设置,它会闪烁(即使您将计时器的间隔设置为 500 毫秒)。

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;

To redraw only certain items use the UpdateItems method. It has two input parameters where you can specify the range of the items to be redrawn. If you are going to redraw only one item, then just specify that one item index as a range.

In this example I'm storing the color of the item into the TListItem.Data property and fading this color in the timer's event. After changing the value I call the UpdateItems function which force the draw item event to fire. And yes, without DoubleBuffered set, it flickers (even when you set the timer's interval e.g. to 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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文