使用Delphi XE8我目前正在使用Firemonkey TListViews测试功能。
我要做的一件事是将所有记录的字段从TFDMemtable组件加载到Listview项中,特别是加载到ListView项的DetailObject中。
例如,我在表中有3条记录(db字段称为“Name”):
Record 1 = Name 1
Record 2 = Name 2
Record 3 = Name 3
每个ListView项只有一个DetailObject属性,所以我的问题是,我是否可以将所有字段(名称1,名称2,名称3)添加到一个DetailObject中?
以下是我到目前为止所尝试的但没有运气。不是100%确定我需要做什么。
procedure MainForm.BuildList;
var LItem : TListViewItem;
begin
ListView1.BeginUpdate;
try
ListView1.CLearItems;
LItem := ListView1.Items.Add;
LItem.Objects.DetailObject.Visible := True;
with memtable do
begin
while not eof do
begin
LItem.Detail := FieldByName('Name').AsString;
end;
end;
finally
ListView1.EndUpdate;
end;
end;
如果不够清楚我很抱歉,请告诉我。
任何帮助都会很棒。
答案 0 :(得分:1)
我想我应该警告你,在看到你的q之前,我从未对FMX ListViews和Master / Detail数据集做过任何事情。以下是边缘有点粗糙,布局不理想,但它显示了一种从Master + Detail数据集填充ListView的方法。我不知道是否有更好的方法。就个人而言,我会看看是否可以使用Live Bindings来完成这项工作。
procedure TMasterDetailForm.BuildList;
var
LItem : TListViewItem;
DetailItem : TListViewItem;
ListItemText : TListItemText;
DetailIndex : Integer;
begin
ListView1.BeginUpdate;
ListView1.ItemAppearanceObjects.ItemEditObjects.Text.TextVertAlign := TTextAlign.Leading; // The default
// seems to be `Center`, whereas we want the Master field name to be at the top of the item
try
ListView1.Items.Clear; //Items;
Master.First;
while not Master.eof do begin
LItem := ListView1.Items.Add;
LItem.Text := Master.FieldByName('Name').AsString;
LItem.Height := 25;
Detail.First;
DetailIndex := 0;
while not Detail.Eof do begin
Inc(DetailIndex);
ListItemText := TListItemText.Create(LItem);
ListItemText.PlaceOffset.X := 100;
ListItemText.PlaceOffset.Y := 25 * (DetailIndex - 1);
ListItemText.TextAlign := TTextAlign.Leading;
ListItemText.Name := 'Name' + IntToStr(DetailIndex); //Detail.FieldByName('Name').AsString;
LItem.Data['Name' + IntToStr(DetailIndex)] := Detail.FieldByName('Name').AsString;
Detail.Next;
end;
LItem.Height := LItem.Height * (1 + DetailIndex);
Master.Next;
end;
finally
ListView1.EndUpdate;
end;
end;
TListItemText
是可以添加到TListViewItem
的多个“可绘制”FMX对象之一。它们似乎需要唯一的名称,以便可以通过Names
属性访问它们。
FWIW,我在代码中使用了2个TClientDataSets作为Master
和Detail
。
同样FWIW,对于像我这样的FMX新手来说,填充FMX TreeView更像是你在VCL项目中所做的事情:
procedure TMasterDetailForm.BuildTree;
var
PNode,
ChildNode : TTreeViewItem;
begin
TreeView1.BeginUpdate;
try
TreeView1.Clear;
Master.First;
while not Master.eof do begin
PNode := TTreeViewItem.Create(TreeView1);
TreeView1.AddObject(PNode);
PNode.Text := Master.FieldByName('Name').AsString;
Detail.First;
while not Detail.Eof do begin
ChildNode := TTreeViewItem.Create(TreeView1);
ChildNode.Text := Detail.FieldByName('Name').AsString;
PNode.AddObject(ChildNode);
Detail.Next;
end;
Master.Next;
end;
finally
TreeView1.EndUpdate;
end;
end;
顺便说一下,在您的代码中,您应该一直在调用
memtable.Next;
在while not eof
循环中,memtable.First
紧接在循环之前。