【发布时间】:2018-10-11 14:27:19
【问题描述】:
我正在为 Delphi 10.2 中的 Firemonkey 重写一个显示自定义 TCustomListbox 的 VCL 组件。自定义使用了覆盖的DrawItem,基本上添加了一些缩进并根据项目文本和索引设置文本颜色。
DrawItem 让它变得相当容易,但在 FMX 中似乎没有这样的东西。我可以覆盖PaintChildren 并自己绘制每个项目,但它看起来会有所不同,我必须自己处理滚动和所有事情。我刚开始使用 FMX 和 don't have the sources yet。
在 FMX 中是否有
DrawItem替换?我可能错过了。如果没有,它如何获得所需的信息?基本上,要绘制的矩形和理想的样式。
问题
Hans 的解决方案可行,但存在一些主要问题:
颜色
设置颜色不起作用,文本总是黑色的。我尝试了各种可能性,包括这个:
PROCEDURE TMyItem.Paint;
BEGIN
TextSettings.FontColor := TAlphaColorRec.Red;
INHERITED;
END;
速度
打开一个装有 180 件物品的盒子可能需要两秒钟。我们需要这么多项目,它们的数量实际上是我们需要自定义框的原因(我们使用组件的TEdit 部分提供过滤)。使用不带TMyItem 的字符串的版本更快(虽然可能比VCL 版本慢),但使用这些项目似乎更慢(它比填充类似样式的HTML 列表慢)。
还是别的什么?没有来源,几乎没有我无法分辨的文档。
我试图缓存这些项目以供重复使用,但这没有帮助。
看起来使用自定义项实际上比使用字符串更快,(以毫秒为单位):
nItems String TMyItem
200 672 12
2000 5604 267
20000 97322 18700
当内容多次更改时,速度问题似乎会累积。我用的是FListBox.Items.Clear;,然后我试了
n := FListBox.Items.Count;
FOR i := 0 TO n-1 DO FListBox.ListItems[n-1-i].Free;
最后是FListBox.Clear;,这是最有意义的(也是我最后发现的)。尽管如此,最后似乎每个项目都需要 2 毫秒。
【问题讨论】:
-
在 FMX 上,我以不同的方式完成了它:覆盖 TListBoxItem,我通过覆盖
Paint方法添加自定义绘图并在 Create 方法中添加其他控件(例如文本/标签)。跨度> -
@J... 我的意思是“Embarcadero® Delphi 10.2 版本 25.0.29899.2631”,因为它在“关于”中写道,已修复。无论如何,我对他们的编号感到很困惑(但这不是唯一的事情)。
-
@Hans 这会解决它,但我怎样才能让
TCustomListbox使用TMyListBoxItem? -
FMX 中总有一种风格。该样式绘制控件的可视部分。如果不指定样式,则使用默认样式。您可以轻松添加自己的样式。如果您的所有列表框项目都相同,那么您可以为
ListBoxItem定义自己的样式。我已经为我的一些项目做到了这一点,但我更喜欢我的答案中的解决方案,因为它非常灵活。 -
没有firemonkey的源代码,你几乎没有机会做出好的东西,我什至不知道没有源代码的firemonkey怎么可能做任何事情。我最好的选择是简单地放置一个自定义 TvertScrollBox 并在其中放置许多 TLayout 并在 tlayout.paint 内完成您需要的一切。如果您担心速度,请使用 Alcinoe 控件 (github.com/Zeus64/alcinoe)
标签: delphi firemonkey vcl delphi-10.2-tokyo