[DELPHI] REDIMENSIONAR AS COLUNAS DO DBGRID JUNTO COM O FORM

O componente DBGrid é muito utilizado pelos desenvolvedores Delphi para apresentar dados de um DataSet para o usuário, seja esses dados resultado de um select no banco de dados, registros temporários, etc.

Neste post irei mostrar como redimensionar as colunas do DBGrid. Para implementar essa rotina, iremos utilizar o evento OnResize do Form.

Antes:

Depois:

Abra o Delphi e crie um novo projeto através do menu File -> New -> VCL Forms Application - Delphi, e altere as propriedade do Form:

Caption = REDIMENSIONAR AS COLUNAS DO DBGRID JUNTO COM O FORM
Name = Frm_Principal
Position = poDesktopCenter

Agora, iremos criar uma tabela temporária para armazenar os dados que serão apresentados no BDGrid.

Para criar uma tabela temporária, vamos utilizar o componente TClientDataSet, disponível na paleta Data Access do Delphi (Tool Palette -> Data Access: TClientDataSet). Adicione-o no formulário e altere o nome para cdsTemporario.

Adicione também um TDBGrid disponível na paleta Data Constrols do Delphi (Tool Palette -> Data Constrols: TDBGrid), um TDataSource disponível na paleta Data Access (Tool Palette -> Data Access: TDataSource) e altere suas propriedades conforme baixo:

PROPERTIES DBGRID1:
Align = alClient
DataSource= DataSource1

PROPERTIES DATASOURCE1:
DataSet = cdsTemporario

De um duplo-clique no cdsTemporario para abrir o Fields Editor (Editor de Campos). Para adicionar um novo campo, clique com o botão direito dentro da janela Fields Editor e selecione a opção New Field.


Uma nova janela (New Field) será aberta para preencher as propriedades do campo que será adicionado. No nosso exemplo, adicionaremos 5 campos:

Campo Código:
Name: Código
Type: Integer
Field Type: Data

Campo Nome:
Name: Nome
Type: String
FieldType: Data

Campo Endereço:
Name: Endereço
Type: String
FieldType: Data

Campo Cargo:
Name: Cargo
Type: String
FieldType: Data

Campo Salário:
Name: Salário
Type: Float
FieldType: Data

Após terminar de adicionar os campos, feche o Fields Editor. Clique com o botão direito no cdsTemporario e selecione a opção Create DataSet.


Pronto! Já temos uma tabela temporária criada, agora vamos adicionar os campos do cdsTemporario ao DBGrid.

De um duplo-clique no BDGrid, irá aparecer uma nova janela, clique com o botão direito do mouse e escolha a opção Add All Fields, para adicionar todos os campos do cdsTemporario ao DBGrid.


Agora que já configuramos os componentes, vamos criar uma procedure para incluir os registros no cdsTemporario.

Acesse o código do Form através do menu View -> Toggle Form/Unit ou pressionando F12.

Na seção private declarations adicione o código abaixo:

private
{ Private declarations }
procedure PopularClientDataSet(Cod: Integer, Nome, Endereco, Cargo: String, Salario: Double);

Com o cursor posicionado na mesma linha da procedure, pressione CTRL + SHIFT + C, para criar a estrutura da procedure.

Deixe o código PopularClientDataSet da seguinte forma:

procedure TFrm_Principal.PopularClientDataSet(Cod: Integer, Nome, Endereco, Cargo: String, Salario: Double);
begin
cdsTemporario.Append;
cdsTemporario.FieldByName('Código').AsInteger := Cod;
cdsTemporario.FieldByName('Nome').AsString := Nome;
cdsTemporario.FieldByName('Endereço').AsString := Endereco;
cdsTemporario.FieldByName('Cargo').AsString := Cargo;
cdsTemporario.FieldByName('Salário').AsFloat := Salario;
cdsTemporario.Post;
end;

Crie também a procedure RedimensionarDBGrid na seção private conforme abaixo.

private
{ Private declarations }
...
procedure RedimensionarDBGrid(dbg: TDBGrid);

Deixe o código RedimensionarDBGrid da seguinte forma:

