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);