Delphi 调整列宽DBGrid

Delphi 调整列宽DBGrid,delphi,dbgrid,Delphi,Dbgrid,我有一个TDBGrid。它可以工作,但显示的列非常大 如何设置“自动固定列宽”所需的列宽取决于网格画布的设置和每个字段显示文本的最大长度 procedure FitGrid(Grid: TDBGrid); const C_Add=3; var ds: TDataSet; bm: TBookmark; i: Integer; w: Integer; a: Array of Integer; begin ds := Grid.DataSource.DataSet; i

我有一个TDBGrid。它可以工作,但显示的列非常大


如何设置“自动固定列宽”

所需的列宽取决于网格画布的设置和每个字段显示文本的最大长度

procedure FitGrid(Grid: TDBGrid);
const
  C_Add=3;
var
  ds: TDataSet;
  bm: TBookmark;
  i: Integer;
  w: Integer;
  a: Array of Integer;
begin
  ds := Grid.DataSource.DataSet;
  if Assigned(ds) then
  begin
    ds.DisableControls;
    bm := ds.GetBookmark;
    try
      ds.First;
      SetLength(a, Grid.Columns.Count);
      while not ds.Eof do
      begin
        for I := 0 to Grid.Columns.Count - 1 do
        begin
          if Assigned(Grid.Columns[i].Field) then
          begin
            w :=  Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText);
            if a[i] < w  then
               a[i] := w ;
          end;
        end;
        ds.Next;
      end;
      for I := 0 to Grid.Columns.Count - 1 do
        Grid.Columns[i].Width := a[i] + C_Add;
        ds.GotoBookmark(bm);
    finally
      ds.FreeBookmark(bm);
      ds.EnableControls;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FitGrid(DBgrid1)
end;
程序FitGrid(网格:TDBGrid);
常数
C_Add=3;
变量
ds:TDataSet;
bm:TBookmark;
i:整数;
w:整数;
a:整数数组;
开始
ds:=Grid.DataSource.DataSet;
如果分配(ds),则
开始
禁用控制;
bm:=ds.GetBookmark;
尝试
第一,;
SetLength(a,Grid.Columns.Count);
而不是ds.Eof
开始
对于I:=0到Grid.Columns.Count-1 do
开始
如果指定了(Grid.Columns[i].Field),则
开始
w:=Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText);
如果a[i]
对bummi的答案进行微小修改,以确保标题行(第0行)不会被截断

procedure FitGrid(Grid: TDBGrid);
const
  C_Add=3;
var
  ds: TDataSet;
  bm: TBookmark;
  i: Integer;
  w: Integer;
  a: Array of Integer;
begin
  ds := Grid.DataSource.DataSet;
  if Assigned(ds) then
  begin
    ds.DisableControls;
    bm := ds.GetBookmark;
    try
      ds.First;
      SetLength(a, Grid.Columns.Count);
      while not ds.Eof do
      begin
        for I := 0 to Grid.Columns.Count - 1 do
        begin
          if Assigned(Grid.Columns[i].Field) then
          begin
            w :=  Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName.).DisplayText);
            if a[i] < w  then
               a[i] := w ;
          end;
        end;
        ds.Next;
      end;
      //if fieldwidth is smaller than Row 0 (field names) fix
      for I := 0 to Grid.Columns.Count - 1 do
      begin
        w :=  Grid.Canvas.TextWidth(Grid.Columns[i].Field.FieldName);
        if a[i] < w  then
           a[i] := w ;
      end;

      for I := 0 to Grid.Columns.Count - 1 do
        Grid.Columns[i].Width := a[i] + C_Add;
        ds.GotoBookmark(bm);
    finally
      ds.FreeBookmark(bm);
      ds.EnableControls;
    end;
  end;
end;
程序FitGrid(网格:TDBGrid);
常数
C_Add=3;
变量
ds:TDataSet;
bm:TBookmark;
i:整数;
w:整数;
a:整数数组;
开始
ds:=Grid.DataSource.DataSet;
如果分配(ds),则
开始
禁用控制;
bm:=ds.GetBookmark;
尝试
第一,;
SetLength(a,Grid.Columns.Count);
而不是ds.Eof
开始
对于I:=0到Grid.Columns.Count-1 do
开始
如果指定了(Grid.Columns[i].Field),则
开始
w:=Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName.).DisplayText);
如果a[i]
对bummi的答案进行微小修改,以确保标题行(第0行)不会被截断,并在每列上分配多余的空间

procedure FitGrid(Grid: TDBGrid);
const
  C_Add = 3;
var
  ds: TDataSet;
  bm: TBookmark;
  i: Integer;
  w: Integer;
  a: array of Integer;
begin
  ds := Grid.DataSource.DataSet;

  if not Assigned(ds) then
    exit;

  if Grid.Columns.Count = 0 then
    exit;

  ds.DisableControls;
  bm := ds.GetBookmark;
  try
    ds.First;
    SetLength(a, Grid.Columns.Count);
    for i := 0 to Grid.Columns.Count - 1 do
      if Assigned(Grid.Columns[i].Field) then
        a[i] := Grid.Canvas.TextWidth(Grid.Columns[i].FieldName);

    while not ds.Eof do
    begin

      for i := 0 to Grid.Columns.Count - 1 do
      begin
        if not Assigned(Grid.Columns[i].Field) then
          continue;

        w := Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText);

        if a[i] < w then
          a[i] := w;
      end;
      ds.Next;
    end;

    w := 0;
    for i := 0 to Grid.Columns.Count - 1 do
    begin
      Grid.Columns[i].Width := a[i] + C_Add;
      inc(w, a[i] + C_Add);
    end;

    w := (Grid.ClientWidth - w - 20) div (Grid.Columns.Count);

    if w > 0 then
      for i := 0 to Grid.Columns.Count - 1 do
        Grid.Columns[i].Width := Grid.Columns[i].Width + w;


    ds.GotoBookmark(bm);
  finally
    ds.FreeBookmark(bm);
    ds.EnableControls;
  end;
