gug*_*amm 3 delphi tlistview listviewitem firemonkey delphi-xe7
我在尝试为 Delphi XE7 的 TListView firemonkey 控件创建自定义项目外观时遇到了很多麻烦。我想要的是为一个项目应该是什么定义我自己的“设计”并使用该项目。例如 :
我想要一个带有标题(顶部) - 描述(中间) - 日期(底部) - 按钮(右侧)的项目。
我找不到任何关于此的好的文档,但我得到了一些有关如何创建具有多个详细信息的 TListView 的示例,但问题是:该示例没有记录,因此很难理解那里发生了什么。
我想要一个链接或一些关于如何做到这一点的解释,或者是否有其他方式来实现我想要的。我曾尝试使用 TListBox,但在移动设备上的性能有点差。我不得不说我可以用 TListBox 制作我想要的东西,但这就是问题......性能。
所以我想要一个控件来列出具有良好性能的项目(我可以自己创建)。
TListView当您有许多彼此具有相同布局的项目(尽管可以使每个项目与下一个项目不同)时,A确实是合适的选择。ATListBox仅表示您没有太多项目,并且每个项目都需要有不同的内容(例如配置应用程序设置)。我实际上刚刚修复了这个错误,将一些列表框切换到列表视图。
Delphi 内置的工具不一定允许您在设计时设计布局/模板(我听说过为此使用第三方库),但是您仍然可以使用代码对其进行自定义。ATListView实际上并不包含内部控件 - 而是特定类型的对象(继承自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;
Run Code Online (Sandbox Code Playgroud)
除了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;
Run Code Online (Sandbox Code Playgroud)
请注意这些对象中的每一个如何具有唯一的“名称”(但不遵循您已经习惯的相同组件名称)。这些名称对于每个列表项都是唯一的。