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 :

Ajustement automatique des colonnes TDBGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 672
    Billets dans le blog
    1
    Par défaut Ajustement automatique des colonnes TDBGrid
    Bonjour,

    Je rencontre un petit souci avec le redimensionnement automatique des colonnes.

    Il peut arriver que certaines colonnes soient bien plus grandes qu'elles ne devraient l'être.
    En règle générale, le problème concerne les types de données de type ftString avec des tailles de champ de 255 caractères.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    { Private : AutoColumnWidth }
    procedure TFMyDB.AutoColumnWidth;
    const
      Marge = 10;
    var
      TextWidth, I, RecNo: Integer;
      ColWidth: array of Integer;
    begin
     
      with DBTable do // TDBGrid
      begin
        SetLength(ColWidth, Columns.Count);
     
        DataSource.DataSet.DisableControls;
        RecNo := DataSource.DataSet.RecNo;
        Canvas.Font := Font;
     
        for I := 0 to Columns.Count - 1 do
          ColWidth[I] := Canvas.TextWidth(Columns[I].Title.Caption) + Marge;
     
        DataSource.DataSet.First;
        if DataSource.DataSet.RecordCount > 0 then
        begin
          while not DataSource.DataSet.Eof do
          begin
            for I := 0 to Columns.Count - 1 do
            begin
              TextWidth := Canvas.TextWidth(Columns[I].Field.DisplayText);
     
              if TextWidth > ColWidth[I] then
                ColWidth[I] := TextWidth + Marge;
            end;
     
            DataSource.DataSet.Next;
          end;
        end;
     
        for I := 0 to Columns.Count - 1 do
          Columns[I].Width := ColWidth[I];
     
        SetLength(ColWidth, 0);
        DataSource.DataSet.RecNo := RecNo;
        DataSource.DataSet.EnableControls;
      end;
    end;
    Exemple avec une table sans aucune données
    Nom : 1.PNG
Affichages : 209
Taille : 35,6 Ko
    Nom : 2.PNG
Affichages : 209
Taille : 45,2 Ko

    On peut observer que la colonne Titre ne présente aucune donnée et qu'elle est excessivement longue par rapport à la longueur du titre de la colonne.

    En effet, le DBGrid attribue automatiquement des largeurs de colonnes en fonction du type de données de la colonne, Selon moi, c'est la cause du problème (Si la valeur attribuée de la colonne est plus grande que la longueur du titre de la colonne, elle n'est forcément pas redimensionnée).

    A l'inverse, centaine de colonnes sont aussi surdimensionnées par rapport à ce qu'elles contiennent (Toujours avec un type de données ftString).

    Dans cette situation, les données de la colonne (Langue) ne dépassent pas une longueur de ~30 caractères. Il est évident que cette colonne est surdimensionnée par rapport à son contenu.
    Nom : 3.PNG
Affichages : 207
Taille : 55,0 Ko

    Auriez-vous une petite idée du problème?
    Merci

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 177
    Par défaut
    Vcl.DBGrids.TColumn.Width et dgColumnResize dans Vcl.DBGrids.TCustomDBGrid.Options pour laisser l'utilisateur gérer la taille

    C'est le comportement d'une grille sans TColumn prédéfini mais il suffit de créer les colonnes en Design Time pour leur fixer une taille précise
    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 XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 672
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Vcl.DBGrids.TColumn.Width et dgColumnResize dans Vcl.DBGrids.TCustomDBGrid.Options pour laisser l'utilisateur gérer la taille

    C'est le comportement d'une grille sans TColumn prédéfini mais il suffit de créer les colonnes en Design Time pour leur fixer une taille précise
    Merci ShaiLeTroll

    Donc, faudrait que je crée directement les colonnes dans l'événement TableAfterOpen

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFMyDB.TableAfterOpen(DataSet: TDataSet);
    var
      I: Integer;
      Column: TColumn;
    begin
      for I := 0 to DataSet.Fields.Count - 1 do
      begin
        Column := DBTable.Columns.Add;
        Column.Title.Caption := DataSet.Fields[I].FieldName;
        Column.FieldName := DataSet.Fields[I].FieldName;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure TFMyDB.TableAfterClose(DataSet: TDataSet);
      DBTable.Columns.Clear;
    end;

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 177
    Par défaut
    Si c'est une sorte de DB Explorer maison, tu es obligé effectivement de
    - Ouvrir le DataSet
    - Créer les Colonnes
    - Créer le DataSource et lier la DBGrid avec le DataSet


    Dans une application plus classique, cela se fait au DesignTime

    Sinon, après ouverture, tu peux aussi modifier les Columns créés automatiquement, c'est même plus simple
    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 XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 672
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Si c'est une sorte de DB Explorer maison, tu es obligé effectivement de
    - Ouvrir le DataSet
    - Créer les Colonnes
    - Créer le DataSource et lier la DBGrid avec le DataSet
    Oui un simple gestionnaire de données visa Absolute Database

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

Discussions similaires

  1. [POI][HSSF] Problème ajustement automatique des colonnes
    Par Dark_TeToN dans le forum Documents
    Réponses: 1
    Dernier message: 19/10/2011, 11h43
  2. [Toutes versions] Ajustement automatique des colonnes
    Par azertix dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/12/2010, 10h27
  3. Ajustement automatique des colonnes
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/07/2010, 14h00
  4. [WD14] Ajustement automatique des colonnes
    Par thierrybatlle dans le forum WinDev
    Réponses: 2
    Dernier message: 28/07/2009, 11h08
  5. [WD14] Ajustement automatique des colonnes
    Par thierrybatlle dans le forum WinDev
    Réponses: 1
    Dernier message: 28/05/2009, 12h51

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