Adjust columns of a Dbgrid

Asked

Viewed 2,211 times

0

I’m having a problem to get a function where do the same as Excel (Resize columns).

For example:

inserir a descrição da imagem aqui

Watch the columns spacing, huge and needless.

I would like a solution in the form of a function to achieve the REDIMENSIONAMENTO of the columns after the search.

In case it should stay that way:

inserir a descrição da imagem aqui

Some function that does something similar?

  • 1

    Is that a statement or a question? Amigo somo um Q&A aqui, se isso é uma resposta recomendo que poste no campo de resposta após formular uma pergunta uma pergunta, você já já é membro e acredito que deva saber como a comunidade funciona, no entanto recomendo que leia isto: http://answall.com/help/self-answer

1 answer

4


Friends, I got it right.

Goes below:

procedure TfrmPrincipal.AjustarColunas(DBGrid : TDBgrid);
var
  ColumnCount, RowCount : integer;
  DataSetTemp : TDataSet;
  DataSourceTemp : TDataSource;
  contCol, contRow : integer;
  AValue : integer;
  MStrValue, AStrValue : string;
begin
  //captura colunas do dbgrid 
  ColumnCount := DBGrid.Columns.Count;
  //verifica se existem colunas
  if (ColumnCount = 0) then Exit;
  //verifica se o TDataSet do DataSource referenciado no DBGrid está ativo (haha)
  if not DBGrid.DataSource.DataSet.Active  then Exit;

  //captura em variáveis temporárias o dataset e datasource, e também a quantidade de linhas que sua query retornou no record count
  DataSetTemp := DBGrid.DataSource.DataSet;
  DataSourceTemp := DBGrid.DataSource;
  //esta instrução foi feita para evitar que o usuário veja o processo de redimensionamento do dbgrid.  
  DBGrid.DataSource := nil;
  RowCount := DataSetTemp.RecordCount;

  //varre todas as colunas do dbgrid
  for contCol := 0 to ColumnCount-1 do
  begin
    AValue := 0;
    AStrValue := '';

    DataSetTemp.First;
    //Seta o primeiro valor como o TÍTULO da coluna para evitar que os campos fiquem "invisíveis", quando não houver campo preenchido.
    MStrValue := DBGrid.Columns[contCol].Title.Caption;
    while not DataSetTemp.Eof do
    begin
    //captura valor e o length do campo atual 
      AValue := Length(DataSetTemp.FieldByName(DBGrid.Columns[contCol].FieldName).AsString);
      AStrValue := DataSetTemp.FieldByName(DBGrid.Columns[contCol].FieldName).AsString;
      DataSetTemp.Next;

      //verifica se a próxima variável é maior que a anterior
      //e mantém a maior.
      if length(MStrValue) < AValue then
        MStrValue := AStrValue;
    end;

    //seta a largura atual com o tamanho do campo maior capturado       
    //anteriormente (Observe que há uma conversão de texto para Width, 
    //isto é para capturar o valor real da largura do texto.)
    DBGrid.Columns[contCol].Width := Canvas.TextWidth(MStrValue)+15;
  end;

  //DataSource novamente referenciado, para evitar Acess Violation.
  DBGrid.DataSource := DataSourceTemp;
end;

Method of use:

//Após o Open da query, utilizar desta forma; 
AjustarColunas(DBGrid1);
  • 1

    This does not provide an answer to the question. To criticize or request clarification from an author, leave a comment below its publication. - From Review

  • I understand. Thank you.

  • Could you explain the code? It’s nice to give something ready, but a lot comes here for case study, it would be nice to explain your code :) . I’ll give you +1 for your effort in the code!

  • @Guillhermenascimento, follows the commented code!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.