就是使dbgrid的标题根据列名的长度自动调整宽度

解决方案 »

  1.   

    刚好有一段:
    //调整dbgrid中的内容显示。
    class procedure TMainForm.AdjustDbgridColWidth(objDBGrid:TDBGrid);
    var
      cc:integer;
      i,tmpLength:integer;
      aDgCLength:array of integer;
    begin
      cc:=objDbGrid.Columns.Count-1;
      setlength(aDgCLength,cc+1);
      //file://取标题字段的长度
      for i:=0 to  cc do
      begin
        aDgCLength[i]:= length(objDbGrid.Columns[i].Title.Caption);
      end;
      If objDBGrid.DataSource.DataSet.Active=true then
      begin
        objDBGrid.DataSource.DataSet.First;
        while not objDBGrid.DataSource.DataSet.Eof do
        begin
            //file://取列中每个字段的长度
            for i:=0 to  cc do
            begin
                tmpLength:=length(objDBGrid.DataSource.DataSet.FieldList.Fields[i].DisplayText);
                if tmpLength>aDgCLength[i] then
                    aDgCLength[i]:=tmpLength;
            end;
            objDBGrid.DataSource.DataSet.Next;
        end;
        objDBGrid.DataSource.DataSet.First;
      end;
      for i:=0 to  cc do
      begin
        objDbGrid.Columns[i].Width:=aDgCLength[i]*7;  //7是自已试验后的值,你可以调整它
      end;
    end;
      

  2.   

    dbgrideh.autofitwidth := true;这是3.6版
      

  3.   

    (*//
    标题:数据网格自动适应宽度
    说明:使用DBGrid不可不看
    设计:Zswang
    日期:2002-03-04
    //*)///////Begin Source
    uses
      Math;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 }
    ///////End Source///////Begin Demo
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      DBGridRecordSize(Column);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      DBGridAutoSize(DBGrid1);
    end;
    ///////End Demo