Delphi调整Dbgrid列宽

本文介绍了如何在 Delphi 中调整 DBGrid 的列宽,包括通过编辑框设置、自动调整功能以及利用 ini 文件持久化列宽。提供了两个函数DBGridRecordSize 和 DBGridAutoSize 用于动态调整列宽,并展示了使用示例。同时,文章讨论了使用 ini 文件存储不同表格列宽的高效方法,以便用户自定义和程序读取。
DBGRID列宽怎么调?
一、设置好你的dbgrid,显示数据后可做如下动作调节你的列宽:
1.双击dbgrid,出现一个编辑框:EDITING DBGRID1.COLUNMS
2.如果是空白的话,点击第三个图标: Add All Fields
3.选择需要设置的行,在它的属性栏,直接设置他了WINDTH值为你想要的.
二、DBGrid自动调整列宽
function DBGridRecordSize(mColumn:TColumn):Boolean;
{   返回记录数据网格列显示最大宽度是否成功   }
begin
Result := False;
if not Assigned(mColumn.Field) then Exit;
mColumn.Field.Tag := Max(mColumn.Field.Tag,
    TDBGrid(mColumn.Grid).Canvas.TextWidth(mColumn.Field.DisplayText));
Result := True;
end; {   DBGridRecordSize   }
function DBGridAutoSize(mDBGrid:TDBGrid; mOffset:Integer = 5):Boolean;
{   返回数据网格自动适应宽度是否成功   }
var
I:Integer;
begin
Result := False;
if not Assigned(mDBGrid) then Exit;
if not Assigned(mDBGrid.DataSource) then Exit;
if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
if not mDBGrid.DataSource.DataSet.Active then Exit;
for I := 0 to mDBGrid.Columns.Count - 1 do
begin
    if not mDBGrid.Columns[I].Visible then Continue;
    if Assigned(mDBGrid.Columns[I].Field) then
      mDBGrid.Columns[I].Width := Max(mDBGrid.Columns[I].Field.Tag,
        mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)) + mOffset
    else
      mDBGrid.Columns[I].Width :=
        mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption) + mOffset;
    mDBGrid.Refresh;
end;
Result := True;
end; {   DBGridAutoSize   }
///////源代码结束
///////使用示例开始
procedure TForm1.DBGrid1DrawColumnCell(Sender:TObject; const Rect:TRect;
DataCol:Integer; Column:TColumn; State:TGridDrawState);
begin
DBGridRecordSize(Column);
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
DBGridAutoSize(DBGrid1);
end;
///////使用示例结束
uses Math;
 
