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

时间:2015-03-30 05:47:27

标签: delphi firemonkey listviewitem delphi-xe7 tlistview

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

我想要一个带标题的项目(在上面) - 一个描述(中) - 一个日期(底部) - 按钮(右)。

我找不到任何关于这方面的好文档,但我得到了一些如何使用muti详细信息创建TListView的示例,但问题是:该示例没有记录,因此很难理解其中的内容。

我想有一个链接或一些解释如何做到这一点,或者如果有其他方式来实现我想要的。我尝试过使用TListBox,但移动设备的性能有点差。我不得不说我可以用TListBox制作我想要的东西,但这就是问题......性能。

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

1 个答案:

答案 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;

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

相关问题