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

2016-02-19 16:11 178 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

  经常使用TDBGrid的用户都知道,它没有提供这样的一种选择,使得我们能够让它的每一列与所要显示的数据的宽度相匹配。使得用户需要在程序运行时,手工对每一列进行调整,在下次运行这个程序时又得再做一遍同样的工作(图1)。

  在进行修改后,我们可以得到一个更加智能化的TDBGrid,如果TDBGrid中所有列的宽度加起来大于它本身的宽度,那么智能化的TDBGrid将会在它所含的最后一列的右边留出空白(见图2);反之如果TDBGrid中所有列的宽度加起来小于它本身的宽度,则会在它的下部显示一个水平滚动条,用户就可以左右拖动该滚动条,显示更多想要的内容。

  解决方案:

  在本文中我将提供一个简便的过程(Procedure)来解决上面的问题,它能够在程序运行时自动固定TDBGrid中所显示列的宽度。

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

  首先,在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; 

  最后,应用这一个函数:

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

  

Procedure TForm1.FormResize(Sender: TObject);begin FixDBGridColumnsWidth(DBGrid1);end;

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

来源:http://www.tulaoshi.com/n/20160219/1611298.html

延伸阅读
我们知道,屏幕分辨率的设置影响着表单布局,假设你的机器上屏幕分辨率是800*600,而最终 要分发应用的机器分辨率为640*480,或1024*768,这样你原先设计的表单在新机器上势必会 走样。这时你一定希望表单能自己适应不同的分辨率,下面就有两种方法可供你参考。 一、根据新的分辨率自动重画表单及控件 先在表单单元的Interface部...
  Delphi中实现汉字拼音声母查询,unit代码如下: unit Unit1; interface uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   StdCtrls; type   TForm1 = class(TForm)     ListBox1: TListBox;     List...
标签: excel
教你自动调整Excel单元格行高和列宽   有没有觉得Excel单元格比较窄,写的文字经常会出格的?或者,单元格高度不够,我们的文字字号大了就显示不出来的?如果你有这些困扰,就赶快来看看怎么自动调整Excel单元格的行高和列宽吧,我们下面就以在Excel2013中自动调整列宽为例来讲解一下吧。 方法一 1、用Excel2013打开一篇工作...
标签: excel
如何自动调整Excel单元格行高和列宽   方法一 1、用Excel2013打开一篇工作表,选中我们需要调整列宽的单元格,切换到开始选项卡,选择单元格组中格式下的自动调整列宽选项。 2、返回工作表,我们就能看到之前选中单元格的列宽已经自动进行了调整,效果如下: 方法二 用Excel2013打开一篇工作表,选中我...
标签: Java JAVA基础
本文用eclipse的自动重构功能对一个程序实例进行重构,目的是探索Eclipse自动重构可以在多大程度上辅助重构这个过程。程序实例使用《Refactoring:Improving the Design of Existing Code》一书中的例子。 Eclipse的自动重构功能能够很好地支持各种程序元素的重命名,并自动更新相关的引用。Eclipse能够支持方法、字段在...

经验教程

289

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部