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 :

Rendre visible une colonne d'un DbGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut Rendre visible une colonne d'un DbGrid
    Bonjour

    Sous Delphi 10.2, j'ai une DbGrid beaucoup plus large que son conteneur.
    Il faut donc "scroller" horizontalement pour afficher une colonne qui n'est pas initialement pas affichée.

    Est-ce qu'il y a un moyen, par code, de faire afficher une colonne donnée ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 630
    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 630
    Points : 25 333
    Points
    25 333
    Par défaut
    Faire un SendMessage WM_HSCROLL
    Jouer sur LeftCol avec un Hack de la propriété protected de TCustomGrid

    EDIT - PS : Mais c'est toi, j'avais pas vu

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 169
    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 169
    Points : 41 353
    Points
    41 353
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    En fait je ne comprend pas vraiment le problème, ma première réaction en lisant hier soir ce sujet fut : "Il suffit de déplacer la colonne" et pour cela déclarer ces dernières.
    Cela écrit je pars maintenant du principe qu'une grille qui dépasse le cadre de la fenêtre c'est souvent trop d'informations pour l'utilisateur (les intervenenants du Delphi UX summit en penserait certainement la même chose). Je ne jeterai pas la pierre, mes anciens programmes sont là pour démontrer que j'ai abusé des grilles, je prèfère maintenant passer par des listes réduites et un écran "détail" des données d'une ligne .

    maintenant s'il s'agit de se positionner sur une colonne "hors champ" en cliquant sur un bouton c'est une hautre histoire.
    Le "Hack" est effectivement la solution, je le met entre guillement car le Hack a toujours heurté les oreilles "sensibles", avec les nouvelles versions nous avons les Helpers tellement plus diplomatiques . Perso je n'arrive pas à faire la différence entre les deux si ce n'est au niveau code

    Comme je n'ai pas eu le temps de faire un essai mais que le "Hack" de la DBGrid est frais dans ma mémoire suite à cette discussion en voici un exemple

    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
     THackDBGRID = Class helper for TDBGrid // anciennement THackDBGrid = Class(TDBGRid)
      private
        function GetCellPos : TRect;
        function GetScreenCellPos: TRect;
      end; 
     
    ....
    { THackDBGRID }
     
    function THackDBGRID.GetCellPos: TRect;
    begin
    Result:=CellRect(Col,Row);
    end;
     
    function THackDBGRID.GetScreenCellPos: TRect;
    begin
    Result.TopLeft:=ClientToScreen(GetCellPos.TopLeft);
    Result.BottomRight:=ClientToScreen(GetCellPos.BottomRight);
    end;

    Un R:=THackDBGRID(maGrid).GetCellPos "sensible" est remplacé par un simple R:=maGrid.GetCellPos "consensuel"

    P.S. Je suis preneur de toute explication des différences entre Hack et Helper

    Pour en revenir à la question, en théorie donc, il me semble qu'un Helper pourrait positionner la grille sur la colonne pour peu de faire une procédure, quelque chose comme


    procedure THackDBGrid.GotoCol(toCol : integer);
    begin
    Col:=ToCol; // je pense que Col est accessible
    // Repaint ?
    end;
    (erreur invonlontaire de balise que je vais garder)
    Bien sûr cela demande quelques essais, c'est juste une approche, on peut même penser +et pourquoi pas le nom du champ lié ? + c'est largement envisageable (cf . cette proposition de "hack")

    Hum je pense que je vais me laisser tenter

    [Edit] bien, ce n'était pas Col mais LeftCol (vu dans les interventions de ShaiLeTroll) la propriété à toucher ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure THackDBGrid.GotoCol(toCol : integer);
    begin
    LeftCol:=ToCol;  
    end;
    fonctionne dans mon petit test rapide

    cerise sur le gateau, avec un peu de surcharge (peut-être mal faite) avec les noms de champs (champ utilisé à dessin pour ne pas confondre colonne de grille et colonne de table)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     THackDBGRID = Class helper for TDBGrid
      private
        function GetCellPos : TRect;
        function GetScreenCellPos: TRect;
        procedure GotoCol(tocol : integer); overload;
        procedure GotoCol(Champ : String); overload;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure THackDBGRID.GotoCol(Champ: String);
    var c : integer;
    begin
    for c := 0 to Columns.Count-1 do
     if Sametext(Champ,Columns[c].FieldName) then
       begin
         LeftCol:=c;
         Break;
       end;
    end;
    utilisation : DGBrid1.GotoCol('intitule');Il y a un bémol, enfin pour moi, ce positionnement "cache" ou plutôt occulte toutes les colonnes à gauche sauf au cas où cette colonne est la dernière.

    Pourquoi ne pas explorer d'autres pistes comme la propriété visible de chaque colonne ?

    N.B. j'ai gardé sciement le nom THackDBGrid mais un THelpDBGrid serait certainement plus juste Hack fait trop penser à "Pirate"

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Merci à vous deux pour vos suggestions.

    La solution était simple, utiliser la propriété LeftCol que je ne connaissais pas.
    Elle est protected, mais c'est pour un composant dérivé.
    Donc, pas besoin de Hack, ni de Helper, ni de SendMessage, et c'est tant mieux.

    Juste pour la petite histoire :
    1) Hack en anglais se traduit par pirate, mais aussi par bidouillage et même éventuellement par amateur... je vous laisse conclure.
    2) On m'a demandé de réaliser une DbGrid contenant pas moins de 320 colonnes !!!

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 169
    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 169
    Points : 41 353
    Points
    41 353
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par tintinux Voir le message
    2) On m'a demandé de réaliser une DbGrid contenant pas moins de 320 colonnes !!!
    Les écrans élastiques sont fournis ?

Discussions similaires

  1. [WD12] Rendre visible une colonne de table
    Par zouzoukha dans le forum WinDev
    Réponses: 3
    Dernier message: 14/12/2009, 11h08
  2. Postionnement dans une colonne dans un DBGrid
    Par Jeankiki dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/01/2005, 00h05
  3. Somme de valeurs d'une colonne d'un DBGrid
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/12/2004, 23h58
  4. Réponses: 10
    Dernier message: 19/05/2004, 15h44
  5. [C#] Comment faire pour rendre invible une colonne(ListView)
    Par Jfrancois57 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2004, 13h27

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