科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Delphi中实现DBGrid列宽度自动调整

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

TDBGrid由于其使用方便、显示信息量大成为最引人注目的一员,大量的国内外软件中都出现了它的身影。

作者:小刀轻舞 来源:天极网 2007年10月31日

关键字: Delphi DBGRID 列宽度 自动调整

  • 评论
  • 分享微博
  • 分享邮件
大多数程序设计的爱好者选择并使用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),就是用它来控制列的宽度:

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;

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章