全球第一免费源码下载基地!
首 页文章中心下载中心繁體中文
首页 ASP源码 | PHP源码 | CGI源码 | JSP源码 | .NET源码 | flash源码 | 其它源码 | 网页模板 | 常用软件 | 字体下载 | 视频教程
站长学院 | 网络编程 | 网页设计 | 图形图像 | 操作系统 | 数据库 | 多媒体 | 黑客攻防 | 编程开发 | Seo专区 | 小说连载
您当前的位置:中文源码之家 -> 站长学院 -> 软件教学 -> 文章内容 退出登录 用户管理
栏目导航
· 软件报道 · 软件教学
· 游戏娱乐 · 小说连载
热门文章
· [推荐] 卡巴斯基v6.0..
· [新闻] 超级解霸3500..
· [推荐] 冰点还原精灵..
· [组图] 一键GHOST硬盘..
· [组图] PQMagic──硬..
· [图文] 一键GHOST 优..
· [新闻] 2006年世界顶..
· [推荐] 征途小宝外挂..
· [新闻] 下载:IE 7 简..
· ASP自动解压RAR文件..
相关文章
· [推荐] CSS教程 CSS盒..
· 用Asp+XmlHttp实现R..
· libc6-dev软件包提供..
· [图文] Microsoft St..
· [新闻] 遨游RSS世界 ..
· [组图] Vista算什么?..
· [图文] Windows Live..
· [推荐] 冰点还原精灵..
· 在 ExcuteReader 中..
· [图文] Windows Live..
精彩激情游戏推荐
Delphi实现DBGrid列宽度自动调整
作者:佚名  来源:www.chcodes.com/  发布时间:2007-8-16 18:48:19  发布人:aijun

减小字体 增大字体

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

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

  


  
(图1)


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

  


  
(图2)
解决方案:

  在本文中我将提供一个简便的过程(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;

  上面一个简单的函数解决了经常会碰到的关于数据列的问题,遇到问题时多多开动脑筋,而不要一味的去找第三方控件,这样长期坚持下去就会真正提高自己的水平,才会从一名程序泥水匠变成真正的软件设计师。
[] [返回上一页] [打 印] [收 藏]
上一篇文章:vsFTPd架设FTP服务器
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright 2005-2006 Chcodes.Com.中文源码之家 All Rights Reserved .
Powered by:NewAsp SiteManageSystem Version 2.1 SP1 1030