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 :

TopRow d'une DBGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 838
    Points : 1 736
    Points
    1 736
    Par défaut TopRow d'une DBGrid
    Bonjour,

    Avec Delphi 10.2 j'utilise une dbGrid et je constate que TopRow est toujours égal à 1 même lorsque l'utilisateur fait un scroll vertical et que la première ligne affichée est supérieure à 1.

    Est ce qu'il y a une option ou une propriété qui empêcherait TopRow d'indiquer le numéro de la ligne qui est la première affichée ( visible ) ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 162
    Points : 21 430
    Points
    21 430
    Par défaut
    Une DBGrid ne contient pas de données, c'est une visualisation comme une TDrawGrid différent du fonctionnement du TStringGrid
    TopRow est protégé et y accéder implique un hack du protected.

    Il faut exploiter le curseur du DataSet et non la Grille
    Row est protégé aussi, toujours via un hack on peut savoir la ligne en cours dans la grille par rapport à la ligne dans le DataSet, cela peut permettre via un WM_VSCROLL de réafficher une grille à la même position après un Refresh par exemple

    tu peux à partir de Row + RecNo, trouver le RecNo du premier enregistrement visible.
    Un petit calcul sur DefaultRowHeigth permet aussi en fonction du CellRect de s'y retrouver.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 838
    Points : 1 736
    Points
    1 736
    Par défaut
    Bonjour,

    Citation Envoyé par ShaiLeTroll Voir le message
    TopRow est protégé et y accéder implique un hack du protected.
    Pourtant si j'en crois l'aide, on peut y accéder en lecture ( Vcl.Grids.TCustomGrid.TopRow )

    Merci pour ta réponse mais la propriété Row et RecNo ne m'intéressent pas car je dois afficher certaines valeurs lors du passage de la souris sur les lignes du tableau, j'utilise donc pour cela le OnMouseMove du tableau.
    Cela fonctionne bien jusqu'à ce que un scroll est effectué. Normal car j'arrive pas à connaitre le numéro de la première ligne affichée...

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 162
    Points : 21 430
    Points
    21 430
    Par défaut
    Citation Envoyé par free07 Voir le message
    ...la propriété Row et RecNo ne m'intéressent pas
    Justement si !
    Si tu sais quelle est la ligne active en Row du DBGrid qui correspond à un RecNo ou Bookmark d'un DataSet, tu peux donc trouver le RecNo du Row = 1* qui sera la première visible
    C'est une sorte de règle de 3.
    De plus, comment tu récupères tes données au mouvement de la souris ?
    Est-ce les données d'un autre DataSet ?
    ça serait préférable car vouloir lire les données du DataSet liée au DBGrid, tu fais un Locate\Next\Prior ce qui décale le visuel et ça partirait totalement en vrille quoi qu'avec DisableControls, tu dois pouvoir gérer cela, en lisant le code du TDBGrid, on peut d'ailleurs voir comme en interne lui-même lit un lot d'enregistrement sans déplacer le curseur dans la DataSet pour afficher par exemple les 20 premiers tout restant au début du DataSet.

    Ayant donc trouver l'offset entre Row et RecNo, via CellRect tu peux trouver le Row et ainsi calculé le RecNo
    Evidemment le terme RecNo est un concept, certains DataSet ne le gère pas, tu dois donc le voir comme étant une valeur de décalage à utiliser avec MoveBy pour te déplacer selon une formule MoveBy(Row@Mouse - RowOfCurrent).
    RowOfCurrent devant être recalculé durant chaque AfterScroll.


    1*, FixedRows est à 1 pour les titres.


    Si ta grille n'est pas trop longue, genre 5000 lignes, tu peux te permettre une TListView sans trop de perte de performance liée au remplissage.
    Plus, faudrait gérer manuellement une pagination et ce n'est pas si évident que ça
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 838
    Points : 1 736
    Points
    1 736
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Justement si !
    Effectivement, je viens de voir que le RecNo - Row = Nombre de lignes en début de grille qui ne sont pas affichées. donc le résultat de cette différence me donne la première ligne affichée.

    Citation Envoyé par ShaiLeTroll Voir le message
    Si tu sais quelle est la ligne active en Row du DBGrid qui correspond à un RecNo ou Bookmark d'un DataSet, tu peux donc trouver le RecNo du Row = 1* qui sera la première visible
    C'est une sorte de règle de 3.
    De plus, comment tu récupères tes données au mouvement de la souris ?
    Est-ce les données d'un autre DataSet ?
    C'est le dataset de la grille en question mais je gère effectivement le Disable et EnableControls avec le BookMark pour me remettre sur la ligne en cours.

    Merci pour ton aide.

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

Discussions similaires

  1. Impression d'une DBGrid
    Par Buddha Barge dans le forum C++Builder
    Réponses: 8
    Dernier message: 21/02/2006, 15h55
  2. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20
  3. sélection colonnes et lignes d'une dbgrid
    Par propa dans le forum Bases de données
    Réponses: 6
    Dernier message: 13/05/2004, 10h32
  4. Données dans une DBgrid
    Par camino dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/02/2004, 03h40
  5. Affichage ds une DBGrid
    Par TieumB dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/01/2004, 16h52

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