end;
程序FitGrid(网格:TDBGrid);
常数
C_Add=3;
变量
ds:TDataSet;
bm:TBookmark;
i:整数;
w:整数;
a:整数数组;
开始
ds:=Grid.DataSource.DataSet;
如果未分配(ds),则
出口
如果Grid.Columns.Count=0,则
出口
禁用控制;
bm:=ds.GetBookmark;
尝试
第一,;
SetLength(a,Grid.Columns.Count);
对于i:=0到Grid.Columns.Count-1 do
如果指定了(Grid.Columns[i].Field),则
a[i]:=Grid.Canvas.TextWidth(Grid.Columns[i].FieldName);
而不是ds.Eof
开始
对于i:=0到Grid.Columns.Count-1 do
开始
如果未指定(Grid.Columns[i].Field),则
继续;
w:=Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText);
如果a[i]0,则
对于i:=0到Grid.Columns.Count-1 do
Grid.Columns[i]。宽度:=Grid.Columns[i]。宽度+w;
哥托博马克博士(bm);
最后
免费书签(bm);
ds.EnableControl;
结束;
结束;

对bummi、TheSteven和Jens的答案进行了细微修改,以确保标题行(第0行)不会被截断,并且会在每列上分配多余的空间,并考虑列的可见性

procedure-FitGrid(const-Grid:TDBGrid;const-CoverWhiteSpace:Boolean=True);
常数
C_Add=3;
变量
DS:TDataSet;
BM:TBookmark;
一、 W,VisibleColumnsCount:整数;
A:整数数组;
VisibleColumns:TColumn的数组;
开始
DS:=Grid.DataSource.DataSet;
如果分配(DS),则
开始
VisibleColumnsCount:=0;
SetLength(VisibleColumns、Grid.Columns.Count);
对于I:=0到Grid.Columns.Count-1 do
如果指定了(Grid.Columns[I].Field)和(Grid.Columns[I].Visible),则
开始
VisibleColumns[VisibleColumnsCount]:=Grid.Columns[I];
公司(VisibleColumnsunt);
结束;
设置长度(VisibleColumns,VisibleColumnsCount);
禁用控制;
BM:=DS.GetBookmark;
尝试
第一,;
设置长度(A,可见列);
而不是DS.Eof
开始
对于I:=0的VisibleColumnsCount-1 do
开始
W:=Grid.Canvas.TextWidth(DS.FieldByName(VisibleColumns[I].Field.FieldName).DisplayText);
如果A[I]procedure FitGrid(const Grid: TDBGrid; const CoverWhiteSpace: Boolean = True);
const
  C_Add=3;
var
  DS: TDataSet;
  BM: TBookmark;
  I, W, VisibleColumnsCount: Integer;
  A: array of Integer;
  VisibleColumns: array of TColumn;
begin
  DS := Grid.DataSource.DataSet;
  if Assigned(DS) then
  begin
    VisibleColumnsCount := 0;
    SetLength(VisibleColumns, Grid.Columns.Count);
    for I := 0 to Grid.Columns.Count - 1 do
      if Assigned(Grid.Columns[I].Field) and (Grid.Columns[I].Visible) then
      begin
        VisibleColumns[VisibleColumnsCount] := Grid.Columns[I];
        Inc(VisibleColumnsCount);
      end;
    SetLength(VisibleColumns, VisibleColumnsCount);

    DS.DisableControls;
    BM := DS.GetBookmark;
    try
      DS.First;
      SetLength(A, VisibleColumnsCount);
      while not DS.Eof do
      begin
        for I := 0 to VisibleColumnsCount - 1 do
        begin
            W :=  Grid.Canvas.TextWidth(DS.FieldByName(VisibleColumns[I].Field.FieldName).DisplayText);
            if A[I] < W then
               A[I] := W;
        end;
        DS.Next;
      end;
      //if fieldwidth is smaller than Row 0 (field names) fix
      for I := 0 to VisibleColumnsCount - 1 do
      begin
        W := Grid.Canvas.TextWidth(VisibleColumns[I].Field.FieldName);
        if A[I] < W then
           A[I] := W;
      end;

      W := 0;
      if CoverWhiteSpace then
      begin
        for I := 0 to VisibleColumnsCount - 1 do
          Inc(W, A[I] + C_Add);
        W := (Grid.ClientWidth - W - 20) div VisibleColumnsCount;
        if W < 0 then
          W := 0;
      end;

      for I := 0 to VisibleColumnsCount - 1 do
        VisibleColumns[I].Width := A[I] + C_Add + W;
      DS.GotoBookmark(BM);
    finally
      DS.FreeBookmark(BM);
      DS.EnableControls;
    end;
  end;
end;
 const
  C_Add=20;
Sup := 0;
      if CoverWhiteSpace then
        sup :=C_Add;

      for I := 0 to VisibleColumnsCount - 1 do
          VisibleColumns[I].Width := A[I] + sup;
      DS.GotoBookmark(BM);