1 pièce(s) jointe(s)
TListView paginé. J'ai besoin de quelques suggestions
Bonjour,
Toujours dans mes TListViews pour afficher mes données j'ai constaté que le remplissage de celles-ci (Livebindings) posait des soucis en cas de nombre d'enregistrements important.
Après avoir vérifier en monitorant les données, je me suis apperçu que rowsetsize était ignoré et toutes les lignes étaient récupérées, contrairement à une grille.
Ma première solution fut de faire le remplissage en deux temps (au démarrage du programme avec un nombre de lignes déterminées : clause LIMIT ou équivalent dans une macro) puis, dans un Thread, ôter cette limite pour obtenir l'ensemble de données entier. Avantage la recherche à l'intérieur de la liste par la suite.
Durant mes recherches je suis "tomber" sur un post demandant comment un TListView pourrait être paginé. Divers essais (un avec une BDD Firebird, l'autre avec SQLite) plus tard j'ai pu trouvé une solution assez satisfaisante (utilisation des fetchoptions de Firedac : fmOnDemand, RecsSkip, RecsMax) et finalement simple. Inconvénient la recherche, utilisation de TSearchBar, ne peut fonctionner puisque seule une petite partie du dataset est chargé.
J'ai voulu aller plus loin et ajouter une navigation par page "à la mode web"
Pièce jointe 587692
C'est là que j'ai besoin de lumières.
Sous windows c'est "nickel" même s'il faut certainement que je change la couleur navy en autre chose
Sous Android quelques soucis mineurs :
- la zone Edit, même si on est sur la page 1 le chiffre 2 est beaucoup plus gros
- l'appel du clavier virtuel, du fait que ma "barre de navigation" est en bas (je trouve ça plus naturel) évidement le clavier cache la zone de saisie (il va falloir que je règle ça c'est énervant)
- j'ai l'impression que la couleur de la fonte n'est pas toujours prise en compte
Des idées pour améliorer cet interface ?
Pour ceux que ça intéresse je prévois de faire un petit billet sur ce sujet.
Au cours de ces essais j'ai découvert que SQLite dans ce cadre ne fonctionnait pas comme Firebird, ce qu'une instruction Disconnect (une nouveauté pour moi) en lieu un place d'un Close à régler ce problème.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| procedure TForm3.DebutExecute(Sender: TObject);
begin
FDQuery1.Disconnect();
FDQuery1.FetchOptions.RecsSkip:=-1;
FDQuery1.Open();
end;
procedure TForm3.FDQuery1AfterOpen(DataSet: TDataSet);
//var curpage : integer;
begin
//CurPage:=(FDQuery1.FetchOptions.RecsSkip div FDQuery1.FetchOptions.RecsMax)+1;
//ToPage.Text:=Curpage.ToString;
LinkListControlToField1.Active:=False;
LinkListControlToField1.Active:=true;
.. // partie gestion du "navigateur"
end;
procedure TForm3.FinExecute(Sender: TObject);
begin
FDQuery1.Disconnect();
FDQuery1.FetchOptions.RecsSkip:=(nbPages-1)*FDQuery1.FetchOptions.RecsMax;
FDQuery1.Open();
end;
procedure TForm3.PageArriereExecute(Sender: TObject);
begin
fdQUery1.Disconnect;
fdQuery1.FetchOptions.RecsSkip:=MaxIntValue([FDQuery1.FetchOptions.RecsSkip-FDQuery1.FetchOptions.RecsMax,-1]);
fdquery1.Open;
end;
procedure TForm3.PageAvantExecute(Sender: TObject);
begin
if nbRecords-(FDQuery1.FetchOptions.RecsMax+FdQuery1.FetchOptions.RecsSkip)<1 then exit; // fin de fichier
fdQUery1.disconnect;
fdQuery1.FetchOptions.RecsSkip:=MaxIntValue([FDQuery1.FetchOptions.RecsSkip,0])+FDQuery1.FetchOptions.RecsMax;
fdquery1.Open;
end; |