用DBGrid控件和数据库连接起来显示数据库中的记录时,DBGrid的每一列的宽度和在数据库中字段的宽度有关,有时显示出来的内容很短,但是DBGrid的列很宽,这样不好看。能不能让DBGrid中某一列的宽度自动适应显示内容的宽度?就和label控件的autosize差不多?

解决方案 »

  1.   

    function 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 DBGridAutoSize(mDBGrid: TDBGrid; mOffset: Integer = 5): 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 }
    ///////源代码结束
    {列宽}
    procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       DBGridRecordSize(Column);
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     DBGridAutoSize(DBGrid1);
    end;
      

  2.   

    tag是个保留的属性,用DBGrideh控件可能也行的吧?
      

  3.   

    DBGrid的宽度会根据数据库中字段的宽度自动调整啊,如不行的话,可以对连接数据集的字段进行设置。
      

  4.   

    我怎么也装不上dbgridEh控件,说是找不到一个叫*.pcu的文件.这是怎么回事?
      

  5.   

    dbgrid可以动态添加字段的呀,然后选定fieldname