当您有许多相互具有相同布局的项目时, ATListView
确实是合适的选择(尽管可以使每个项目与下一个项目不同)。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;
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;
请注意,这些对象中的每一个都有一个唯一的“名称”(但不遵循您已经习惯的相同组件名称)。这些名称对于每个列表项都是唯一的。