Delphi实现DBGrid列宽度自动调整

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

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

posted @ 2009-03-04 14:57  DELPHI&.NET初学者[TECSOON WENDAY]  阅读(463)  评论(0编辑  收藏  举报