sexta-feira, 18 de outubro de 2013

Como Ajustar Automaticamente a Largura das Colunas de um Dbgrid em Delphi 2006

Bom dia pessoal,
Esse post mostra como ajustar automaticamente a largura das colunas de um Dbgrid (nativo) em Delphi 2006.
Declare a procedure abaixo numa unit e chame-a passando como parâmetros a grid e o índice da coluna que será ajustada.

Declaração da Procedure:
procedure DimensionarGrid(dbg: TDbGrid; AIndiceColunaAutoAjustavel : Integer);
  type
    TArray = Array of integer;

  procedure AjustarColunas(ALargura, ATamanhoTotal : Integer; ALstTamahos : TArray);
  var
    I :integer;
  begin
    if ATamanhoTotal = 0 then
    begin
      ATamanhoTotal := dbg.Columns.Count;
      for I := 0 to dbg.Columns.Count - 1 do
        dbg.Columns[I].Width := (dbg.Width - dbg.Canvas.TextWidth('AAAA')) div ATamanhoTotal
    end
    else
      for I := 0 to dbg.Columns.Count - 1 do
        dbg.Columns[I].Width := dbg.Columns[I].Width + (ALargura * ALstTamahos[I] div ATamanhoTotal);
  end;

var
  I, vLarguraTotal, vTamanhoTotal, vLargura : Integer;
  vLstLarguras, vLstTamanhos : TArray;
begin
  SetLength(vLstLarguras, dbg.Columns.Count);
  SetLength(vLstTamanhos, dbg.Columns.Count);
  vLarguraTotal := 0;
  vTamanhoTotal := 0;
  for I := 0 to dbg.Columns.Count - 1  do
  begin
    dbg.Columns[I].Width := dbg.Canvas.TexTWidth( Dbg.Columns[I].Title.Caption + 'A' );
    vLstLarguras[I]      := dbg.Columns[I].Width;
    vLarguraTotal        := vLarguraTotal + vLstLarguras[I];
    if I = AIndiceColunaAutoAjustavel then
      vLstTamanhos[I]    := dbg.Columns[I].Field.Size;
    vTamanhoTotal        := vTamanhoTotal + vLstTamanhos[I];
  end;
 
  if dgColLines in dbg.Options then
    vLarguraTotal := vLarguraTotal + Dbg.Columns.Count;

  {Adiciona a largura da coluna indicada do cursor}
  if dgIndicator in Dbg.Options then
    vLarguraTotal := vLarguraTotal + IndicatorWidth;

  vLargura := dbg.ClienTWidth - vLarguraTotal;
  AjustarColunas(vLargura, vTamanhoTotal, vLstTamanhos);
end;

Abaixo está um exemplo de como chamar a procedure:
procedure TfrmTeste.FormResize(Sender: TObject);
begin
  DimensionarGrid(grdDados, 2);
end;

Obs.: É interessante chamar essa procedure no FormResize, pois assim sempre que o tamanho do formulário for reajustado a grid será ajustada. Porém, ela pode ser reajustada sempre que dados forem alterados na grid também, ou conforme sua necessidade.

Espero que ajude!
Abraços!

Link de auxílio:
http://marcosalles.wordpress.com/2011/03/08/ajustar-automaticamente-o-tamanho-das-colunas-do-dbgrid-delphi/

Nenhum comentário:

Postar um comentário