O Poder do DBGrid

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (3)  (0)

– Ajustando Automaticamente a Largura das Colunas

 

Salve Pessoal da Comunidade Delphi!

Ao contrário da maioria dos controles Data-Aware do Delphi, o componente DBGrid possui muitos recursos interessantes e muito mais poder do que parece ter! O “padrão” do DBGrid, como todos sabemos, faz muito bem o seu trabalho de exibir e permitir a manipulação dos registros de um dataset em uma grade tabular simples.

No entanto, existem muitas maneiras (e motivos) pelo qual você deve considerar a customização das saídas oferecidas pelo DBGrid. Este é o primeiro artigo da série sobre DBGrid. Acompanhe, e você irá aprender técnicas fantásticas de aperfeiçoamento visual para suas aplicações, além de recursos interessantes, deixando suas aplicações muito mais profissionais e user-friendly.

No total, pretendo apresentar cerca de 13 artigos (ou mais) sobre o DBGrid, para que você entenda a extensão da funcionalidade deste fantástico componente visual! Assim, vamos começar?

Ajustando a largura (width) da coluna do DBGrid Automaticamente

Resumo: Apresentação de um método que corrige o tamanho das colunas (em tempo de execução), ajustando-as perfeitamente à largura do DBGrid (removendo o espaço excedente da grade, e, em conseqüência disso, removendo a barra de rolagem horizontal) quando o usuário redimensiona o contêiner da grade.

Desenhado para possibilitar que o usuário visualize e edite dados em uma grade tabular, o DBGrid oferece vários caminhos para customizar a representação de seus dados. Com este flexível componente, o desenvolvedor Delphi sempre encontrará novos caminhos para tornar a aplicação mais poderosa! Este artigo apresenta só uma maneira de customizar!

O Problema é

Um dos recursos ausentes no DBGrid é a falta de uma opção que ajusta automaticamente a largura de uma coluna específica, para que ela se ajuste perfeitamente à largura da grade cliente. Quando o usuário redimensiona o componente DBGrid em tempo de execução, a largura das colunas não corresponde à alteração, e não são redimensionadas. Assim, se a largura do DBGrid é maior que a largura total de todas as colunas, você conseguirá uma área vazia logo após a última coluna. Por outro lado, se a largura total de todas as colunas for maior que a largura do DBGrid, uma barra de rolagem horizontal irá ser exibida.

 

A Solução

Neste artigo, eu vou apresentar a vocês um procedimento que ajusta a largura das colunas do DBGrid quando a grade é redimensionada em tempo de execução.

 

Enquanto escrevia a minha solução para o “problema”, fui guiado pelo fato de que na maioria dos casos (em minha experiência) apenas duas ou três colunas em um DBGrid precisam ser auto-redimensionadas; todas as outras colunas mostram algum tipo de dado-estático. Por exemplo, você pode especificar um tamanho fixo para a largura das colunas que exibem valores de dados que são representados com TDateTimeField, TFloatFiedl, TIntegerField e similares.

Você provavelmente irá criar (em tempo de execução) campos persistentes, usando o Field Editor, para especificar os campos no dataset, suas propriedades, e sua ordem. Tendo um objeto descendente de TField, você pode usar a propriedade Tag para indicar qual coluna, em particular, mostra os valores para o campo que será auto-redimensionado.

Aqui está o código

Colunas “Inteligentes” e o Procedimento FixDBGridColumnsWidth

Primeiro, no evento OnCreate do formulário que contem o DBGrid, especifique quais colunas precisarão de redimensionamento por atribuir um valor diferente de zero para a propriedade Tag do objeto TField correspondente.

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  //Configurando o auto-redimensionamento das colunas por atribuir largura

  //mínima na propriedade Tag.

  //usando valor fixo: 40 px

  qryCustomers.FieldByName('LastName').Tag := 40;

  //usando valor variável: largura padrão do texto do título da Coluna

  qryCustomers.FieldByName('Salary').Tag := 4 +   Canvas.TextWidth(qryCustomers.FieldByName('Salary').DisplayName);

end;

 

No código acima, qryCustomers é um componente TQuery lincado a um componente DataSource, o qual está lincado ao DBGrid. A propriedade qryCustomers.DataBaseName está setada para o Alias DBDEMOS e a propriedade SQL possui a string: Select LastName, HireDate, Salary from employee.db. Nós marcamos as colunas que mostram os valores para LastName e Salary como os campos que serão redimensionáveis.

 

Não houve necessidade de definirmos algo para o campo HireDate, visto que o mesmo possuirá sempre o mesmo tamanho, pois é um objeto TDateTimeField e terá tamanho fixo.

Agora, chamamos o procedimento FixDBGridColumnsWidth no evento OnResize do Form:

 

procedure TForm1.FormResize(Sender: TObject);

begin

  FixDBGridColumnsWidth(DBGrid1);

end;

 

Nota: Isto tudo faz sentido se a propriedade Align do DBGrid inclui um dos seguintes valores: alTop, alBotton, alClient or alCustom.

 

Finalmente, aqui está o código para a procedure FixDBGridColumnsWidth:

 

procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);

var

  i: integer;

  TotWidth : integer;

  VarWidth : integer;

  ResizableColumnCount : integer;

  AColumn : TColumn;

begin

//Largura total de todas as colunas antes do redimensionamento

  TotWidth := 0;

//Como dividir qualquer espaço extra na grade

  VarWidth := 0;

//Quantas colunas precisam de auto-redimensionamento

  ResizableColumnCount := 0;

 

  for i := 0 to -1 + DBGrid.Columns.Count do

    begin

      TotWidth := TotWidth + DBGrid.Columns[i].Width;

      if DBGrid.Columns[i].Field.Tag <> 0 then

      Inc(ResizableColumnCount);

    end;

 

//adiciona 1px para a linha de separação de colunas

  if dgColLines in DBGrid.Options then

  TotWidth := TotWidth + DBGrid.Columns.Count;

 

//Adiciona indicador de largura

  if dgIndicator in DBGrid.Options then

  TotWidth := TotWidth + IndicatorWidth;

 

//Largura recebe o valor de "left"

  VarWidth := DBGrid.ClientWidth - TotWidth;

 

//Distribuição por igual da VarWidth

//para todas as colunas auto-redimensionáveis

  if ResizableColumnCount > 0 then

   VarWidth := varWidth div ResizableColumnCount;

 

  for i := 0 to -1 + DBGrid.Columns.Count do

    begin

      AColumn := DBGrid.Columns[i];

      if AColumn.Field.Tag <> 0 then

        begin

          AColumn.Width := AColumn.Width + VarWidth;

          if AColumn.Width < AColumn.Field.Tag then

          AColumn.Width := AColumn.Field.Tag;

        end;

    end;

end;

 

E é isso aí pessoal! Mais uma vez: truque simples, mas poderoso – como só o Delphi pode ser! No próximo artigo, irei tratar sobre tarefas de Seleção Múltipla no DBGrid! Um Forte Abraço, e até a próxima!

 

Matheus Venâncio (venancio@advancecci.com.br e mth.venancio@gmail.com.br) Desenvolvedor Delphi 7, Certificado pela Tool Engenharia.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?