2016-07-11 9 views
0

Использование Delphi XE8 В настоящее время я тестирую функциональность с помощью TListViews Firemonkey.Загрузить поле базы данных всех записей в элемент списка ItemView Объект

Одна вещь, которую я пытаюсь сделать, - загрузить поле всех записей из компонента TFDMemtable в элемент списка, в частности в объект DetailObject элемента ListView.

К примеру, у меня есть 3 записей в таблице (дб поле называется «Name»):

Record 1 = Name 1 
Record 2 = Name 2 
Record 3 = Name 3 

Существует только 1 DetailObject свойство в ListView Пункт поэтому мой вопрос, я был бы в состоянии добавить все поля (имя 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

Думаю, я должен предупредить вас, что перед тем, как увидеть ваш q, я никогда ничего не делал с наборами данных FMX ListViews и Master/Detail. Следующий пример немного грубый по краям, и макет не идеален, но он показывает один из способов заполнить список ListView из наборов данных Master + Detail. Я понятия не имею, есть ли лучшие способы. Лично я увижу, могу ли я использовать 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 является одним из ряда «рисуемых» FMX объектов, которые могут быть добавлены, чтобы сделать TListViewItem. Кажется, что им нужны уникальные имена, чтобы их можно было получить через свойство 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; 

Btw, в вашем коде, вы должны были вызывающими

memtable.Next; 

в вашем while not eof цикле, и memtable.First непосредственно перед циклом.

+0

Я восстановил свой ответ с помощью некоторого кода, чтобы показать один из способов сделать то, о чем вы, кажется, просите. – MartynA

 Смежные вопросы

  • Нет связанных вопросов^_^