function TForm1.NewTextWidth(fntFont: TFont; const sString: OpenString): integer; {根据程序默认系统取得文字所需宽度} var fntSave: TFont; begin result := 0; fntSave := Application.MainForm.Font; Application.MainForm.Font := fntFont; try result := Application.MainForm.Canvas.TextWidth(sString); finally Application.MainForm.Font := fntSave; end; end;function TForm1.iCalcGridWidth(dbg: TDBGrid): integer; {指定dbgrid文字所需宽度} const cMEASURE_CHAR = '0'; iEXTRA_COL_PIX = 4; iINDICATOR_WIDE = 11; var i, iColumns, iColWidth, iTitleWidth, iCharWidth: integer; //字段数,列数,列宽,列标题宽,字宽 begin iColumns := 0; result := GetSystemMetrics(SM_CXVSCROLL); //得到滚动条的大小 iCharWidth := NewTextWidth(dbg.Font, cMEASURE_CHAR); with dbg.dataSource.dataSet do for i := 0 to FieldCount - 1 do with Fields[i] do if visible then begin iColWidth := iCharWidth * DisplayWidth; if dgTitles in dbg.Options then begin iTitleWidth := NewTextWidth(dbg.TitleFont, DisplayLabel); if iColWidth < iTitleWidth then iColWidth := iTitleWidth; end; inc(iColumns, 1); inc(result, iColWidth + iEXTRA_COL_PIX); end; if dgIndicator in dbg.Options then begin inc(iColumns, 1); inc(result, iINDICATOR_WIDE); end; if dgColLines in dbg.Options then inc(result, iColumns) else inc(result, 1); end;procedure TForm1.FormCreate(Sender: TObject); var W, i: Integer; begin ADOTable1.Active := True; W := 0; for i := 0 to DBGrid1.Columns.Count - 1 do //遍列得到累加宽度 W := W + DBGrid1.Columns[i].Width + 4; //增加余值 DBGrid1.ClientWidth := W; Self.ClientWidth := (DBGrid1.Left * 2) + DBGrid1.Width; end;procedure TForm1.Button1Click(Sender: TObject); begin Showmessage(IntToStr(iCalcGridWidth(DBGrid1))); end;procedure TForm1.Button2Click(Sender: TObject); begin Showmessage(Inttostr(DBGrid1.Width)); end;procedure TForm1.Button3Click(Sender: TObject); begin ADOTable1.Active := not ADOTable1.Active; end;
{根据程序默认系统取得文字所需宽度}
var
fntSave: TFont;
begin
result := 0;
fntSave := Application.MainForm.Font;
Application.MainForm.Font := fntFont;
try
result := Application.MainForm.Canvas.TextWidth(sString);
finally
Application.MainForm.Font := fntSave;
end;
end;function TForm1.iCalcGridWidth(dbg: TDBGrid): integer;
{指定dbgrid文字所需宽度}
const
cMEASURE_CHAR = '0';
iEXTRA_COL_PIX = 4;
iINDICATOR_WIDE = 11;
var
i, iColumns, iColWidth, iTitleWidth, iCharWidth: integer;
//字段数,列数,列宽,列标题宽,字宽
begin
iColumns := 0;
result := GetSystemMetrics(SM_CXVSCROLL);
//得到滚动条的大小
iCharWidth := NewTextWidth(dbg.Font, cMEASURE_CHAR);
with dbg.dataSource.dataSet do
for i := 0 to FieldCount - 1 do
with Fields[i] do
if visible then
begin
iColWidth := iCharWidth * DisplayWidth;
if dgTitles in dbg.Options then
begin
iTitleWidth := NewTextWidth(dbg.TitleFont, DisplayLabel);
if iColWidth < iTitleWidth then
iColWidth := iTitleWidth;
end;
inc(iColumns, 1);
inc(result, iColWidth + iEXTRA_COL_PIX);
end;
if dgIndicator in dbg.Options then
begin
inc(iColumns, 1);
inc(result, iINDICATOR_WIDE);
end;
if dgColLines in dbg.Options then
inc(result, iColumns)
else
inc(result, 1);
end;procedure TForm1.FormCreate(Sender: TObject);
var
W, i: Integer;
begin
ADOTable1.Active := True;
W := 0;
for i := 0 to DBGrid1.Columns.Count - 1 do //遍列得到累加宽度
W := W + DBGrid1.Columns[i].Width + 4; //增加余值
DBGrid1.ClientWidth := W;
Self.ClientWidth := (DBGrid1.Left * 2) + DBGrid1.Width;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage(IntToStr(iCalcGridWidth(DBGrid1)));
end;procedure TForm1.Button2Click(Sender: TObject);
begin
Showmessage(Inttostr(DBGrid1.Width));
end;procedure TForm1.Button3Click(Sender: TObject);
begin
ADOTable1.Active := not ADOTable1.Active;
end;
dbgrid1.columns[0].Alignment:='tacenter'第1列数据居中