将所有记录的数据库字段加载到ListView项详细信息对象中

时间:2016-07-11 11:29:16

标签: delphi firemonkey delphi-xe8

使用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;

如果不够清楚我很抱歉,请告诉我。

任何帮助都会很棒。

1 个答案:

答案 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作为MasterDetail

同样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紧接在循环之前。