unit uGridColumnWidth;
interface
uses
DBGrids;
procedure SetGridColumnWidths( AGrid : TDBGrid );
implementation
uses
DB, SysUtils;
procedure SetGridColumnWidths( AGrid : TDBGrid );
const
DEFBORDER = 10;
var
temp, idx, bcidx : integer;
lmax :
array of integer;
bm : TBookmark;
begin
with AGrid
do
begin
SetLength( lmax, Columns.Count );
if dgTitles
in AGrid.Options
then
begin
// Measure Title
Canvas.Font := AGrid.TitleFont;
for idx := 0
to Columns.Count - 1
do
if Columns[ idx ].Visible
then
lmax[ idx ] := Canvas.TextWidth( Columns[ idx ].Title.Caption )
+ DEFBORDER;
end;
// Measure Data
Canvas.Font := AGrid.Font;
// Anzeige abschalten
DataSource.DataSet.DisableControls;
try
// Aktuellen Datensatz merken
bm := DataSource.DataSet.GetBookmark;
// Zum ersten Datensatz springen
DataSource.DataSet.First;
// Alle Datensätze durchwandern
while not DataSource.DataSet.EOF
and ( DataSource.DataSet.RecNo < DataSource.DataSet.RecordCount )
do
begin
// Alle Spalten durchwandern
for idx := 0
to Columns.Count - 1
do
// Ist die Spalte sichtbar?
if Columns[ idx ].Visible
then
begin
// Breite des Inhalts ermitteln
temp := Canvas.TextWidth
( trim( Columns[ idx ].Field.DisplayText ) ) + DEFBORDER;
// nur die maximale Breite merken
if temp > lmax[ idx ]
then
lmax[ idx ] := temp;
end;
// Nächster Datensatz
DataSource.DataSet.Next;
end;
// Zum Datensatz zurückspringen, der eingangs gewählt war
if DataSource.DataSet.BookmarkValid( bm )
then
DataSource.DataSet.GotoBookmark( bm )
else
DataSource.DataSet.First;
finally
// Anzeige einschalten
DataSource.DataSet.EnableControls;
end;
// Spaltenbreiten ändern
for idx := 0
to Columns.Count - 1
do
if Columns[ idx ].Visible
then
if lmax[ idx ] > 0
then
Columns[ idx ].Width := lmax[ idx ];
end;
end;
{ SetGridColumnWidths }
end.