Noch eine Version, die ich meine ich irgendwann mal hier im Forum bekommen habe (find es gerade nicht), ich meine von Sir Rufo. Hier in der Version analysiert es die ersten 40 Zeilen, um die optimale Spaltenbreite zu ermitteln:
Delphi-Quellcode:
procedure TProjekt.SetGridCol_Optimal(DBGrid: TDBGrid);
function TextGroesse(
const Text :
string; Font : TFont =
nil) : TSize;
var
DC : hDC;
F : hFont;
begin
F := 0;
DC := GetDC(0);
try
if Font <>
nil then F := SelectObject(
DC, Font.Handle);
if not GetTextExtentPoint32(
DC, PChar(Text), Length(Text), Result)
then
begin
Result.cx := 0;
Result.cy := 0;
end;
finally
if F <> 0
then SelectObject(
DC, F);
ReleaseDC(0,
DC);
end;
end;
var
i, j : integer;
iMaxRow : integer;
begin
with DBGrid
do
begin
// maximal XX Zeilen durchsuchen
iMaxRow := Min(40, DataSource.DataSet.RecordCount);
try
DataSource.DataSet.DisableControls;
Visible := false;
// notwendig, da controls disabled!
DataSource.DataSet.First;
// mit Breite der Überschriften inizialisieren
for i := 0
to Columns.Count - 1
do
begin
Columns.Items[i].Width := TextGroesse(Columns[i].Title.Caption, Font).cx + 10;
end;
// auf die größte Breite der ersten iMaxRow Zeilen stellen
for j := 0
to iMaxRow - 1
do
begin
for i := 0
to Columns.Count - 1
do
begin
Columns.Items[i].Width := Max(TextGroesse(Fields[i].Text, Font).cx + 10, Columns.Items[i].Width);
end;
DataSource.DataSet.Next;
end;
DataSource.DataSet.First;
finally
DataSource.DataSet.EnableControls;
Visible := true;
end;
end;
end;