IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

TListView paginé. J'ai besoin de quelques suggestions


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 555
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 555
    Billets dans le blog
    65
    Par défaut 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"

    Nom : Capture.PNG
Affichages : 224
Taille : 97,9 Ko

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 555
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 555
    Billets dans le blog
    65
    Par défaut
    Bonjour et meilleurs vœux,

    Je me réponds sur quelques points.
    la zone Edit, même si on est sur la page 1 le chiffre 2 est beaucoup plus gros
    il suffit de changer la propriété StyleSettings avec uniquement [Family] pour régler le problème, d'un autre côté, jouer sur la taille des Fontes au lieu de la couleur c'est une pensée intéressante

    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)
    un premier layout contenant le TlistView et mon pseudo-navigateur aligné au client
    un second layout aligné en bas, invisible et ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm3.FormVirtualKeyboardShown(Sender: TObject;
      KeyboardVisible: Boolean; const Bounds: TRect);
    begin
    if KeyboardVisible then
     begin
      Layout2.Height:=Bounds.Height;
      Layout2.Visible:=True;
     end;
    end;
    le layout2 étant rendu invisible après la pagination et c'est nickel

    Du coup, la question de la retaille de fenêtre se pose également (en cas de changement d'orientation sous Android, agrandissement sous windows)
    Une rotation de l'écran lève t'il l'évènement onResize ? Après tests il s'avère que oui
    Il n'y a plus qu'à tester tout ça, trouver les cas qui m'échappent dans la navigation et je rédigerais mon papier pour vos étrennes (si vous êtes sages )

    - j'ai l'impression que la couleur de la fonte n'est pas toujours prise en compte
    une erreur de ma part

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/03/2011, 12h45
  2. Réponses: 2
    Dernier message: 10/05/2007, 17h10
  3. [M1][W1][D1?][N1?] Quelques suggestions de Question/Réponse.
    Par Mathieu Francesch dans le forum Contribuez
    Réponses: 5
    Dernier message: 23/08/2006, 13h37
  4. Besoin de quelques conseils pour un script java
    Par poussin544 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/03/2006, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo