2016-05-20 15 views
2

Mit Delphi Seattle versuche ich, in unserem aktuellen Projekt den Anfang der Livebinding zu bekommen und habe ein Formular mit einem extern gefüllten TFDMemTable erstellt. Die memTable ist mit einem TGrid und einer TListbox verbunden. Das Raster zeigt alle Informationen an wie es sollte, aber die Listbox bleibt leer.Livebinding Listbox bleibt leer, Grid ist gefüllt

Was mache ich falsch?

-Code (von der tatsächlichen Situation vereinfacht, aber immer noch leer Listbox angezeigt):

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 Definitionen:

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 

Ende

ich aslo versucht, die FillExpression der LinkFillControlToField1 Einstellung dies:

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

aber mit dem gleichen Ergebnis .. leer listbox

Antwort

2

Update:

Hoffentlich, wenn Sie folgen diesem Beispiel, das bei Verwendung von Livebindings von meinem zweiten Versuch ist ein ListBox Fom eine TClientDataSet, bevölkert Sie sollten in der Lage sein, es funktioniert auch zu bekommen. Vielleicht möchten Sie das Problem mit dem Auffüllen eines TStringGrid beachten, das ich in der ursprünglichen Version dieser Antwort unten erwähne.

DFM extrahieren

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 

-Code extrahieren

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; 

Das einzige, was zwischen diesen amd meinem früheren Versuch anders ist die

LinkListControlToField1: TLinkListControlToField 

I (fälschlicherweise angenommen hatte, es stellt sich heraus, dass ein TLinkListControlToField für TListViews war, aber es evi hängig arbeitet mit TListViews auch

Ursprünglich ausgeschildert Antwort

Ich bin nicht sicher, Sie etwas falsch machen, Livebindings scheinen schlicht Buggy mir - meine Antwort auf diese q sehen: Delphi TEdit to filter Tstringgrid with Access. Die Tatsache, dass das Fadenkreuz die Zeile mit ID = 6 dupliziert zeigt, aber nicht die mit ID = 5, erschien mir als nicht sonderlich vielversprechend, da es ein so eklatantes Problem war.

Ich kann LiveBindings auch nicht mit einer ListBox arbeiten, indem ich selbst in einem neuen Seattle VCL-Projekt von Grund auf neu arbeite oder diesem Artikel folgt http://edn.embarcadero.com/article/41707. Eines von mehreren Problemen mit diesem Artikel ist, dass es sich auf eine "TBindScopeDB" -Komponente bezieht, die soweit ich sehe, nicht existiert. Selbst unter Berücksichtigung der Tatsache, dass es sich um einen Tippfehler für "TBindSourceDB" handelt, bekomme ich die beschriebenen Ergebnisse nicht, wenn ich versuche, die Schritte in diesem Artikel zu befolgen, und die ListBox wird sicherlich nicht aufgefüllt.

Vielleicht möchten Sie sich das SourceForge VCL-Projekt ansehen, das es erwähnt, https://radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE2/LiveBindings/bindlist.Ich habe es selbst nicht ausprobiert, aber es sieht verdammt viel komplizierter aus, als ich erwartet habe, obwohl es, weil es für XE2 und LiveBindings war, seitdem weitergegangen ist, weiß ich nicht. Ich habe mir die DFMs angeschaut und ich hätte nie gedacht, dass die Expression-Eigenschaften die Werte erhalten, die sie entweder aus den ersten Prinzipien oder dem, was sie in dem Artikel sagt, sind. Ich habe versucht, sie in meinem Projekt zu verwenden, aber die ListBox blieb leer.

+0

Tatsächlich verwenden alle Dokumentationen und Blogposts das nicht vorhandene TBindScope, einschließlich des von Ihnen genannten svn-Projekts. Ich werde den TLinkListControlToField-Vorschlag versuchen und die Ergebnisse melden – Bascy

+0

Hat dies für Sie funktioniert oder haben Sie immer noch ein Problem? – MartynA

+0

Nein, ich konnte es nicht zur Arbeit bringen. Ich habe es vorerst auf Eis gelegt und den Code geschrieben, um die Comboedit-Liste manuell zu aktualisieren – Bascy

Verwandte Themen