Delphi: ajuster automatiquement les largeurs de colonne DBGrid

Conçu pour permettre à un utilisateur d'afficher et de modifier des données dans une grille tabulaire, le DBGrid propose différentes façons de personnaliser la façon dont il représente «ses» données. Avec tant de flexibilité, un Delphes le développeur peut toujours trouver de nouvelles façons de le rendre plus puissant.

L'une des fonctionnalités manquantes de TDBGrid est qu'il n'y a pas d'option pour ajuster automatiquement les largeurs de colonnes spécifiques pour s'adapter complètement à la largeur du client de la grille. Lorsque vous redimensionnez le composant DBGrid au moment de l'exécution, les largeurs de colonne ne sont pas redimensionnées.

Si la largeur du DBGrid est supérieure à la largeur totale de toutes les colonnes, vous obtiendrez une zone vide juste après la dernière colonne. En revanche, si la largeur totale de toutes les colonnes est supérieure à la largeur du DBGrid, une barre de défilement horizontale apparaît.

Ajuster automatiquement les largeurs de colonne DBGrid

Vous pouvez suivre une procédure pratique qui fixe la largeur des colonnes DBGrid sélectives lorsque la grille est redimensionnée au moment de l'exécution.

instagram viewer

Il est important de noter que, généralement, seules deux à trois colonnes dans un DBGrid doivent être redimensionnées automatiquement; toutes les autres colonnes affichent des données de "largeur statique". Par exemple, vous pouvez toujours spécifier une largeur fixe pour les colonnes affichant les valeurs des champs de données qui sont représentés avec TDateTimeField, TFloatField, TIntegerField et similaires.

De plus, vous allez probablement créer (au moment de la conception) des composants de champ persistants à l'aide de l'éditeur de champs, pour spécifier les champs dans l'ensemble de données, leurs propriétés et leur ordre. Avec un objet descendant TField, vous pouvez utiliser la propriété Tag pour indiquer qu'une colonne particulière affichant les valeurs de ce champ doit être dimensionnée automatiquement.

Voici l'idée: si vous voulez qu'une colonne ajuste automatiquement l'espace disponible, affectez une valeur entière à la propriété Tag du descendant TField qui indique la largeur minimale de la colonne correspondante.

La procédure FixDBGridColumnsWidth

Avant de commencer, dans le Événement OnCreate pour l'objet Form contenant le DBGrid, spécifiez les colonnes qui doivent être redimensionnées automatiquement en affectant une valeur non nulle à la propriété Tag de l'objet TField correspondant.

procédure TForm1.FormCreate (expéditeur: TObject);
commencer
// configurez les colonnes autoresizable en attribuant
// Largeur Minimm dans la propriété Tag.

// en utilisant une valeur fixe: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// en utilisant une valeur variable: largeur du
// texte du titre de la colonne par défaut
Table1.FieldByName ('LastName'). Tag: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
fin
;

Dans le code ci-dessus, Table1 est un composant TTable lié à un Composant DataSource, qui est lié à DBGrid. La propriété Table1.Table pointe vers la table DBDemos Employee.

Nous avons marqué les colonnes affichant les valeurs des champs FirstName et LastName comme pouvant être redimensionnées automatiquement. L'étape suivante consiste à appeler notre FixDBGridColumnsWidth dans le gestionnaire d'événement OnResize pour le formulaire:

procédure TForm1.FormResize (expéditeur: TObject);
commencer
FixDBGridColumnsWidth (DBGrid1);
fin
;

Remarque: Tout cela est logique si la propriété Align du DBGrid comprend l'une des valeurs suivantes: alTop, alBottom, alClient ou alCustom.

Enfin, voici le code de la procédure FixDBGridColumnsWidth:

procédure FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: entier; TotWidth: entier; VarWidth: entier; ResizableColumnCount: entier; AColumn: TColumn;
commencer
// largeur totale de toutes les colonnes avant redimensionnement
TotWidth: = 0;
// comment diviser tout espace supplémentaire dans la grille
VarWidth: = 0;
// combien de colonnes doivent être redimensionnées automatiquement
ResizableColumnCount: = 0;
pour i: = 0 à -1 + DBGrid. Colonnes. Compter dobegin
TotWidth: = TotWidth + DBGrid. Colonnes [i] .Largeur;
si DBGrid. Colonnes [i]. Champ. Tag 0 ensuite
Inc (ResizableColumnCount);
fin;
// ajoute 1px pour la ligne de séparation des colonnessi dgColLines dans DBGrid. Les options ensuite
TotWidth: = TotWidth + DBGrid. Colonnes. Compter;
// ajoute une largeur de colonne d'indicateursi dgIndicator dans DBGrid. Les options ensuite
TotWidth: = TotWidth + IndicatorWidth;
// largeur vale "gauche"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Distribution égale de VarWidth
// à toutes les colonnes redimensionnables automatiquement
si ResizableColumnCount> 0 ensuite
VarWidth: = varWidth div ResizableColumnCount;
pour i: = 0 à -1 + DBGrid. Colonnes. Compter dobegin
AColonne: = DBGrid. Colonnes [i];
si Une colonne. Champ. Tag 0 puis commencer
Une colonne. Largeur: = AColonne. Largeur + VarWidth;
si Une colonne. Largeur alors
Une colonne. Largeur: = AColonne. Champ. Étiquette;
fin;
fin;
fin
; (* FixDBGridColumnsWidth *)
instagram story viewer