给你看我以前写的代码: procedure tviewallfrm.setclowid; //让列宽最适合间距 var i,Grid1CloWth:integer; begin DBGrid.Visible:=false; for i:=0 to DBGrid.Columns.Count-1 do begin Grid1CloWth:=canvas.TextWidth(DBGrid.Columns[i].DisplayName)+5;//取标题字段宽 mainfrm.adoquery1.First; while not mainfrm.adoquery1.Eof do begin if Grid1CloWth<canvas.TextWidth(trim(mainfrm.adoquery1.Fields[i].AsString)) then Grid1CloWth:=canvas.TextWidth(trim(mainfrm.adoquery1.Fields[i].AsString))+8; mainfrm.adoquery1.Next; end; DBGrid.Columns[i].Width:=Grid1CloWth; end; DBGrid.Visible:=true; end;
DBGrid1.Fields[0].DisplayWidth:= 50;
1、每次查询结果不同,TDBGrid的列宽就在变来变去,显得界面很乱
2、严重影响效率,因为你要根据内容设置独出每列数据源的最大值,然后根据当前字体设置宽度!
3、有一个很严重的问题就是在很多字体下一个汉字并不是两个英文字符的宽度(例如宋体10号一个汉字宽度是13,而2个英文字符宽度是14),这种情况下你的设置毫无意义
4、日期,数字等字段的长度不固定,如果单纯从数据库中读取长度根本毫无意义!方法:
将数据字段转换成文本后获取长度,然后根据当前字体读取字体宽度,两个相乘在加固定值即可!
我也想知道,你的意思我明白,就是要根锯字段的内容(也就是要知道其中最长的那条内容)
有多长,我想了半天,还是没有结果,谁知道解决方案
原来你也想知道啊
procedure tviewallfrm.setclowid; //让列宽最适合间距
var
i,Grid1CloWth:integer;
begin
DBGrid.Visible:=false;
for i:=0 to DBGrid.Columns.Count-1 do begin
Grid1CloWth:=canvas.TextWidth(DBGrid.Columns[i].DisplayName)+5;//取标题字段宽
mainfrm.adoquery1.First;
while not mainfrm.adoquery1.Eof do begin
if Grid1CloWth<canvas.TextWidth(trim(mainfrm.adoquery1.Fields[i].AsString)) then
Grid1CloWth:=canvas.TextWidth(trim(mainfrm.adoquery1.Fields[i].AsString))+8;
mainfrm.adoquery1.Next;
end;
DBGrid.Columns[i].Width:=Grid1CloWth;
end;
DBGrid.Visible:=true;
end;