在进行修改后,我们可以得到一个更加智能化的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/)