Delphi 如何获取TDBGrid列上最长条目的长度

Delphi 如何获取TDBGrid列上最长条目的长度,delphi,datagrid,datagridview,tdbgrid,Delphi,Datagrid,Datagridview,Tdbgrid,我有一个名为grMain的TDBGrid组件。我需要知道grMain上检索的列的最长条目的值的长度,以调整保存grMain的表单的最小宽度 如何获取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.Da

我有一个名为grMain的TDBGrid组件。我需要知道grMain上检索的列的最长条目的值的长度,以调整保存grMain的表单的最小宽度

如何获取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);
        ZeroMemory(@a[0],SizeOf(Integer)*Length(a));
        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 + C_Add;
                    end;

                end;
            ds.Next;
          end;
        for I := 0 to Grid.Columns.Count - 1 do Grid.Columns[i].Width := a[i];
        ds.GotoBookmark(bm);
        finally
          ds.FreeBookmark(bm);
          ds.EnableControls;
        end;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
  FitGrid(DBgrid1)
end;

像这样的事

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);
        ZeroMemory(@a[0],SizeOf(Integer)*Length(a));
        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 + C_Add;
                    end;

                end;
            ds.Next;
          end;
        for I := 0 to Grid.Columns.Count - 1 do Grid.Columns[i].Width := a[i];
        ds.GotoBookmark(bm);
        finally
          ds.FreeBookmark(bm);
          ds.EnableControls;
        end;
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
  FitGrid(DBgrid1)
end;