在写程序的实践中,为了能够让DBGrid控件显示数据的时候能够自动的让列宽符合列中数据的宽度,我参考了很多资料,最后采用调整数据集的列宽达到间接的调整与数据集相连的DBGrid控件的列宽的目的,但是这种方法不能调整不与数据集相连的表格列。在工程的DateMoudle单元中实现这个功能,这样在数据模块初始化之后DBGrid控件的列宽就达到了,数据模块单元代码如下:(本方法只在ADDTable控件上调试通过)
unit DM;
// Copyright (c) 2007. All Rights Reserved.
// Written by stosc
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDM = class(TDataModule)
ADOCly: TADOConnection;
ATchanpin: TADOTable;
ATchangs: TADOTable;
ATkehu: TADOTable;
ATkucun: TADOTable;
DSchangs: TDataSource;
DSchanpin: TDataSource;
DSkehu: TDataSource;
DSkucun: TDataSource;
ATxiaos: TADOTable;
DSxiaos: TDataSource;
ATtuihuo: TADOTable;
ATpeihuo: TADOTable;
DStuihuo: TDataSource;
DSpeihuo: TDataSource;
ATxiaosDSDesigner: TWideStringField;
ATxiaosDSDesigner2: TIntegerField;
ATxiaosDSDesigner3: TWideStringField;
ATxiaosDSDesigner4: TBCDField;
ATxiaosDSDesigner5: TWideStringField;
ATxiaosDSDesigner6: TBCDField;
ATxiaosField: TStringField;
ATchanpinDSDesigner: TAutoIncField;
ATchanpinDSDesigner2: TWideStringField;
ATchanpinDSDesigner3: TWideStringField;
ATchanpinDSDesigner4: TIntegerField;
ATchanpinDSDesigner5: TBCDField;
ATchanpinDSDesigner6: TBCDField;
function AutoRowSize(mTable :TObject) : integer; {列宽调整函数声明}
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DM: TDM;
implementation
{$R *.dfm}
function TDM.AutoRowSize(mTable :TObject) : integer; {列宽调整函数}
var
ic:Integer; {列循环控制}
ir:Integer; {行循环控制}
begin
if (mTable is TADOTable) then
for ic:=0 to (mTable as TADOTable).FieldCount-1 do
begin {把每字段的字段名的宽度赋值给该字段的Tag属性保存}
(mTable as TADOTable).Fields[ic].Tag:=length((mTable as TADOTable).Fields[ic].DisplayLabel);
for ir:=0 to (mTable as TADOTable).RecordCount-1 do {查找宽度最大的记录,并把记录值赋给Tag}
if length((mTable as TADOTable).Fields[ic].AsString)>(mTable as TADOTable).Fields[ic].Tag then
(mTable as TADOTable).Fields[ic].Tag:=length((mTable as TADOTable).Fields[ic].AsString);
{把Tag值作为列的宽度值}
(mTable as TADOTable).Fields[ic].DisplayWidth:=(mTable as TADOTable).Fields[ic].Tag;
end;
end;
procedure TDM.DataModuleCreate(Sender: TObject);
var
i:Integer;
begin
for i:=0 to self.ComponentCount-1 do {循环查找ADOTable控件}
if (self.Components[i] is TADOTable) then
self.AutoRowSize(self.Components[i]); {调用列宽调整函数}
end;
end.
unit DM;
// Copyright (c) 2007. All Rights Reserved.
// Written by stosc
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDM = class(TDataModule)
ADOCly: TADOConnection;
ATchanpin: TADOTable;
ATchangs: TADOTable;
ATkehu: TADOTable;
ATkucun: TADOTable;
DSchangs: TDataSource;
DSchanpin: TDataSource;
DSkehu: TDataSource;
DSkucun: TDataSource;
ATxiaos: TADOTable;
DSxiaos: TDataSource;
ATtuihuo: TADOTable;
ATpeihuo: TADOTable;
DStuihuo: TDataSource;
DSpeihuo: TDataSource;
ATxiaosDSDesigner: TWideStringField;
ATxiaosDSDesigner2: TIntegerField;
ATxiaosDSDesigner3: TWideStringField;
ATxiaosDSDesigner4: TBCDField;
ATxiaosDSDesigner5: TWideStringField;
ATxiaosDSDesigner6: TBCDField;
ATxiaosField: TStringField;
ATchanpinDSDesigner: TAutoIncField;
ATchanpinDSDesigner2: TWideStringField;
ATchanpinDSDesigner3: TWideStringField;
ATchanpinDSDesigner4: TIntegerField;
ATchanpinDSDesigner5: TBCDField;
ATchanpinDSDesigner6: TBCDField;
function AutoRowSize(mTable :TObject) : integer; {列宽调整函数声明}
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DM: TDM;
implementation
{$R *.dfm}
function TDM.AutoRowSize(mTable :TObject) : integer; {列宽调整函数}
var
ic:Integer; {列循环控制}
ir:Integer; {行循环控制}
begin
if (mTable is TADOTable) then
for ic:=0 to (mTable as TADOTable).FieldCount-1 do
begin {把每字段的字段名的宽度赋值给该字段的Tag属性保存}
(mTable as TADOTable).Fields[ic].Tag:=length((mTable as TADOTable).Fields[ic].DisplayLabel);
for ir:=0 to (mTable as TADOTable).RecordCount-1 do {查找宽度最大的记录,并把记录值赋给Tag}
if length((mTable as TADOTable).Fields[ic].AsString)>(mTable as TADOTable).Fields[ic].Tag then
(mTable as TADOTable).Fields[ic].Tag:=length((mTable as TADOTable).Fields[ic].AsString);
{把Tag值作为列的宽度值}
(mTable as TADOTable).Fields[ic].DisplayWidth:=(mTable as TADOTable).Fields[ic].Tag;
end;
end;
procedure TDM.DataModuleCreate(Sender: TObject);
var
i:Integer;
begin
for i:=0 to self.ComponentCount-1 do {循环查找ADOTable控件}
if (self.Components[i] is TADOTable) then
self.AutoRowSize(self.Components[i]); {调用列宽调整函数}
end;
end.