gpt4 book ai didi

delphi - 为 ListView Delphi XE7 创建自定义项目外观

转载 作者:行者123 更新时间:2023-12-02 01:37:45 25 4
gpt4 key购买 nike

我在尝试为 Delphi XE7 的 TListView firemonkey 控件创建自定义项目外观时遇到了很多麻烦。我想要的是为一个项目应该是什么定义我自己的“设计”并使用该项目。例如:

我想要一个带有标题(顶部)- 描述(中间)- 日期(底部)- 按钮(右侧)的项目。

我找不到任何关于此的好的文档,但我得到了一些如何创建具有多种详细信息的 TListView 的示例,但问题是:该示例没有记录,因此很难理解那里发生了什么。

我想要一个链接或一些关于如何执行此操作的解释,或者是否有其他方法可以实现我想要的。我尝试过使用 TListBox,但在移动设备上的性能有点差。我不得不说我可以用 TListBox 做出我想要的东西,但这就是问题......性能。

所以我希望有一个控件来列出具有良好性能的项目(我可以自己创建)。

最佳答案

当您有许多彼此具有相同布局的项目时,TListView 确实是合适的选择(尽管可以使每个项目与下一个不同)。 TListBox 仅在您没有太多项目且每个项目需要具有不同的内容(例如配置应用程序设置)时才有意义。实际上,我刚刚修复了这个错误,将一些列表框切换为 ListView 。

Delphi 内置的工具不一定允许您在设计时设计布局/模板(我听说过第三方库),但是您仍然可以使用代码自定义它。 TListView 实际上并不包含控件,而是包含特定类型的对象(继承自 TListItemObject)。这些是虚拟对象,用于在最终绘图中放置各种类型的数据。

首先为 TListView.OnUpdateObjects 添加事件处理程序。这是您本质上“设计”布局的地方。以下是我在一些库存搜索结果中使用的一些代码:

procedure TfrmInventoryContent.lstItemsUpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
TextLabel: TListItemText;
begin
//Add objects per item in list view for displaying more info

//Item Price Label
TextLabel := AItem.Objects.FindObject('lblPrice') as TListItemText;
if TextLabel = nil then begin
TextLabel:= TListItemText.Create(AItem);
TextLabel.Name:= 'lblPrice';
TextLabel.Align:= TListItemAlign.Trailing;
TextLabel.VertAlign:= TListItemAlign.Leading;
TextLabel.TextAlign:= TTextAlign.Trailing;
TextLabel.PlaceOffset.X:= -10;
TextLabel.PlaceOffset.Y:= 4;
TextLabel.Font.Size:= 14;
TextLabel.Width:= 60;
TextLabel.Height:= 18;
TextLabel.Text:= '';
TextLabel.TextColor:= TAlphaColorRec.Green;
end;
//Item Quantity Label
TextLabel := AItem.Objects.FindObject('lblQty') as TListItemText;
if TextLabel = nil then begin
TextLabel:= TListItemText.Create(AItem);
TextLabel.Name:= 'lblQty';
TextLabel.Align:= TListItemAlign.Trailing;
TextLabel.VertAlign:= TListItemAlign.Leading;
TextLabel.TextAlign:= TTextAlign.Trailing;
TextLabel.PlaceOffset.X:= -120;
TextLabel.PlaceOffset.Y:= 4;
TextLabel.Font.Size:= 14;
TextLabel.Width:= 30;
TextLabel.Height:= 18;
TextLabel.Text:= '';
TextLabel.TextColor:= TAlphaColorRec.Blue;
end;
end;

除了TListItemText之外,还有其他类似的类型,继承自TListItemObject。如果需要,您甚至可以设计自己的。设计好此布局后,您需要填充内容...

var
TextLabel: TListItemText;
I: TListViewItem;
begin
//Assuming I is already added to list somewhere
TextLabel := I.Objects.FindObject('lblPrice') as TListItemText;
if Assigned(TextLabel) then begin
TextLabel.Text:= FormatFloat('$#,##0.00', InventoryItem.CustomerPrice.Price);
end;

TextLabel := I.Objects.FindObject('lblQty') as TListItemText;
if Assigned(TextLabel) then begin
TextLabel.Text:= IntToStr(InventoryItem.Quantity);
end;
end;

请注意每个对象都有一个唯一的“名称”(但不遵循您已经习惯的相同组件名称)。这些名称对于每个列表项都是唯一的。

关于delphi - 为 ListView Delphi XE7 创建自定义项目外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29339179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com