Delphi中实现DBGrid列宽度自动调整
2008-02-23 07:18:31来源:互联网 阅读 ()
经常使用TDBGrid的用户都知道,它没有提供这样的一种选择,使得我们能够让它的每一列与所要显示的数据的宽度相匹配。使得用户需要在程序运行时,手工对每一列进行调整,在下次运行这个程序时又得再做一遍同样的工作(图1)。
在进行修改后,我们可以得到一个更加智能化的TDBGrid,如果TDBGrid中所有列的宽度加起来大于它本身的宽度,那么智能化的TDBGrid将会在它所含的最后一列的右边留出空白(见图2);反之如果TDBGrid中所有列的宽度加起来小于它本身的宽度,则会在它的下部显示一个水平滚动条,用户就可以左右拖动该滚动条,显示更多想要的内容。
解决方案:
在本文中我将提供一个简便的过程(Procedure)来解决上面的问题,它能够在程序运行时自动固定TDBGrid中所显示列的宽度。
首先,在TForm的OnCreate事件中添加下面的代码:
Procedure TForm1.FormCreate(Sender: TObject);
begin
//在Tag属性中设置需要自动调整的列的最小宽度(固定值)
//这里将列宽值设为40px
Table1.FieldByName('FirstName').Tag := 40;
//这里设置一个变化的值
//该值是做过运算的列标题的宽度值
Table1.FieldByName('LastName').Tag := 4 Canvas.TextWidth( Table1.FieldByName('LastName').DisplayName);
end;
其次,最关键的一个过程(Procedure),就是用它来控制列的宽度:
Procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
var
i : integer;
TotWidth : integer;//定义整个宽度
VarWidth : integer;//定义变化的宽度
ResizableColumnCount : integer;//定义变化宽度列的总数
AColumn : TColumn;
begin
//在重新调整前所有列的宽度
TotWidth := 0;
VarWidth := 0;
//有多少列需要自动调整
ResizableColumnCount := 0;
for i := 0 to -1 DBGrid.Columns.Count do
begin
TotWidth := TotWidth DBGrid.Columns[i].Width;
if DBGrid.Columns[i].Field.Tag <> 0 then
Inc(ResizableColumnCount);
end;
//为每个列分隔线增加1PX
if dgColLines in DBGrid.Options then
TotWidth := TotWidth DBGrid.Columns.Count;
if dgIndicator in DBGrid.Options then
TotWidth := TotWidth IndicatorWidth;
VarWidth := DBGrid.ClientWidth - TotWidth;
//平均分配变化宽度的值
//给所有需要自动调整的列
if ResizableColumnCount > 0 then
VarWidth := varWidth div ResizableColumnCount;
for i := 0 to -1 DBGrid.Columns.Count do
begin
AColumn := DBGrid.Columns[i];
if AColumn.Field.Tag <> 0 then
begin
AColumn.Width := AColumn.Width VarWidth;
if AColumn.Width < AColumn.Field.Tag then
AColumn.Width := AColumn.Field.Tag;
end;
end;
end;
最后,应用这一个函数:
Procedure TForm1.FormResize(Sender: TObject);
begin
FixDBGridColumnsWidth(DBGrid1);
end;
上面一个简单的函数解决了经常会碰到的关于数据列的问题,遇到问题时多多开动脑筋,而不要一味的去找第三方控件,这样长期坚持下去就会真正提高自己的水平,才会从一名程序泥水匠变成真正的软件设计师。
上一篇: 想成高手吗?快来学Delphi快捷键
下一篇: 浅谈Delphi如何控制Excel操作
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Delphi高精度计时方法
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash