2

Delphi Seattle を使用して、現在のプロジェクトでライブバインディングのコツをつかもうとしていて、外部から入力された TFDMemTable を含むフォームを作成しました。memTable は、TGrid と TListbox に接続されています。グリッドにはすべての情報が表示されますが、リストボックスは空のままです。

私は何を間違っていますか?

コード (実際の状況から単純化されていますが、空のリストボックスが表示されています):

    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.

ライブバインディングの定義:

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

終わり

LinkFillControlToField1 の FillExpression をこれに設定しようとしました:

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

しかし、同じ結果で..空のリストボックス

4

1 に答える 1

2

アップデート:

LiveBindings を使用して TClientDataSet から ListBox に値を設定する 2 回目の試みから得たこの例に従えば、うまく動作するはずです。以下のこの回答の元のバージョンで言及した 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;

これと私の以前の試みとの唯一の違いは、

LinkListControlToField1: TLinkListControlToField

TLinkListControlToField は TListViews 用であると想定していましたが (間違って判明しました)、明らかに TListViews でも機能します。

最初に投稿された回答

あなたが何か間違ったことをしているとは思いません.LiveBindingsは私には単純にバグがあるようです-このqに対する私の答えを参照してください: Delphi TEdit to filter Tstringgrid with Access stringrid が ID=6 の重複した行を示しているが、ID=5 の行が重複していないという事実は、非常に明白な問題であるため、特に有望ではないと思いました。

LiveBinding を ListBox で動作させることができません。新しいシアトル VCL プロジェクトで自分でゼロから行うか、この記事http://edn.embarcadero.com/article/41707に従ってください。その記事のいくつかの問題の 1 つは、「TBindScopeDB」コンポーネントを参照していることです。これは、私が見る限り存在しません。「TBindSourceDB」のタイプミスである可能性があるという事実を考慮しても、この記事の手順に従おうとすると、説明されている結果が得られず、ListBox にはデータが取り込まれません。

言及されている SourceForge VCL プロジェクト、https: //radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE2/LiveBindings/bindlist を参照してください。私は自分で試したことはありませんが、予想よりもはるかに複雑に見えますが、それが XE2 用であり、LiveBindings がそれ以降に移行したためかどうかはわかりません. 私は DFM を見ましたが、第一原理から、または記事で述べられていることから、Expression プロパティに値が与えられるとは思いもしませんでした。プロジェクトでそれらを使用しようとしましたが、ListBox は空のままでした。

于 2016-05-20T12:58:55.393 に答える