想自己做个控件,从TDBGrid承续,来完成自动列宽.
在重载DrawColumnCell中输入
  Column.Field.Tag   :=   Max(Column.Field.Tag,   
  TDBGrid(Column.Grid).Canvas.TextWidth(Column.Field.DisplayText));函数    
  procedure   DBGridAutoSize();   
  {   数据网格自动适应宽度   }   
  var   
  I:   Integer;   
  begin       
  for   I   :=   0   to   self.Columns.Count   -   1   do   begin   
  if   not   self.Columns[I].Visible   then   Continue;   
  if   Assigned(self.Columns[I].Field)   then   
  self.Columns[I].Width   :=   Max(self.Columns[I].Field.Tag,   
  self.Canvas.TextWidth(self.Columns[I].Title.Caption))  
  else   self.Columns[I].Width   :=   
  self.Canvas.TextWidth(self.Columns[I].Title.Caption);   
  self.Refresh;   
  end;    
  end;   {   DBGridAutoSize   } 将DBGridAutoSize放在 DrawColumnCell 和 Paint 中是有效果,但是一直刷新.
请问放到那个位置可以呢,或者有别的写法.
  

解决方案 »

  1.   

    放到数据集Open后就行了,不要放在DrawColumnCell 和 Paint ,否则烦死你
      

  2.   

    1楼的意思是,在你的数据集打开后,再执行DBGridAutoSize~~例如procedure Tcxfm.BitBtn3Click(Sender: TObject);
    begin
       with adoquery1 do 
       begin
       close;
       sql.clear;
       sql.add('select * from table');
       open;
       end;
       DBGridAutoSize(dbgrid1);
    end;
      

  3.   

    3楼的意思我明白
    可能估计我还没有把我的意思表达清楚吧我说的是做一控件,而我想将这个函数放到控件类的某个位置,只要在装载数据的时候它就自动调整列宽,而不需要在设计程序的时候再调用DBGridAutoSize这个函数.
      

  4.   

    function TDataLink.ExecuteAction(Action: TBasicAction): Boolean;通过此方法判断后执行你的代码
      

  5.   

    本人使用的控制宽度的方法,全部代码如下: 
    procedure SetDBGridSizeQuery(DataSource:TDataSource;Query:TQuery;DBGrid:TDBGrid);
    var i,j : integer;
        FieldWidth  : Array[0..160] of integer;   //网格宽度数据
        Bkmk:TBook;
    begin
      if Query.Active then
      begin
        Bkmk:=Query.GetBook;
        with DBGrid do
        begin
          for i:=0 to DataSource.DataSet.FieldCount-1 do
          begin
            FieldWidth[i]:=canvas.TextWidth(DBGrid.Columns[i].Title.Caption) + 4;
            if DataSource.DataSet.Fields[i].DataType=ftDate then
              if canvas.TextWidth('2000/12/12')>FieldWidth[i] then
                FieldWidth[i]:=canvas.TextWidth('2000/12/12')+4;
          end;
          j:=1;
          Query.DisableControls;
          Query.First;                                                  // 数据指向首页
          while not Query.Eof do
          begin
            j:=j+1;
            for i:=0 to DataSource.DataSet.FieldCount-1 do              // 统计各网格的宽度
              if (DataSource.DataSet.Fields[i].DataType=ftString) or
                 (DataSource.DataSet.Fields[i].DataType=ftinteger) or
                 (DataSource.DataSet.Fields[i].DataType=ftCurrency) then
            begin
                if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4) then
                  FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4);
                if (DataSource.DataSet.Fields[i].DataType=ftCurrency) then
                  if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44) then
                    FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44);
            end;
            Query.next;
            if j>20 then break;
          end;
          Query.GotoBook(Bkmk);
          Query.FreeBook(Bkmk);
          Query.EnableControls;
        end;
      end;
      for i:=0 to DataSource.DataSet.FieldCount-1 do
        DBGrid.Columns[i].Width:=FieldWidth[i];
    end;