如何根据其内容自动调整/缩放DBGrid(或其他类似的)列宽?

Ple*_*rds 9 database delphi delphi-2006 tdbgrid

我正在尝试创建一个框架,其中包含DBGrid超过10个表,其中一半字段为默认值,其他字段为每个表独占.

由于列的空间有限,我不想手动配置每个表的每一列,因为它是非常差的质量工作,我想知道一种方法来计算每列内部最大内容的宽度.列,由自己的组件或数据集测量.

有谁知道的方式?世界上有一些具有这种力量的定制组件吗? 根据网格所有可见列中的可见数据,我需要一个实现大小增加和减少的解决方案. 到目前为止,我的解决方案是绘制所选单元格的问题,从所选数据集行中跳出.

在此输入图像描述


注意:请不要关闭我的问题.它与网格的宽度或形状的宽度无关.它是关于所有列宽度以最小化水平滚动条,但不一定隐藏它.

alz*_*mar 10

您需要做的是使用网格画布来测量每列的内容并相应地设置列的宽度.您可以遍历数据集或使用OnColumnDraw-Event来动态调整宽度.

这是一个示例(我必须使用5像素的偏移量)

procedure TForm7.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var
  w : Integer;

begin
  w := 5+DBGrid.Canvas.TextExtent(Column.Field.DisplayText).cx;
  if w>column.Width then Column.Width := w;
end;

procedure TForm7.FormActivate(Sender: TObject);
Var
  i : Integer;

begin
  // Initialize width
  for I := 0 to DBGrid.Columns.Count - 1 do
    DBGrid.Columns[i].Width := 5 + DBGrid.Canvas.TextWidth(DBGrid.Columns[i].title.caption)
end;
Run Code Online (Sandbox Code Playgroud)


Ces*_*ero 7

编辑:

我的第一个代码是关于拟合网格中的列,使用这个新代码,AutoSizeColumns读取记录以计算每列的宽度,直到MaxRows或Dataset.Eof为止:

class function TDBGridHelper.AutoSizeColumns(DBGrid: TDBGrid; const MaxRows: Integer = 25): Integer;

var
  DataSet: TDataSet;
  Bookmark: TBookmark;
  Count, I: Integer;
  ColumnsWidth: array of Integer;
begin
  SetLength(ColumnsWidth, DBGrid.Columns.Count);
  for I := 0 to DBGrid.Columns.Count - 1 do
    if DBGrid.Columns[I].Visible then
      ColumnsWidth[I] := DBGrid.Canvas.TextWidth(DBGrid.Columns[I].Title.Caption + '   ')
    else
      ColumnsWidth[I] := 0;
  if DBGrid.DataSource <> nil then
    DataSet := DBGrid.DataSource.DataSet
  else
    DataSet := nil;
  if (DataSet <> nil) and DataSet.Active then
  begin
    Bookmark := DataSet.GetBookmark;
    DataSet.DisableControls;
    try
      Count := 0;
      DataSet.First;
      while not DataSet.Eof and (Count < MaxRows) do
      begin
        for I := 0 to DBGrid.Columns.Count - 1 do
          if DBGrid.Columns[I].Visible then
            ColumnsWidth[I] := Max(ColumnsWidth[I], DBGrid.Canvas.TextWidth(
              DBGrid.Columns[I].Field.Text));
        Inc(Count);
        DataSet.Next;
      end;
    finally
      DataSet.GotoBookmark(Bookmark);
      DataSet.FreeBookmark(Bookmark);
      DataSet.EnableControls;
    end;
  end;
  Count := 0;
  for I := 0 to DBGrid.Columns.Count - 1 do
    if DBGrid.Columns[I].Visible then
    begin
      DBGrid.Columns[I].Width := ColumnsWidth[I];
      Inc(Count, ColumnsWidth[I]);
    end;
  Result := Count - DBGrid.ClientWidth;
end;
Run Code Online (Sandbox Code Playgroud)

我在DataSet.AfterOpen事件中调用它:

TGridHelper.AutoSizeColumns(MyDBGrid);
Run Code Online (Sandbox Code Playgroud)

  • 否定是不公平的,因为OP没有首先解释他真正想要的东西,现在我编辑了我的帖子,以满足来自同一单位的另一个代码的需求. (2认同)