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

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

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.