Delphi中实现DBGrid列宽度自动调整

迷离忧伤7

迷离忧伤7

2016-02-19 16:11

有了下面这个Delphi中实现DBGrid列宽度自动调整教程,不懂Delphi中实现DBGrid列宽度自动调整的也能装懂了,赶紧get起来装逼一下吧!

  大多数程序设计的爱好者选择并使用Delphi来编写软件,都是被其中丰富而功能强大的VCL控件所吸引。Delphi自带的数据感知(Data-Aware)控件,更是成为开发MIS软件的程序员之首选。在那么多数据感知控件中,TDBGrid由于其使用方便、显示信息量大成为最引人注目的一员,大量的国内外软件中都出现了它的身影。或许是由于使用的人多了,对于它的期望也会更高,永远追求无限趋向于完美境界的程序员不会放过每一个能够改良TDBGrid的机会。

  经常使用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),就是用它来控制列的宽度:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  

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;

  上面一个简单的函数解决了经常会碰到的关于数据列的问题,遇到问题时多多开动脑筋,而不要一味的去找第三方控件,这样长期坚持下去就会真正提高自己的水平,才会从一名程序泥水匠变成真正的软件设计师。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

Delphi中实现DBGrid列宽度自动调整

编程语言 网络编程
Delphi中实现DBGrid列宽度自动调整

Delphi中数据网格DBGrid应用

Delphi
Delphi中数据网格DBGrid应用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在DBGrid中实现Copy、Paste功能

编程语言 网络编程
在DBGrid中实现Copy、Paste功能

在Delphi的DBGrid中插入其他可视组件

编程语言 网络编程
在Delphi的DBGrid中插入其他可视组件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi实现同类型文档自动合并

Delphi
Delphi实现同类型文档自动合并

Delphi中如何实现透明按钮

Delphi
Delphi中如何实现透明按钮

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

div+css与xhtml+css是什么意思?

div+css与xhtml+css是什么意思?

GoLive与DreamWeaver的未来之路

GoLive与DreamWeaver的未来之路
下拉加载更多内容 ↓