2016-05-20 6 views
2

Использование Delphi Seattle, я пытаюсь получить поддержку livebinding в нашем текущем проекте и создал форму с внешней TFDMemTable. MemTable подключен к TGrid и к TListbox. Сетка отображает всю информацию, как должна, но список остается пустым.Livebinding Listbox остается пустым, сетка заполнена

Что я делаю неправильно?

код (упрощенно от реальной ситуации, но по-прежнему показывает пустое окно списка):

unit Unit1; 

    interface 

    uses 
     System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Rtti, FireDAC.Stan.Intf, 
     FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, 
     FireDAC.Stan.StorageBin, Data.Bind.EngExt, Fmx.Bind.DBEngExt, Fmx.Bind.Grid, System.Bindings.Outputs, 
     Fmx.Bind.Editors, Data.Bind.Components, Data.Bind.Grid, FMX.ListBox, Data.Bind.DBScope, Data.DB, FireDAC.Comp.DataSet, 
     FireDAC.Comp.Client, FMX.Layouts, FMX.Grid, FMX.Types, FMX.Controls, FMX.Controls.Presentation, FMX.StdCtrls, 
     FMX.Forms; 

    type 
     TForm1 = class(TForm) 
     fdmAccounts: TFDMemTable; 
     fdmAccountscode: TStringField; 
     fdmAccountsdesc: TStringField; 
     bsAccounts: TBindSourceDB; 
     Grid1: TGrid; 
     BindingsList1: TBindingsList; 
     ListBox1: TListBox; 
     LinkGridToDataSourcebsAccounts: TLinkGridToDataSource; 
     LinkFillControlToField1: TLinkFillControlToField; 
     procedure FormCreate(Sender: TObject); 
     private 
     FItemlist: TStringlist; 
     procedure Refreshlist(Sender: TObject); 
     procedure UpdateAccounts(afilter: string); 
     end; 

    var 
     Form1: TForm1; 

    implementation 

    {$R *.fmx} 

    procedure TForm1.UpdateAccounts(aFilter: string); 
    var 
     s: string; 
    begin 
     with fdmAccounts do 
     begin 
     EmptyDataSet; 

     for s in FItemList do 
     begin 
      if aFilter.IsEmpty or s.Contains(aFilter) then 
      InsertRecord([s, '']); 
     end; 
     end; 
    end; 


    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
     FItemlist := TStringList.Create; 
     FItemlist.Delimiter := ','; 
     Fitemlist.DelimitedText := 'item1, item2, ander item3, laatste item'; 

     fdmAccounts.Open; 
     Refreshlist(nil); 
    end; 

    procedure TForm1.Refreshlist(Sender: TObject); 
    begin 
     UpdateAccounts(''); 
    end; 

    end. 

Livebinding определения:

object BindingsList1: TBindingsList 
    Methods = <> 
    OutputConverters = <> 
    Left = 164 
    Top = 237 
object LinkGridToDataSourcebsAccounts: TLinkGridToDataSource 
    Category = 'Quick Bindings' 
    DataSource = bsAccounts 
    GridControl = Grid1 
    Columns = <> 
end 
object LinkFillControlToField1: TLinkFillControlToField 
    Category = 'Quick Bindings' 
    Control = ListBox1 
    Track = True 
    FillDataSource = bsAccounts 
    FillDisplayFieldName = 'desc' 
    AutoFill = True 
    FillExpressions = <> 
    FillHeaderExpressions = <> 
    FillBreakGroups = <> 
end 

концевые

я так же попытался установить FillExpression в LinkFillControlToField1 к это:

FillExpressions = < 
    item 
     SourceMemberName = 'desc' 
     ControlMemberName = 'Text' 
    end> 

Но с тем же результатом .. пустой ListBox

ответ

2

Update:

Будем надеяться, что если вы будете следовать этому примеру, который с моей второй попытки при использовании LiveBindings для заполнения ListBox FOM в TClientDataSet, вы также сможете получить . Возможно, вы захотите отметить проблему с заполнением TStringGrid, о котором я упоминаю в первоначальной версии этого ответа ниже.

DFM экстракт

