Olá galera, nesta Quick Tips, irei mostra como podemos redimensionar uma DBGrid de acordo com o tamanho das colunas e do espaço ocupada por esta DBGrid no formulário. Pensando sempre e reaproveitamento de código vamos criar uma unit e salvar ela como uFuncoes.pas . e nela declararmos uses em Grids, DBGrids , além de criarmos também uma procedure chamada AutoSizeDBGrid.

unit uFuncoes;

interface

uses Grids, DBGrids;

  procedure AutoSizeDBGrid(const xDBGrid: TDBGrid);

implementation

procedure AutoSizeDBGrid(const xDBGrid: TDBGrid);
var
  I, TotalWidht, VarWidth, QtdTotalColuna : Integer;
  xColumn : TColumn;
begin
// Largura total de todas as colunas antes de redimensionar
  TotalWidht := 0;
// Como dividir todo o espaço extra na grade
  VarWidth := 0;
// Quantas colunas devem ser auto-redimensionamento
  QtdTotalColuna := 0;

  for I := 0 to -1 + xDBGrid.Columns.Count do
  begin
    TotalWidht := TotalWidht + xDBGrid.Columns[I].Width;
    if xDBGrid.Columns[I].Field.Tag <> 0 then
      Inc(QtdTotalColuna);
  end;

// Adiciona 1px para a linha de separador de coluna
  if dgColLines in xDBGrid.Options then
    TotalWidht := TotalWidht + xDBGrid.Columns.Count;

// Adiciona a largura da coluna indicadora
  if dgIndicator in xDBGrid.Options then
    TotalWidht := TotalWidht + IndicatorWidth;

// width vale "Left"
  VarWidth :=  xDBGrid.ClientWidth - TotalWidht;


// Da mesma forma distribuir VarWidth para todas as colunas auto-resizable
  if QtdTotalColuna > 0 then
    VarWidth := varWidth div QtdTotalColuna;

  for I := 0 to -1 + xDBGrid.Columns.Count do
  begin
    xColumn := xDBGrid.Columns[I];
    if xColumn.Field.Tag <> 0 then
    begin
      xColumn.Width := xColumn.Width + VarWidth;
      if xColumn.Width < xColumn.Field.Tag then
        xColumn.Width := xColumn.Field.Tag;
    end;
  end;
end;

end.

Feita a nossa unit vamos criar agora um Formulário juntamente com um DBGrid, ligado a um DataSet, esta parte vou deixar com vocês, particularmente criei um ClientDataSet com XML mesmo, apenas para ilustrar. Agora vamos ao que interessa neste form nos eventos onCreate e onResize, vamos implementar os código abaixo.

Listagem 2: Serve para termos como base uma tag inicial para cada Field


procedure TFrmPrincipal.FormCreate(Sender: TObject);
var
    I: Integer;
begin
    For I := 0 to CDSPadrao.FieldCount - 1 do
        CDSPadrao.Fields[i].Tag := 30;
    AutoSizeDBGrid(DBGrid1);
end;

Listagem 3: Todo momento que nosso formulário for redimensionado o evento irá calcular o tamanho de cada coluna


procedure TFrmPrincipal.FormResize(Sender: TObject);
begin
    AutoSizeDBGrid(DBGrid1);
end;

Fico por aqui ate à próxima Quick Tips. Baixe o exemplo completo neste post.

Um abraço

Wesley Y