Delphi调整Dbgrid列宽
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.Fiel d.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.Ca ption)) + mOffset
else
mDBGrid.Columns[I].Width :=
mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Ca ption) + 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文件保存
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
格列宽
用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
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
......
-------------------------------------------------------------------------------
末了,还要说一点:通常保存设置的文件是在当前目录下,另建一个子目录来存储,但这样在读取时需要判断此子目录是否存在,若不存在则先创建之,特别是保存,否则可能会出错。