2016-03-31 23 views
2

私はTFDMemtable(FireDAC)を含むクロスプラットフォームのアプリケーションを持っています。プログラムでライブバインディングを使用しないでTListViewを構築する

私の質問は、手動でこのテーブルのレコードからTListViewを構築する方法は?

私が持っているテーブルには、男性の姓がアルファベット順に記載されています。

アダム、アンソニー、アラン、ブライアン、ビル、ボブ、ベン、チャーリー、クレイグ、クリストファー、コリンなど。

私はAそう、B、Cなど、リストビューは、名のグループを含める

私はこれまで、次のいる:

procedure BuildNameList; 
var Litem : TListViewItem; 
c : Char; 
begin 
    ListView1.BeginUpdate; 
    try 
    ListView1.ClearItems; 

    for c := 'A' to 'Z' do 
    begin 
    with ListView1.Items.Add do 
    begin 
     Text := char(c); 
     Purpose := TListItemPurpose.Header; 
    end; 

    with dmod.tableNames do 
    begin 
    First; 
    while not Eof do 
    begin 
     Litem := ListView1.Items.Add;   
     Litem.Text := dmod.tableNames.FieldByName('ForeName').AsString; 
     Next; 
    end; 
    end; 
    end; 
    finally 
    ListView1.EndUpdate; 
end; 

上記のコードは私に与えるものではありません結果私は後になりますが、私はすべての文字グループ(AZ)の下にすべての名前が重複しています。

ご提案/ご協力いただければ幸いです。 ありがとう

+0

があなたの提案を –

答えて

2

最初にヘッダーを追加してから、そのヘッダーの下に名前を付け、次にヘッダーと名前のセットを追加する必要があります。ここに示すのは、完全なテストアプリです。 FMX TListViewとTClientDataSetをフォームにドロップし、FormCreateイベントを接続して動作するようにする必要があります。 (名前が適切な順序になるように、ClientDataSetにインデックスが必要であることに注意してください。アルファベットではない場合、コードは機能しません。 。あなたが結果見ることができるように節)

unit Unit3; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, Data.DB, 
    Datasnap.DBClient, FMX.ListView; 

type 
    TForm3 = class(TForm) 
    ListView1: TListView; 
    CDS: TClientDataSet; 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    procedure BuildNameList; 
    public 
    { Public declarations } 
    end; 

var 
    Form3: TForm3; 

implementation 

{$R *.fmx} 

procedure TForm3.BuildNameList; 
var 
    Item: TListViewItem; 
    Ch: Char; 
begin 
    ListView1.BeginUpdate; 
    CDS.First; 
    try 
    ListView1.ClearItems; 
    for Ch := 'A' to 'Z' do 
    begin 
     Item := ListView1.Items.Add; 
     Item.Text := Ch; 
     Item.Purpose := TListItemPurpose.Header; 

     while (CDS.FieldByName('SurName').AsString[1] = Ch) and (not CDS.Eof) do 
     begin 
     Item := ListView1.Items.Add; 
     Item.Text := CDS.FieldByName('SurName').AsString + ', ' + 
        CDS.FieldByName('ForeName').AsString; 

     CDS.Next; 
     end; 
    end; 
    finally 
    ListView1.EndUpdate; 
    end; 
end; 

procedure TForm3.FormCreate(Sender: TObject); 
begin 
    // Create some test data 
    CDS.FieldDefs.Add('ForeName', ftString, 20); 
    CDS.FieldDefs.Add('SurName', ftString, 30); 
    CDS.CreateDataSet; 
    CDS.Open; 
    CDS.AppendRecord(['John', 'Smith']); 
    CDS.AppendRecord(['Jane', 'Doe']); 
    CDS.AppendRecord(['Ralph', 'Richards']); 
    CDS.AppendRecord(['Fred', 'Fredericks']); 
    CDS.AppendRecord(['Sam', 'Samuels']); 
    CDS.AppendRecord(['Walter', 'Williams']); 
    CDS.AppendRecord(['Ann', 'Anderson']); 
    CDS.AppendRecord(['Bob', 'Barnes']); 

    // Index it to put it in alphabetical order 
    CDS.IndexDefs.Add('Names', 'SurName;ForeName', []); 
    CDS.IndexName := 'Names'; 
    BuildNameList; 
end; 

end. 

はここで、そのサンプルアプリのリストビューの中央部分のスクリーンショットです:

ListView displaying alpha list with section headers

+0

おかげで使用しないでくださいしかし、残念ながら、それは動作するようには見えず、グループ内の名前フィールドではなく、グループ(A、B、Cなど)のみを構築します。あなたのコードは、私が行ったことと比べてはるかに明確に見えるので、私はここからどこに行くことができ、うまくいけば私の目標を達成することができます参照してください! –

+0

@ 6String_Coder:更新されたサンプルコードを参照してください。それは正しく動作することを示しています。 –

+0

私はWindows上で動作することができますが、AndroidやiOSでは動作しません。リストビューは空のままです。 –

関連する問題