Delphi 运行时的ListView颜色项

Delphi 运行时的ListView颜色项,delphi,listview,Delphi,Listview,我知道,当我使用OnDraw事件将项目添加到列表中时,我可以为项目设置自定义颜色,但我希望在项目已经在列表中后的某个点更改项目的颜色 有没有办法做到这一点?若要仅重新绘制某些项目,请使用该方法。它有两个输入参数,您可以在其中指定要重绘的项的范围。如果您只想重画一个项目,那么只需指定一个项目索引作为一个范围 在本例中,我将项目的颜色存储到属性中,并在计时器事件中淡出该颜色。更改该值后,我调用强制激发draw item事件的函数。是的,如果没有设置,它会闪烁(即使您将计时器的间隔设置为500毫秒)

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


有没有办法做到这一点?

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

在本例中,我将项目的颜色存储到属性中,并在计时器事件中淡出该颜色。更改该值后,我调用强制激发draw item事件的函数。是的,如果没有设置,它会闪烁(即使您将计时器的间隔设置为500毫秒)

过程TForm1.FormCreate(发送方:TObject);
开始
列表视图1.增补项(“第1项”,待标对象(CL怀特));
列表视图1.增补项(“第2项”,TObject(clWhite));
列表视图1.增补项(“第3项”,TObject(clWhite));
Timer1.Enabled:=真;
结束;
过程TForm1.ListView1CustomDrawItem(发送方:TCustomListView;
项:TListItem;状态:TCustomDrawState;变量DefaultDraw:Boolean);
开始
ListView1.Canvas.Brush.Color:=TColor(Item.Data);
结束;
程序TForm1.Timer1Timer(发送方:TObject);
变量
C:字节;
I:t颜色;
程序更改项目颜色;
开始
I:=TColor(ListView1.Items[0]。数据);
C:=GetRValue(I);
如果C<150,则C:=255,否则为Dec(C);
I:=RGB(C,C,C);
ListView1.Items[0]。数据:=ToObject(I);
结束;
开始
//变色
变色;
//使用索引1重新绘制项目
ListView1.UpdateItems(1,1);
结束;

我不明白。您说您可以在
OnDraw
中绘制特定颜色。如果是这样,那么问题出在哪里?@DavidHeffernan如果我重新绘制listview,它会有一个恼人的闪烁,因此我想知道是否有其他方法可以实现这种功能。为什么要调用
重新绘制
?无论如何,在我看来,你问了一个XY问题。你真正想做的是避免闪烁。@DavidHeffernan让我们假设我有一个项目在一段时间后被涂成绿色,我想把它涂成红色。如果我不使用重绘,我应该使用什么?使用。你只需指定单个项目的范围。对于C++的等价物有什么帮助?
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;