各位大哥帮帮忙,自动改变宽度的 DBGrid 的问题?(源码贴出)

                            
小弟写了个动态改变宽度的   DBGrid   。   
  如果有两个   DataSet   ,  
  第一     DataSet,的数据在   DBGrid   中显示,         能改变   DBGrid   的宽度。  
  第二     DataSet,的数据在   DBGrid   中显示,就不能改变   DBGrid   的宽度。  
  我觉得是   DBGrid   的某个永久属性作怪,但不知道怎样调试。  
  //在运行时,我的   DataSet   都   Close   了,DataSource   都   nil   了。  
  郁闷ing!!!!  
     
   
  unit   AutoSizeDBGrid;  
   
  interface  
   
  uses  
      SysUtils,   Classes,   Controls,   Grids,   DBGrids,  
        DBCtrls,   Db,Types,Graphics,DBGridEh;  
   
  type  
      TAutoSizeDBGrid   =   class(TDBGrid)  
      private  
          {   Private   declarations   }  
          function   Max(const   int1:integer;const   int2:integer):integer;  
      protected  
          {   Protected   declarations   }  
      public  
          {   Public   declarations   }  
          constructor   Create(AOwner:   TComponent);override;  
          destructor   Destroy;override;  
          function   DBGridAutoSize(mDBGrid:   TDBGrid;   mOffset:   Integer   =   10):   Boolean;  
      published  
          {   Published   declarations   }  
      end;  
   
  procedure   Register;  
   
  implementation  
   
  procedure   Register;  
  begin  
      RegisterComponents('YPalette',   [TAutoSizeDBGrid,TAutoSizeDBGridEh]);  
  end;  
   
  constructor   TAutoSizeDBGrid.Create(AOwner:   TComponent);  
  begin  
      inherited;  
      self.Font.Size:=12;  
      self.FixedColor:=clSkyBlue;  
      self.TitleFont.Size:=12;  
      self.TitleFont.Style:=[fsBold];  
      //Canvas.Font.Assign(Font);  
      //Canvas.Font.Assign(TitleFont);  
  end;  
   
  destructor   TAutoSizeDBGrid.Destroy;  
  begin  
      inherited;  
  end;  
   
  function   TAutoSizeDBGrid.Max(const   int1:integer;const   int2:integer):integer;  
  begin  
      Result:=int2;  
      if   int1>int2   then  
      begin  
          Result:=int1;  
      end;  
  end;  
   
  function   TAutoSizeDBGrid.DBGridAutoSize(mDBGrid:   TDBGrid;   mOffset:   Integer   =   10):   Boolean;  
  {   返回数据网格自动适应宽度是否成功   }  
  var  
      I:   Integer;  
      MyStrings:TStringList;  
  begin  
      Result   :=   False;  
      if   not   Assigned(mDBGrid)   then   Exit;  
      if   not   Assigned(mDBGrid.DataSource)   then   Exit;  
      if   not   Assigned(mDBGrid.DataSource.DataSet)   then   Exit;  
      if   not   mDBGrid.DataSource.DataSet.Active   then   Exit;  
      MyStrings:=TStringList.Create;  
      try  
          for   I   :=   0   to   mDBGrid.Columns.Count   -   1   do  
          begin  
              if   not   mDBGrid.Columns[I].Visible   then  
                              Continue;  
                if   Assigned(mDBGrid.Columns[I].Field)   then  
                begin  
                    MyStrings.Clear;  
                    mDBGrid.DataSource.DataSet.First;  
                    while   not   mDBGrid.DataSource.DataSet.Eof   do  
                    begin     //把字符的个数加到   StringLists   中去  
                        MyStrings.Add(IntToStr(Length(mDBGrid.DataSource.DataSet.Fields[i].AsString)));  
                        mDBGrid.DataSource.DataSet.Next;  
                    end;  
          MYStrings.Sort;//选出   mDBGrid.DataSource.DataSet.Fields[i]   中最宽  
    //   mDBGrid.DataSource.DataSet.Fields[i]   中最宽的    
  //与   Title.Caption   ,选最宽的。  
  mDBGrid.Columns[I].Width:=(Max(mDBGrid.Canvas.TextWidth('a')*(StrToInt(MYStrings.Strings[MYStrings.Count-1])),   mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)))   +   mOffset;  
                end  
                else  
                begin  
                      mDBGrid.Columns[I].Width:=   mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)   +   mOffset;  
                end;  
                mDBGrid.Refresh;  
          end;  
          mDBGrid.DataSource.DataSet.First;  
      finally  
          MyStrings.Free;  
      end;  
      Result   :=   True;  
  end;   {   DBGridAutoSize   }  
   
  end.  
   
  调试代码:  
   
  procedure   TForm1.BitBtn1Click(Sender:   TObject);  
  begin  
      self.Query1.Active:=Not   self.Query1.Active;  
      if   self.Query1.Active   then  
      begin  
          self.AutoSizeDBGrid1.DataSource:=self.DataSource1;  
          self.AutoSizeDBGrid1.DBGridAutoSize(self.AutoSizeDBGrid1);  
      end;  
  end;  
   
  procedure   TForm1.BitBtn3Click(Sender:   TObject);  
  begin  
      self.Query2.Active:=Not   self.Query2.Active;  
      if   self.Query2.Active   then  
      begin  
          self.AutoSizeDBGrid1.DataSource:=nil;  
          self.AutoSizeDBGrid1.DataSource:=self.DataSource2;  
          self.AutoSizeDBGrid1.DBGridAutoSize(self.AutoSizeDBGrid1);  
      end;  
  end;  
 

查看回复