dbgrid类控件可以动态改变列宽 但如何才能让每列的宽=实际数据库列中最大宽度拉?
也就是说比如dbgrid.coulmns[1]列中默认宽度是等于字段设计宽度的 但如何让dbgrid列宽等于实际数据最大宽度 如何求这个最大列宽度 让dbgrid.coulmns[n].wigth能动态自动适应?有人知道么?

解决方案 »

  1.   

    function TserverFrm.DBGridRecordSize(mColumn: TColumn): Boolean;
    { 返回记录数据网格列显示最大宽度是否成功 }
    begin
      Result := False;
      if not Assigned(mColumn.Field) then Exit;
      mColumn.Field.Tag := Max(mColumn.Field.Tag,
        TDBGrid(mColumn.Grid).Canvas.TextWidth(mColumn.Field.DisplayText));
      Result := True;
    end; { DBGridRecordSize }function TserverFrm.DBGridAutoSize(mDBGrid: TDBGrid; mOffset: Integer = 12): Boolean;
    { 返回数据网格自动适应宽度是否成功 }
    var
      I: Integer;
    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;
      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
          mDBGrid.Columns[I].Width := Max(mDBGrid.Columns[I].Field.Tag,
            mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)) + mOffset
        else
        mDBGrid.Columns[I].Width :=
          mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption) + mOffset;
        mDBGrid.Refresh;
      end;
      Result := True;
    end; { DBGridAutoSize }
      

  2.   

    procedure TserverFrm.DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
    DBGridRecordSize(Column);
    end;
      

  3.   

    procedure TserverFrm.ADOQuery2AfterOpen(DataSet: TDataSet);
    var
      i,wid:integer;begin
    //标题居中
    for i:=0 to  dbgrid1.FieldCount-1 do
    begin
      dbgrid1.Columns[i].Title.Alignment:= taCenter;
    end;   wid:=0;
    for i:=0 to dbgrid1.Columns.Count-1 do
     begin
        dbgrid1.Columns[i].Alignment:=taCenter;
        wid:=wid+ dbgrid1.Columns[i].Width;
     end;
     if wid < dbgrid1.Width then
       begin
         for i:=0 to  dbgrid1.Columns.Count-1 do
           begin
             dbgrid1.Columns[i].Width:=dbgrid1.Columns[i].Width+(dbgrid1.Width-wid)div(dbgrid1.Columns.Count)-1 ;
           end;
       end
     else
      begin
      DBGridAutoSize(DBGrid1);
      //dbgrid1
      end;
      

  4.   

    我想能不能这样? length(table1field1.asstring) 取得某个自段字符长度,
    然后根据这个长度乘以某个数字(一个字符要多宽)。