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 :

Dans une DBGrid, comment faire pour afficher des enregistrements précis de la base de


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Dans une DBGrid, comment faire pour afficher des enregistrements précis de la base de
    Bonjour,

    J'utilise une DBGrid dans laquelle, je sélectionne un enregistrement, ensuite, j'effectue quelques opérations comme du filtrage, ... et au retour, l'enregistrement initialement sélectionné est centré sur la DBGrid or j'aimerais qu'il retrouve sa place initiale.

    Plus généralement, comment fait-on pour indiquer à une DBGrid quel enregistrement elle doit afficher sur sa 1ère ligne ?

    Je n'arrive pas utilser TopRow car il n'est pas accessible !

    Y a-t-il une solution ?

    Merci d'avance

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    hum, il faut essayer de jouer un peu

    Déclare une classe dans l'unité ou tu veux changer tes lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    THackDBGrid = class(DBGrid);
    normalement, dans cette unité, tu vas pouvoir accèder au propriétés protected (tu as un tuto à ce sujet)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    THackDBGrid (MaGrille).TopRow := ...
    Par contre, j'ignore si cela fonctionne vraiement, car la DBGrid affiche DataSet, contrairement à une TStringGrid où tu as toute la grille en mémoire, la DBGrid gère cela plus subtilement ... j'avais eu envie de faire ça un jour à mes débuts, je n'ai pas réussi, c'est que c'est une sacrée bestiole ce DBGrid

    ou sinon simuler un WM_VSCROLL (la DBGrid gère complètement ce message à la main dans la méthode surchargé WMVScroll), la Grille est un composant Delphi pur, un composant comme le TListView qui est une encapsulation de classes Windows, intègre en général la fonction (message) pour changer le premier item visible (XX_GETFIRSTVISIBLELINE)

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Points : 43
    Points
    43
    Par défaut
    J'ai pas essayé !

    Filtrer le dataset de telle sorte que seul subsite l'enregitrement en cours
    il devrait se placer au début de la grille
    Supprimer le filtre (ou remettre l'ancien )
    pourquoi se déplacerait-il ?

    Sinon, il ya des tas d'autres composants DBGrid dont certains on une propriété 'hauteur de la ligne' (JvDBUltimGrid de la JVCL ou SMDBGrid de SMComponents). Mais la faut faire des Maths ! et peut-être s'assurer que la Grille n'affiche que des lignes entières.

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    La DBGrid est un composant compliqué, il réagit au filtre, biensur via son DataLink, mais le fait d'afficher les mêmes choses au même endroit n'est pas fondamental, sachant que tu peux enchainer des filtres différents, ...

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Je n'ai peut être pas bien saisi ce qui était recherché, mais je me permet d'ajouter tout de même mon grain de sel ...
    Une idée qui peut, peut être, servir de piste : j'ai utiliser l'idée d'un TBookmark et une astuce trouvée dans la FAQ Delphi pour indiquer l'enregistrement qui doit apparaitre en début de liste dans le DBGrid; et ceci semble fonctionner même après un filtre et cie ...

    Donc un bout de code:
    . j'ouvre la table, je place un Bookmark, et je recale la liste sur l'enregistrement 'ciblé' par le Bookmark
    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
     
    procedure TForm2.Button16Click(Sender: TObject);
    var
    lo : TLocateOptions ;
    PosGrid : integer;
    I : integer;
    begin
    TableAide1Paradox.Active := true;
     
      lo:=[loCaseInsensitive];
      DSaide.DataSet.Locate(DSaide.DataSet.Fields.Fields[0].DisplayName, 'H', lo);
     
      bm := DSaide.DataSet.GetBookmark;
     
      PosGrid := TDrawGrid(DBGrid2).Row;
        for I := 1 to PosGrid - 1 do
          begin
            PostMessage(DBGrid2.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
          end;
    end;
    . je filtre le Dataset sur un autre enregistrement - histoire de jouer - puis je 'libère' la table du filtre et recale la liste comme précédemment
    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
     
    procedure TForm2.Button18Click(Sender: TObject);
    begin
    DSaide.DataSet.Filtered := false;
        DSaide.DataSet.Filter := ' ALPHAB = ''U''';
    DSaide.DataSet.Filtered := true;
    end;
    //---------------------------------------------------
    procedure TForm2.Button19Click(Sender: TObject);
    var
    PosGrid : integer;
    I : integer;
    begin
    DSaide.DataSet.Filtered := false;
    DSaide.DataSet.GotoBookmark(bm);
      PosGrid := TDrawGrid(DBGrid2).Row;
        for I := 1 to PosGrid - 1 do
          begin
            PostMessage(DBGrid2.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
          end;
    end;
    J'ai trituré un peu le DBGrid dans sa hauteur, et il semble que la liste se recale toujours comme il faut.

    En espérant aider,
    @+

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

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    C'est comme, je le disais jouer avec WM_VSCROLL en accèdant au propriété des ancêtres ...

    en ajoutant des Enable/DisableControl pour éviter les défilements visibles, cela me semble fonctionnel, ...

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/11/2011, 15h52
  2. Réponses: 13
    Dernier message: 29/07/2009, 20h25
  3. [MySQL] Php, je ne comprends pas comment faire pour introduire des données dans une table
    Par Liondd dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 14/12/2006, 12h53
  4. Réponses: 1
    Dernier message: 18/07/2006, 23h38
  5. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 15h31

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