Search code examples
delphidbgrid

Adjust Column width DBGrid


I have a TDBGrid. It works, but the columns shown are very large.

How can I set an "auto-fix column width"?


Solution

  • The needed Columnwidth is depended of the settings of the Grids canvas and the mamimum length of the displaytext of each field.

    procedure FitGrid(Grid: TDBGrid);
    const
      C_Add=3;
    var
      ds: TDataSet;
      bm: TBookmark;
      i: Integer;
      w: Integer;
      a: Array of Integer;
    begin
      ds := Grid.DataSource.DataSet;
      if Assigned(ds) then
      begin
        ds.DisableControls;
        bm := ds.GetBookmark;
        try
          ds.First;
          SetLength(a, Grid.Columns.Count);
          while not ds.Eof do
          begin
            for I := 0 to Grid.Columns.Count - 1 do
            begin
              if Assigned(Grid.Columns[i].Field) then
              begin
                w :=  Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText);
                if a[i] < w  then
                   a[i] := w ;
              end;
            end;
            ds.Next;
          end;
          for I := 0 to Grid.Columns.Count - 1 do
            Grid.Columns[i].Width := a[i] + C_Add;
            ds.GotoBookmark(bm);
        finally
          ds.FreeBookmark(bm);
          ds.EnableControls;
        end;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FitGrid(DBgrid1)
    end;