2016-03-31 4 views
2

Ich habe eine Cross-Plattform-App, die eine TFDMemtable (FireDAC) enthält.Build TListView programmgesteuert keine Livebindungen

Meine Frage ist, wie würde man manuell ein TListView aus den Datensätzen in dieser Tabelle erstellen?

Die Tabelle, die ich habe, enthält eine Liste männlicher Vornamen in alphabetischer Reihenfolge.

z.B. Adam, Anthony, Alan, Brian, Bill, Bob, Ben, Charlie, Craig, Christopher, Colin und so weiter.

Ich möchte, dass die Listenansicht Gruppierungen gehören für die Namen, so A, B, C usw.

ich bisher folgendes haben:

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; 

Der obige Code nicht mir geben die Ergebnis Ich bin nach, was passiert ist, ich bekomme jeden Namen unter jeder Buchstabengruppe (AZ) dupliziert.

Alle Vorschläge/Hilfe würde sehr geschätzt werden. Danke

+0

Bitte nicht mit –

Antwort

2

Sie müssen Ihre Logik etwas ändern, um zuerst die Kopfzeile und dann die Namen unter dieser Kopfzeile und dann die nächste Kopfzeile und den Satz von Namen hinzuzufügen. Hier ist eine vollständige Test-App, die demonstriert. Sie müssen ein FMX TListView und ein TClientDataSet in Ihrem Formular ablegen und das FormCreate-Ereignis verbinden, damit es funktioniert. (Beachten Sie, dass der Index auf dem ClientDataSet benötigt wird, um sicherzustellen, dass die Namen in der richtigen Reihenfolge sind; wenn sie nicht alphabetisch sind, funktioniert der Code nicht, da er die Daten nicht finden kann, die zum Hinzufügen benötigt werden . Abschnitt)

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. 

Hier ist ein Screenshot von einem Mittelabschnitt dieser Probe App Listview, so können Sie die Ergebnisse sehen:

ListView displaying alpha list with section headers

+0

Vielen Dank für Ihre Anregung verwenden, aber Leider scheint es nicht zu funktionieren, es baut nur die Gruppen (A, B, C usw.) auf und nicht die Namensfelder innerhalb der Gruppen. Ihr Code scheint im Vergleich zu dem, was ich getan habe, viel klarer zu sein, also werde ich sehen, wo ich sonst noch hingehen kann und hoffentlich mein Ziel erreichen! –

+0

@ 6String_Coder: Siehe meinen aktualisierten Beispielcode. Es zeigt, dass es richtig funktioniert. –

+0

Ich kann es auf Windows, aber nicht Android oder iOS arbeiten, die Listview bleibt leer. –

Verwandte Themen