procedure TFrm_Principal.RedimensionarDBGrid(dbg: TDBGrid);
type
  TArray = Array of Integer;
  
  procedure AjustarColumns(Swidth, TSize: Integer; Asize: TArray);
  var
    idx: Integer;
  begin
    if TSize = 0 then
    begin
      TSize := dbg.Columns.Count;
      for idx := 0 to dbg.Columns.Count - 1 do
        dbg.Columns[idx].Width := 
(dbg.Width - dbg.Canvas.TextWidth('AAAAAA')) div TSize
    end
    else
      for idx := 0 to dbg.Columns.Count - 1 do
        dbg.Columns[idx].Width := dbg.Columns[idx].Width +
          (Swidth * Asize[idx] div TSize);
  end;

var
  idx, Twidth, TSize, Swidth: Integer;
  AWidth: TArray;
  Asize: TArray;
  NomeColuna: String;
begin
  SetLength(AWidth, dbg.Columns.Count);
  SetLength(Asize, dbg.Columns.Count);
  Twidth := 0;
  TSize := 0;
  for idx := 0 to dbg.Columns.Count - 1 do
  begin
    NomeColuna := dbg.Columns[idx].Title.Caption;
    dbg.Columns[idx].Width := dbg.Canvas.TextWidth
      (dbg.Columns[idx].Title.Caption + 'A');
    AWidth[idx] := dbg.Columns[idx].Width;
    Twidth := Twidth + AWidth[idx];

    if Assigned(dbg.Columns[idx].Field) then
      Asize[idx] := dbg.Columns[idx].Field.Size
    else
      Asize[idx] := 1;

    TSize := TSize + Asize[idx];
  end;
  if TDBGridOption.dgColLines in dbg.Options then
    Twidth := Twidth + dbg.Columns.Count;

  // adiciona a largura da coluna indicada do cursor
  if TDBGridOption.dgIndicator in dbg.Options then
    Twidth := Twidth + IndicatorWidth;

  Swidth := dbg.ClientWidth - Twidth;
  AjustarColumns(Swidth, TSize, Asize);
end;

Volte para o modo Design (F12), clique na barra de título do formulário para selecioná-lo.

De um duplo-clique no evento onCreate do formulário (Object Inspector -> Guia Events: onCreate), e adicione o código abaixo:


procedure TFrm_Principal.FormCreate(Sender: TObject);
begin
  cdsTemporario.Open;
  PopularClientDataSet(1, 'Gabriel', 'Rua 02 Cs 100 Qd 01 Novo Mundo', 'Gerente', 9500.00);
  PopularClientDataSet(2, 'Cristiano', 'Rua 30 Cs 965 Novo Jardim', 'Auxiliar', 7100.00);
  PopularClientDataSet(3, 'Paulo', 'Rua 15 Cs 21 Jardim Primavera', 'Contador', 4500.00);
  PopularClientDataSet(4, 'Ana Paula', 'Rua 85 Cs 96 Jardim Primavera', 'Serviços Gerais', 1950.00);
  PopularClientDataSet(5, 'Rodrigues', 'Rua 05 Cs 46 Novo Jardim', 'Motoboy', 2410.00);
  PopularClientDataSet(6, 'Ana Rosa', 'Rua 37 Novo Mundo', 'Analista de Sistemas', 6720.00);
  PopularClientDataSet(7, 'Gerson', 'Rua 03, Cs 44 Porto', 'Serviços Gerais', 1950.00);
  PopularClientDataSet(8, 'Roberto', 'Rua 56 Cs 97 Santa Maria', 'Programador', 5930.00);
  PopularClientDataSet(9, 'Maria', 'Rua 65 Cs 259 Novo Paraíso', 'Porteiro', 2460.00);
  PopularClientDataSet(10, 'Sophia', 'Rua 72 Cs 76 Centro', 'Assistente de RH', 3995.00);
end;

Com o código acima, ao criar o formulário será adicionado os registros ao cdsTemporario.

Agora, acesse o evento OnResize do formulário e coloque a chamada para a procedure RedimensionarDBGrid.

procedure TForm1.FormResize(Sender: TObject);
begin
    RedimensionarDBGrid(DBGrid1);
end;

Salve as alterações (File -> Save All), coloque o nome uPrincipal para Unit e Principal para o nome do projeto.

Pronto, execute a aplicação (menu Run -> Run ou Pressione F9) e veja o resultado.

Gostou? Deixe seu comentário... Convido você a seguir meu blog, sua presença é bem vinda!【ツ】

Download

Um comentário: