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é
    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.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  2. #2
    Expert éminent sénior
    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
    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
    Rédacteur/Modérateur

    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"
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Membre éprouvé
    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 !!!
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  5. #5
    Rédacteur/Modérateur

    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 ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

###raw>template_hook.ano_emploi###