Títulos com mais de uma linha no DBGrid

 

Um dos grandes problemas do DbGrid é que ele não possui uma propriedade para poder colocar o título das colunas em várias linhas. Mas isto não é tão verdade assim. Umas de suas classes ancestrais possui várias propriedades protegidas que possibilitam alterar algumas características do DbGrid. Esta classe é a TCustomGrid. Vamos ao código. Crie um Tipo após as declarações da classe TForm:

 

type

   TAccessDBGrid = class(TCustomGrid);

 

No evento onDrawColumnCell escreva o código abaixo:

 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;

  const Rect: TRect; DataCol: Integer; Column: TColumn;

  State: TGridDrawState);

var

   S1, S2: string;

begin

   with TAccessDBGrid(DBGrid1) do

   begin

      //Limpando o Título da Coluna

      RowHeights[0] := 32;

      Canvas.Brush.Style := bsClear;

      //Títulos da Coluna

      case Column.Index of

      0: begin

         Column.Title.Caption := '';

         S1 := 'Row 1';

         S2 := 'Row 2';

      end;

      1: begin

         Column.Title.Caption := '';

         S1 := 'Row 1';

         S2 := 'Row 2';

      end;

   end;

   //Escrevendo o Título

   Canvas.TextOut(Rect.Left+2, 2, S1);

   Canvas.TextOut(Rect.Left+2, 16, S2);

end;

Explicando o Código

Ao declarar um tipo de uma classe ancestral e associando a classe filho, as propriedades que antes eram protegidas podem ser alteradas nesta classe filho. É o que acontece na Linha:

 

RowHeights[0] := 32;

 

A propriedade RowHeights é um vetor onde cada índice representa a linha do Grid. A linha inicial (Título), a altura é alterada para 32.

Após o titulo original da coluna ser alterada, os valores das linhas são armazenados nas variáveis S1 e S2. Depois quem faz o trabalho é a propriedade Canvas que posiciona os valores das variáveis em duas linhas no Título da coluna. Veja o resultado na figura abaixo:

Conclusões

O código acima mostrou como escrever um título em uma coluna do DbGrid com mais de uma linha, precisa de mais implementações: Escrever centralizado, verificação em todas as colunas e outros de acordo com a necessidade do desenvolvedor. Só um lembrete, este código só funciona se as colunas do DbGrid forem adicionadas na propriedade Columns.

 

por Thiago Avelar

tandrade.cnrj@infraero.gov.br