我在尝试为Delphi XE7的TListView firemonkey控件创建自定义项目外观方面遇到了很多麻烦。我想要的是为项目定义我自己的“设计”并使用该项目。例如:
我想要一个带标题的项目(在上面) - 一个描述(中) - 一个日期(底部) - 按钮(右)。
我找不到任何关于这方面的好文档,但我得到了一些如何使用muti详细信息创建TListView的示例,但问题是:该示例没有记录,因此很难理解其中的内容。
我想有一个链接或一些解释如何做到这一点,或者如果有其他方式来实现我想要的。我尝试过使用TListBox,但移动设备的性能有点差。我不得不说我可以用TListBox制作我想要的东西,但这就是问题......性能。
所以我希望有一个控件来列出项目(我可以自己创建),并且性能良好。
答案 0 :(得分:2)
当你有许多项目具有相同的布局时,TListView
确实是适当的用法(虽然可以使每个项目与下一个不同)。 TListBox
仅表示您没有太多项目,并且每个项目都需要具有不同的内容(例如配置应用程序设置)。我实际上刚刚修复了这个错误,将一些列表框切换到列表视图。
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;
请注意这些对象中的每一个都具有唯一的“名称”(但不遵循您已经习惯的相同组件名称)。这些名称对每个列表项都是唯一的。