将dbgrid的列宽调整为该列字段最多文字的宽度。

解决方案 »

  1.   

    procedure SetColWidth(adbgrdCtl: TDBGridEh; pMinWidth: Integer = 50; pFieldWidthList: String = '');
    Const
      WIDTH_PER_CHAR = 7;
    Var
      i: Integer;
      ColWidth: Integer;
      WidthList: TStringList;
    procedure SetDefaultWidth();
    Var
      FieldName: String;
      j: Integer;
    begin
      FieldName := adbgrdCtl.Columns[i].Title.Caption;
      //处理多行显示标题
      for j := Length(FieldName) downto 1 do
        if FieldName[j] = '|' then
        begin
          FieldName := RightStr(FieldName,Length(FieldName) - j);
          break;
        end;
      ColWidth := Length(FieldName) * WIDTH_PER_CHAR;
      if ColWidth < pMinWidth then adbgrdCtl.Columns[i].Width := pMinWidth
      else adbgrdCtl.Columns[i].Width := ColWidth;
    end;
    begin
      WidthList := nil;
      if pFieldWidthList <> '' then
      begin
        WidthList := TStringList.Create;
        WidthList.CommaText := pFieldWidthList;
      end;
      try
        for i := 0 to adbgrdCtl.Columns.Count - 1 do
        begin
          adbgrdCtl.Columns[i].Title.Alignment := taCenter;      if WidthList = nil then
          begin
            SetDefaultWidth;
            continue;
          end;      if WidthList.Values[adbgrdCtl.Columns[i].FieldName] = '' then
            SetDefaultWidth
          else adbgrdCtl.Columns[i].Width := StrToInt(WidthList.Values[adbgrdCtl.Columns[i].FieldName]);
        end;
      finally
        if WidthList <> nil then WidthList.Free;
      end;
    end;这段代码会根据你字段名称的长度来定制列宽,看看能不能帮你一下。
      

  2.   

    数据少到时无所谓,多了系统花费就太大了:
    procedure SetColWidth(ADBGRdi:TDBGrid);
    var
      I:Byte;
      SavedPlace:TBookMarkStr;
      ColWidths:array of Integer;
    begin
      with ADBGrid,DataSource.DataSet do
      begin
        SetLength(ColWidths,Columns.Count);
        for I:=0 to Columns.Count-1 do
          ColWidths[I]:=Length(Columns[I].Title.Caption);
        SavedPlace:=BookMark;
        DisableControls;
        try
          First;
          while not EOF do
          begin
            for I:=0 to Columns.Count-1 do
            try
              ColWidths[I]:=Max(ColWidths[I],Length(Columns[I].Field.AsString));
              //这里还可以做一些判断,只是对某些类型字段处理。其它采用默认值就是了
            except
              //屏蔽不能转换为字符的字段导致的异常。
            end;
            Next;
          end;
          for I:=0 to Columns.Count-1 do
            Columns[I].Width:=ColWidths[I];
        finally
          BookMark:= SavedPlace;
          EnableControls;
        end;
      end;
    end;
      

  3.   

    for i:=0 to Dbgrideh1.Columns.Count -1 do
      Dbgrideh1.Columns[i].OptimizeWidth;
    //可以搞定打开后列宽为最小值,不必担心空白区域较大问题