三、在Delphi中用ini文件保存表格列宽
用Delphi做数据库系统开发,免不了要在许多地方输出查询结果,而显示查询结果最经常使用的控件之一当属TDBGrid。
但TDBGrid控件默认的显示列宽是与数据库中对应字段的最大宽度相关的。例如,如果数据库中有一个“联系地址”字段,类型为varchar(200),那么查询结果是显示方式是很不友好的!因为这一列会非常宽。而且,多数情况下,各列的宽度都不是设计者或用户们想要的,这一点想必做系统开发的人都会认同。
曾经,我的解决办法是,在每个查询操作之后 ,再调用一个自定义过程来分别设置各个表格的各列宽度,而这些宽度也是在设计阶段,边设计边调试确定的。这样做不仅麻烦,而且需要做大量的重复工作,非常不方便。并且这样做是非常死板的:程序固定了表格各列的宽度!实际上是设计者固定了!如果能提供一个初始默认值,并由用户自己设置,那当然是最好不过了。
因此,更为高效的一个解决办法是利用ini文件存储各个表格各列的宽度。但为了读取和存储方便,各段中的节名最好使用数字的形式,这样就可以通过一个循环语句实现了。
之所以用ini文件,一是因为ini文件读写非常方便,二是在读取时需指定一个失败时的返回值。当然还可以使用StringList保存设置到其他文本文件中,所谓罗卜青菜各有所爱。
通常需要使用表格的地方不只三两个,那最好就将各个表格的列宽设置保存在同一个ini文件中,通过段名来区分各个表格。
下面讲一下我自己的具体实现方法。
过程定义:
新建一窗体,在接口中引用DBGrids。
定义两个过程SetColumnWidth和SaveColumnWidth,分别用于从/向ini文件读取/保存表格列宽。
两个过程均需要三个参数,分别接受传入的TDBGrid,ini文件中的段名和包含路径的ini文件名;其中段名用于区分不同的表。两个过程分别如下:
-------------------------------------------------------------------------------
procedure TGridForm.SetColumnWidth(const Grid:TDBGrid;section,fname:string);
var
i:integer;
inifile:TIniFile; //调入文件并根据ini文件内容指定DBGrid1的列宽度
begin
if FileExists(fname) then //若文件存在
begin
try
inifile:=TIniFile.Create(fname);
for i :=0 to Grid.Columns.Count-1 do
Grid.Columns[i].Width:=inifile.ReadInteger(section,inttostr(i),150);
finally //读取失败时返回150作默认值,可根据实际情况设写
inifile.Free; //翻译
end;
end;
end;
-------------------------------------------------------------------------------
procedure TGridForm.SaveColumnWidth(const grid:TDBGrid;section,fname:string);
var
i:integer;
inifile:TIniFile; //窗体关闭时记录DBGrid1的列宽度
begin
try
inifile:=TIniFile.Create(fname);
for i:=0 to Grid.Columns.Count-1 do
inifile.WriteInteger(section,inttostr(i),Grid.Columns[i].Width);
//写入各列的宽度,以表格名为段名,以数字为节名,从0开始
//写入当前列宽
finally
inifile.Free;
end;
end;
-------------------------------------------------------------------------------
而为了通用性,这个单元里通常只编写一些通过的或只供内部调用的过程/函数,用于被外部调用。例如窗体名设置为GridForm,单元文件保存为GridUnit,这样,在需要调用上述通过过程的窗体,只需在其引用列表中添加GridUnit,在引用时传入相应的参数即可。
调用:
在查询数据库后调用设置列宽的过程,不管查询返回行数是否为0,因为返回0行(没有返回)时,DBGrid的表格标题会有查询的返回标题:
GridForm.SetColumnWidth(DBGrid1,'库存',ExtractFilePath(Application.ExeName)+'GridWidth.ini');
在主调窗体的关闭事件中保存当前列宽
GridForm.SaveColumnWidth(DBGrid1,'库存',ExtractFilePath(Application.ExeName)+'GridWidth.ini');

其中第二个参数指定在读取/保存的列宽为“库存”表的,第三个参数指定ini文件为应用程序所在目录下的GrdiWidth.ini文件,是通过应用程序目录来查找或存储此ini文件的,而最好不要使用绝对路径。
这样,某个表格第一次显示数据时,仍然是默认的情况,因为此时ini文件里还没存储有该表格的列宽设置。手动调整,关闭窗体后,下次再打开此窗体,列宽就会被设置为上次手动调整的格式了,因为上次的调整结果已经保存到ini文件里了。
下面看一看此ini文件里都有哪些内容:
-------------------------------------------------------------------------------
[员工]
0=96
1=184
2=65
3=112
4=124
5=124
6=123
7=108
[业务清单]
0=64
1=184
2=304
3=82
4=64
5=6004
[部门]
0=75
1=138
2=184
3=127
[用户]
0=184
1=85
2=110
3=177
[供应商]
0=106
1=82
2=82
3=42
4=123
5=123
6=130
7=122
8=141
......
-------------------------------------------------------------------------------
末了,还要说一点:通常保存设置的文件是在当前目录下,另建一个子目录来存储,但这样在读取时需要判断此子目录是否存在,若不存在则先创建之,特别是保存,否则可能会出错。

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值