将所有记录的数据库字段加载到 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 作为 MasterDetail

此外,对于像我这样的 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 在循环之前。