Ajuster automatiquement la largeur d'une colonne d'un tdbgrid en double cliquant dessus

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 054 fois - Téléchargée 31 fois

Contenu du snippet

Le forum est décidément riche pour trouver l'inspiration.

Cette fois-ci, je vous propose le code pour ajuster automatiquement la largeur d'une colonne d'un TDbGrid, simplement par un double clic sur cette colonne.

NB : je suis parti de l'hypothèse que le développeur n'utilisait pas de colonnes persistantes. Ainsi, même si l'on change l'ensemble de données rattaché au DbGrid au cours de l'exécution, ce code continuera de fonctionner comme de si rien n'était.

Source / Exemple :


procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
    0: ResizeAllColumns(Sender as TDbGrid);
    1: ResizeColumn(Sender as TDbGrid);
  end;
end;

procedure TForm1.ResizeColumn(Grid: TDbGrid);
var
  MaxWidth, //Largeur maximale de la colonne
  MinWidth, //Largeur minimale de la colonne
  CurrentWidth: integer; //Largeur actuelle
  FieldSize: integer; //Taille du champ d'après son contenu
  DS: TDataSet;
  BookMark: TBookmark;
begin
  
  //Pour alléger l'écriture !...
  DS := Grid.DataSource.DataSet;
  with Grid do
  begin
    //Mémoriser la ligne actuellement sélectionnée
    BookMark := DS.GetBookmark;
    //Pour ne pas voir toutes les lignes défiler
    Ds.DisableControls;
    //Parcours de toutes les lignes de l'ensemble de données
    DS.First;
    MaxWidth := Canvas.TextWidth(Columns[SelectedIndex].Title.Caption) + 5;
    MinWidth := 0;
    while not DS.Eof do
    begin
      //Déterminer la largeur en pixels du contenu de l'enregistrement lu
      FieldSize :=
        Canvas.TextWidth(DS.FieldByName(SelectedField.FieldName).AsString) + 5;
      //Réajuster la largeur maximale ?
      if MaxWidth < FieldSize then
        MaxWidth := FieldSize;
      //Réajuster la largeur minimale ?
      if MinWidth > FieldSize then
        MinWidth := FieldSize;
      DS.Next;
    end;
    //Largeur de la colonne cliquée
    CurrentWidth := Columns[SelectedIndex].Width;

    if CurrentWidth <> MaxWidth then
      CurrentWidth := MaxWidth;

    if CurrentWidth < MinWidth then
      CurrentWidth := MinWidth;
    //Affectation de la nouvelle largeur à la colonne
    Columns[SelectedIndex].Width := CurrentWidth;
    //repositionner le curseur de l'ensemble de données
    DS.GotoBookmark(BookMark);
    DS.FreeBookmark(BookMark);
    //Rétablir l'affichage du TDbGrid
    DS.EnableControls;
  end;
end;

Conclusion :


Si cela peut vous servir, j'en serai ravi.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
6
Date d'inscription
dimanche 20 mars 2005
Statut
Membre
Dernière intervention
10 mars 2006

Votre code est tres bien mais il ne comporte pas la largeur du titre!!!!je ne sais pas comment faire!!!!!!!!
Messages postés
5
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
24 décembre 2005

il y'a de magnifique composants de grille sur TMSsoft.com qui permette l'ajustage des cellules automatiques; le tri; et beaucoup d'autres fonctions plus simples. Merci
Messages postés
14
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
13 décembre 2005

DelphiProg>> Avec mes excuses, j'ai mal lu le code.

Je croyais que FieldSize récuperait la taille en pixels sur la valeur du champ de l'enregistrement.

Petite subtilité pour y remédier (vue dans un source VB) --> transmettre la valeur du champ à un objet comportant une propriété de type autosize (TLabel) et récupérer sa propriété "width" dans la variable "tailleInitiale".

Pour l'option ajuster toutes colonnes ->> on duplique ce fameux objet et la variable "tailleInitiale", et on ajoute une boucle "for" dans la boucle "while not eof".

Vous en pensez quoi ?

Cordialement.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
AhmedBoudali >> ce n'est pas la même chose.
Ici il s'agit d'ajuster la largeur des colonnes à celles des données réellement présentes et non à la taille maximum de la colonne. Nuance...
Mais la remarque est bonne.
Par contre, dans le code que tu donnes, pourquoi parcourir les données si c'est pour ajuster à la taille de la colonne que l'on connait dès la conception ?
Messages postés
14
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
13 décembre 2005

Il n'y aurait pas plus simple ?

var tailleInitiale:integer;

begin
tailleInitiale:=0

while not eof do
begin
if tailleInitiale<FieldSize then
tailleInitiale:=FieldSize;
next;
end;

Grid.Columns[Selected].width:=TailleInitiale;
end;
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.