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 :

TDBgrid et OnDrawColumnCell


Sujet :

Composants VCL Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut TDBgrid et OnDrawColumnCell
    bjr

    j'affiche à l'aide d'un TDBGrid le résultat d'une requête (TIBQuery). Je dimensionne d'abord dans le FormShow les colonnes du TDBGrid à l'aide de la taille des Title :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for I := 0 to dbgCampagne.Columns.Count - 1 do begin
         dbgCampagne.Columns[i].Width := 5 + dbgCampagne.Canvas.TextWidth(dbgCampagne.Columns[i].title.caption);;
         end;
    puis dans l’évènement OnDrawColumCell j'ajuste si nécessaire la colonne en l'agrandissant en fonction du contenu de la cellule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    w := 5+dbgCampagne.Canvas.TextWidth(Column.Field.DisplayText);
      if w>column.Width then
        Column.Width := w;
    Tout ceci fonctionne sauf que :

    Dès que le code ci-dessus est terminé et que l'application rend la main le curseur du TDBGrid est positionné sur la dernière ligne (première colonne). Il est impossible de sélectionner une cellule ou une ligne du TDBGrid avec la souris.Pour y parvenir il faut soit redimensionner la fenêtre (ce qui active à nouveau OnDrawColumCell) soit utiliser la touche TAB (ce qui fait la même chose). Ensuite seulement la souris peut être utilisée pour sélectionner des lignes. C'est ergonomiquement assez gênant. La responsabilité du code du OnDrawColumCell est certaine. Si je le retire les colonnes sont ajustées au titre mais le TDBGrid est sensible à la souris.

    Les options du TDBGrid sont celles par défaut.

    La propriété SQL de TIBQuery contient des agrégats (précision à toutes fins utiles)

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 035
    Points : 40 940
    Points
    40 940
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ne serait-il pas plus simple (en tout cas certainement plus rapide) de rechercher la taille max des données dans le FormShow et donc de calculer la largeur à ce moment là ?
    Puisqu'il y a IBQuery c'est donc Interbase ou Firebird une requête du Style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(CHAR_LENGTH(:champ)) AS N FROM table
    et un calcul du style


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Fait à l'arrache 
    IBQuery.ParamByName('Champ').asString:=dbgCampagne.Columns[i].FieldName;
    IBQUery.Active:=True;
    n:=IBQuery.FieldByName('n').asINteger; 
    IBQuery.Active:=False;
    n  := 5+dbgCampagne.Canvas.TextWidth(StringOfChar('W',n);  // j'ai utilisé W car il me semble que c'est le char le plus 'large'
    w := 5 + dbgCampagne.Canvas.TextWidth(dbgCampagne.Columns[i].title.caption);
    dbgCampagne.Columns[i].Width :=MaxInt(n,w);
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Il y a sûrement des moyens divers pour ajuster la taille des colonnes et je note celle que tu me proposes qui est intéressante pour les tables ayant peu de lignes (et peu de variation de taille de champs donc).

    Si on doit la généraliser cela me parait peut être un peu lourd de doubler toute utilisation d'un ensemble de données par un autre, chargé uniquement de repérer la taille maximum des champs affichés. Mais j'y vois un autre inconvénient c'est que la taille maximale des champs peut être assez variable en balayant la table et que le procédé fixe une fois pour toute la taille maximale de tous les champs. L'intérêt d'un ajustement à la volée est précisément de jouer sur la répartition aléatoire des grandes chaines pour maximiser le contenu visible.

    Et puis cela ne règle aucunement ce qui me semble être un dysfonctionnement.

    Merci tout de même de cette idée.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut [Résolu]
    Cette méthode de réglage dynamique des colonnes est fortement déconseillée dans la mesure où elle entraîne des appels récursifs à l'évènement OnDrawColumnCell. Le dysfonctionnement constaté, en apparence aléatoire, dépend de la taille des contenus des champs de la table affichée.
    A ce sujet j'attire l'attention sur la propriété DataLink du TDBGrid qui donne accès aux enregistrements actuellement affichés dans le TDBGRID cela ouvre l'accès à un ajustement dynamique de colonnes qui ne passe pas par l'utilisation de l'évènement cité.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/02/2014, 17h22
  2. TDBGRID - Couleur de fond d'une seule cellule
    Par cgo dans le forum Bases de données
    Réponses: 5
    Dernier message: 11/09/2009, 10h16
  3. Table Access et Accents dans TDBGrid
    Par puzpuz_vannes dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/11/2003, 22h23
  4. [TDBGrid] Multisélection de lignes pour suppression
    Par littledoudou dans le forum C++Builder
    Réponses: 9
    Dernier message: 05/11/2003, 10h42
  5. Dimensions des colonnes d'un TDBGrid
    Par osmose22 dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/12/2002, 11h27

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