object ListBox1: TListBox 
    Left = 8 
    Top = 320 
    Width = 121 
    Height = 97 
    ItemHeight = 13 
    TabOrder = 6 
    end 
    object DataSource1: TDataSource 
    DataSet = CDS1 
    Left = 128 
    Top = 24 
    end 
    object CDS1: TClientDataSet 
    Aggregates = <> 
    Params = <> 
    OnNewRecord = CDS1NewRecord 
    Left = 72 
    Top = 24 
    object CDS1ID: TIntegerField 
     FieldName = 'ID' 
    end 
    object CDS1Name: TStringField 
     FieldName = 'Name' 
     Size = 40 
    end 
    object CDS1Value: TStringField 
     FieldName = 'Value' 
     Size = 80 
    end 
    end 
    object BindSourceDB1: TBindSourceDB 
    DataSource = DataSource1 
    ScopeMappings = <> 
    Left = 216 
    Top = 32 
    end 
    object BindingsList1: TBindingsList 
    Methods = <> 
    OutputConverters = <> 
    Left = 72 
    Top = 96 
    object LinkListControlToField1: TLinkListControlToField 
     Category = 'Quick Bindings' 
     DataSource = BindSourceDB1 
     FieldName = 'Name' 
     Control = ListBox1 
     FillExpressions = <> 
     FillHeaderExpressions = <> 
     FillBreakGroups = <> 
    end 
    end 

Код извлечения

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i : Integer; 
begin 
    CDS1.IndexFieldNames := 'ID'; 
    CDS1.CreateDataSet; 

    for i := 1 to 6 do begin 
    CDS1.Insert; 
    CDS1.FieldByName('Name').AsString := 'Name ' + IntToStr(i);; 
    CDs1.FieldByName('Value').AsString := 'Value ' + IntToStr(i); 
    CDS1.Post; 
    end; 

    CDS1.First; 
    StringGrid1.Invalidate; 
end; 

procedure TForm1.CDS1NewRecord(DataSet: TDataSet); 
begin 
    Inc(NextID); 
    DataSet.FieldByName('ID').AsInteger := NextID; 
end; 

Единственное, что отличается от этого AMD моя предыдущая попытка является

LinkListControlToField1: TLinkListControlToField 

Я предполагала, (неправильно, это получается), что TLinkListControlToField для TListViews, но это evi симо работает с TListViews, а также

Первоначально отправленный ответ

Я не уверен, что вы делаете что-то неправильно, LiveBindings кажется простой багги для меня - увидеть мой ответ на этот Q: Delphi TEdit to filter Tstringgrid with Access. Тот факт, что stringrid показывает строку с дублирующимся ID = 6, но не с ID = 5, показался мне не особенно перспективным, поскольку это была такая вопиющая проблема.

Я не могу заставить LiveBindings работать с ListBox, делая это сам с нуля в новом проекте Seattle VCL или после этой статьи http://edn.embarcadero.com/article/41707. Одна из нескольких проблем, связанных с этой статьей, заключается в том, что она относится к компоненту «TBindScopeDB», который, насколько я могу судить, отсутствует. Даже учитывая тот факт, что это может быть опечатка для «TBindSourceDB», я не получаю описанные результаты, когда пытаюсь выполнить шаги в этой статье, и ListBox, конечно, не заполняется.

Возможно, вы захотите взглянуть на проект SourceForge VCL, который он упоминает, https://radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE2/LiveBindings/bindlist.Я сам не пробовал, но выглядит немного сложнее, чем я ожидал, хотя это потому, что с тех пор XE2 и LiveBindings начали двигаться дальше, я не знаю. Я посмотрел на DFM, и я бы никогда не догадался, что свойствам Expression будут присвоены значения, которые они есть, либо от первых принципов, либо от того, что говорится в статье. Я попытался использовать их в своем проекте, но ListBox остался пустым.

+0

Действительно, во всех документах и ​​сообщениях в блогах используется не существующий TBindScope, в том числе проект svn, о котором вы упоминаете. Я попробую предложение TLinkListControlToField и сообщит о resuls – Bascy

+0

Это работало для вас или у вас все еще есть проблемы? – MartynA

+0

Ни один хаус не смог заставить его работать. Я отложил это на время и написал код для обновления списка comboedit вручную – Bascy