将所有记录的数据库字段加载到 ListView 项目详细信息对象中
Load database field of all records into ListView Item Detail Object
使用 Delphi XE8 我目前正在使用 Firemonkey TListViews 测试功能。
我想做的一件事是将所有记录的字段从 TFDMemtable 组件加载到 Listview 项中,特别是加载到 ListView 项的 DetailObject 中。
比如我在一个table中有3条记录(db字段叫做'Name'):
Record 1 = Name 1
Record 2 = Name 2
Record 3 = Name 3
每个 ListView 项目只有 1 个 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;
很抱歉,如果这还不够清楚,请告诉我。
任何帮助都会很棒。
我想我应该警告你,在看到你的问题之前,我从未对 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
是多个 "drawable" FMX 对象之一,可以添加这些对象来执行 TListViewItem
。他们似乎需要唯一的名称,以便可以通过 Names
属性.
访问它们
FWIW,我在代码中使用了 2 个 TClientDataSet 作为 Master
和 Detail
。
此外,对于像我这样的 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
在循环之前。
使用 Delphi XE8 我目前正在使用 Firemonkey TListViews 测试功能。
我想做的一件事是将所有记录的字段从 TFDMemtable 组件加载到 Listview 项中,特别是加载到 ListView 项的 DetailObject 中。
比如我在一个table中有3条记录(db字段叫做'Name'):
Record 1 = Name 1
Record 2 = Name 2
Record 3 = Name 3
每个 ListView 项目只有 1 个 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;
很抱歉,如果这还不够清楚,请告诉我。
任何帮助都会很棒。
我想我应该警告你,在看到你的问题之前,我从未对 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
是多个 "drawable" FMX 对象之一,可以添加这些对象来执行 TListViewItem
。他们似乎需要唯一的名称,以便可以通过 Names
属性.
FWIW,我在代码中使用了 2 个 TClientDataSet 作为 Master
和 Detail
。
此外,对于像我这样的 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
在循环之前。