Supongo que el problema viene por el tipo de letra no proporcionial del dbgrid. Como todos los carácteres no tienen el mismo ancho, no podemos hacer una aproximación, (usa la fuente courier).
Aquí tienes una rutina que funciona muy bien
Código Delphi
[-]
procedure AjustaDisplayWidth(D: TDataSet;
const MaxAncho: Integer = 150;
const ExtraChars:Integer = 0);
var
i, nIdx: Integer;
begin
if D.Active then
try
D.DisableControls;
D.First;
nIdx := 0;
while not D.Eof do
begin
for i := 0 to pred(D.FieldCount) do
begin
if (nIdx = 0) then
D.Fields[i].DisplayWidth := 1;
D.Fields[i].DisplayWidth := EnsureRange(
Max(D.Fields[i].DisplayWidth,
Length(D.Fields[i].AsString) +
IfThen(D.Fields[i].DataType = ftFloat, 3,
ExtraChars) ),
0, MaxAncho);
end;
D.Next;
if nIdx = 0 then
Inc(nIdx);
end;
finally
D.First;
D.EnableControls;
end; end;
No puedo decirte los "uses" porque está en una unidad grande, pero con F1 los averiguarás.
Para llamarlo:
Código Delphi
[-]
ajustaDisplaywidth(query1);
Si lo ejecutas, el ancho se ajustará al último carácter, así queda la información muy "apretada", de ahí el parámetro "extrachars" que permite agregar 1 o dos espacios al final de cada columna para que el grid quede más limpio.
La rutina ifthen es la que viene en la unidad Maths.
Edito: Desde luego no es nada eficiente, pero cumple su cometido.
Saludos