Adjust columns of a DBGrid

0

I have a problem getting a function where I do the same thing as Excel (Resize columns).

For example:

Lookatthehuge,unnecessarycolumnspacing.

Iwouldlikeafunction-basedsolutiontobeabletoperformREDIMENSIONAMENTOofthecolumnsafterthesearch.

Incaseitshouldlooklikethis:

Any function that does something similar?

    
asked by anonymous 13.11.2015 / 11:56

1 answer

4

Friends, I managed to solve it.

Follow 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);
    
13.11.2015 / 11:57