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 VCL Delphi Discussion :

Empêcher un DBCtrlGrid de se centrer sur la ligne sélectionnée ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut Empêcher un DBCtrlGrid de se centrer sur la ligne sélectionnée ?
    Salut à tous,

    J'ai un problème avec un DBCtrlGrid.

    Celui-ci affiche le résultat d'une requête (ADO) qui est réactualisée toute les 3 secondes par un REQUERY, de manière a refléter en temps quasi-réél les modifs faites sur les autres postes.

    Le problème se pose si la liste contient plus d'enregistrements que le DBCtrlGrid n'a de lignes.

    Exemple : le DBCtrlGrid affiche 9 lignes, et la requête envoie 25 records.
    au début la première ligne sélectionnée correspond au premier records de la requête.
    Si je fais PAGE DOWN, le DBCtrlGrid affiche les 9 records suivants, et c'est toujours la première ligne qui est sélectionnée. Normal.
    Mais lorsque le REQUERY se lance, je dois faire en sorte que l'écran reste positionné sur le record sélectionné, sinon la liste se remet sur le tout premier record.

    Quelle que soit la solution que j'utilise pour revenir à l'enregistrement en cours de sélection avant le REQUERY (bookmark, recno, panelindex), le DBCtrlGrid affiche l'enregistement sélectionné au milieu de l'écran, ce qui est perturbant : avant le requery, la ligne sélectionnée est la première de la grille, après le requery cette ligne "se déplace" au milieu de l'écran alors que l'utilisateur a encore les yeux rivés sur la première ligne.
    L'enregistrement sélectionné est toujours le bon, mais sa position d'affichage ne cesse de changer.


    De plus, le bookmark reste la solution la plus sécurisante, car des enregistrements peuvent avoir été supprimés sur d'autres postes entre deux REQUERY.

    Y a t'il un moyen de mémoriser ou de repositionner la grille de telle manière que l'enregistrement sélectionné ne change pas de place après un rafraichissement de la requête ??

    Merci d'avance.

  2. #2
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut locate
    bonjour

    avant requery tu notes la clé de ton enregistrement (clé := fieldbyname('clé').asstring;

    puis requery

    puis locate la clé pour te repositionner sur l'enregistrement encours
    ( je n'ai pas le code sous la main )

    André

    PS : Avec D2009 sur clé, bouton droit de la souris, refactoring déclaré une variable
    ou alors MAJ+Ctrl+V

  3. #3
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    ah oui, flute, j'ai oublié de dire que j'avais aussi essayé le locate, et ça fait pareil (et c'est même un poil plus long que le reste)

  4. #4
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut datasource.enable:=false;
    pendant le traitement.

    ca accélère beaucoup les choses....

    puis

    datasource.enable := true // après le traitement.

    25 enregistrement c'est pas beaucoup

    lis les un par un jusqu'à que

    // en gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    datasource.enable:=false;
    with Mondataset  do begin
       if is empty then  Requiry else 
       begin
          cle := Fiedbyname('cle').asstring;
          Requiry;
          first; // j'ai cru lire que sa sert à rien, mais bon ca me rassure
          while not Fiedbyname('cle').asstring:=cle do next ;
       end;
    end;
    datasource.enable:=true;
    au moins voir si cela fonctionne, j'ai pas testé, peut-être a corriger un peu
    25 lignes d'enregistrements, si il n'y a pas une infinité de champs, ou des blob très lourds, cela devrait quand être rapide;

    André

  5. #5
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Idée intéressante,

    sauf que...

    arrivé en bas de la première page écran, le next reste sur la dernière ligne de la grille. Au final, le programme retrouve bien l'enregistrement sélectionné, mais il est toujours affiché au bas du DBCtrlGrid (au lieu du milieu avec mes différents essais).

    Il faudrait pouvoir associer un Recno et un PanelIndex, mais je ne vois pas comment...

  6. #6
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut régler la pagination
    Sélectionner les 4 lignes avant et les 4 ligne après

    puis gérer la pagination, un bouton suite si il y en a une et retour si besoin

    pas beau mais bon

    ce que je fais quand j'ai besoin de connaitre des infos sur mes données avant de les afficher.

    Tu peux ouvrir un query

    interroger ce query pour connaitre la cle du 4° enregistrement avant ta clé.

    ensuite dans le dataset tu sélectionne les 9 premiers enregistrement a partir de la clé que tu as chercher précédemment ( en sql " select * first 9 from ma table")

    et tu te cales sur ton enregistrement

    ensuite pour gérer la pagination

    tu te créer des boutons qui commanderont des requêtes type

    select * skip a, first a from ma table. a est un entier.

    Il restera toujours un souci

    si entre la milisecondes ou le qurery prends l'information et celle ou tu ouvres ton dataset des enregistrements sont committés par ailleurs, alors il se peut que le l'enregistrement que tu cherches ne soit pas centré, voir même qu'il n'apparaisse pas.
    Sauf a bloqué la base de donnée le temps que ça se fasse.

    bon courage

    andré

  7. #7
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Dans l'idéal, il faudrait passer par un proxy travailler de façon assynchrone.

  8. #8
    Membre du Club Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Points : 54
    Points
    54
    Par défaut
    Gérer manuellement la pagination pourrait être envisageable si la requête n'était pas si tordue et si gourmande en ressources coté serveur (rien moins que 12 jointures conditionnelles). Si je dois relancer la requête, même en limitant le nombre de records a afficher, les temps de réponse vont s'écrouler.

  9. #9
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Il faut gérer cela astucieusement au niveau SGBDR.
    Ensuite, il faut appeler la requête uniquement s'il y a des changements dans le SGBDR pour minimiser le rafraîchissement, quitte à centraliser l'appel au niveau middleware et ensuite renvoyer les résultats aux postes clients.

Discussions similaires

  1. [MVVM] Datagrid Focus sur une ligne sélectionnée
    Par draco951 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 17/06/2013, 11h36
  2. Réponses: 3
    Dernier message: 19/01/2010, 17h22
  3. Réponses: 1
    Dernier message: 15/05/2007, 17h19
  4. [PHP-JS] Centrer sur la page
    Par draco62 dans le forum Langage
    Réponses: 1
    Dernier message: 10/12/2006, 16h58
  5. GROUP BY, critère sur la ligne sélectionnée
    Par jeremya dans le forum Langage SQL
    Réponses: 1
    Dernier message: 18/04/2006, 17h13

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