FireMonkey TListView:如何在运行时对项目进行着色?

3
可以使用自定义绘图来为VCL TListView着色,这使您可以为个别项目着色(这里有一个例子,它使用了一种相当可疑的方法,将TColor放入项目的Data中)。
然而,在XE7 FMX版本的TListVew控件中,没有OnCustomDraw事件。我尝试了一些选项,但似乎没有任何改变颜色的效果。我该怎么做?

1
你没有重新打开任何东西,你是在一个新主题上提出一个新问题。这个新问题是关于FMX的。 - David Heffernan
1
这个问题涉及到VCL和Windows。而你的新问题则是关于一个完全不同的UI框架(FMX)和一个完全不同的操作系统(Android)。 - Ken White
编辑 - 您正在询问有关FMX控件的内容。 FMX与VCL的工作方式非常不同,问题不在于事件已经消失,而是它从未存在过。相反,您需要采用不同的方法。重写以表明这一点。 - David
3个回答

7
您可以使用TListViewItem.Objects.DetailObject.TextColor属性更改每个列表项文本的颜色,但是没有本地属性来更改每个列表项的背景颜色。
根据TListView Items background color
如何更改TListView项目的背景颜色? … 您必须使用样式。因此,请在Delphi中添加一个样式簿(book),并使用其中一种预定义样式或右键单击listview“编辑自定义样式”(edit custom style)以创建样式。双击样式簿以打开样式并修改listviewstyle。
但是这并不解释如何将不同样式应用于每个列表项。

3
每个项目都有一个OnPaint事件。像以下这样分配一个事件处理程序。
procedure TfrmModelArchiver.lst1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
    Canvas.Fill.Color := TAlphaColorRec.Red;
    Canvas.FillRect(ARect, 0, 0, AllCorners, 0.2);
end;

在此事件处理程序中,不透明度被设置为0.2,以便文字可以显示出来。如果您将不透明度设置为1,则需要像下面展示的那样编写文本并绘制背景。
procedure TfrmModelArchiver.lst1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
    Canvas.Fill.Color := TAlphaColorRec.Red;
    Canvas.FillRect(ARect, 0, 0, AllCorners, 1);
    Canvas.Fill.Color := TAlphaColorRec.Black;
    Canvas.FillText(ARect, 'some text', False, 1, [],
      TTextAlign.taLeading);
end;

3

这里有解决方案。

这个现代化的ListView组件适用于在Delphi 10 Berlin上使用FireMonkey开发的Android、IOS、OSX和Windows平台。其中一个很好的特性是它既有水平模式也有垂直模式。 SetColorItemSelected、SetColorItemFill、SetColorBackground、SetColorItemSeparator、SetColorText、SetColorTextSelected、SetColorTextDetail、SetColorHeader、SetColorTextHeader等许多其他属性。


1
你能否解释一下这个解决方案?链接可能会在某一天消失。 - inye
这是一个自定义单元 FMX.ListView.pas 和 FMX.ListView.Types.pas。你可以在这里测试演示 https://github.com/rzaripov1990/ModernListView - alitrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接