首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Delphi DBGrid 列寬自適應最佳實踐:標題與數據雙重計算

     編輯:關於SqlServer

DBGrid 默認列寬固定,導致標題截斷或數據顯示不全。本文提供通用過程 MakeDBGridColumnsAutoFixItsWidth,遍歷所有行計算每列最大字符寬度(含標題),乘以字符像素寬度(經驗值 8)賦予列寬。

核心算法

  1. 獲取列數 cc,創建動態數組 aDgCLength 存儲各列最大字符數
  2. 首輪循環:讀取各列 Title.Caption 長度作為初始值
  3. 第二輪:DataSet.First 到 EOF 遍歷每行,Fields[i].AsString 去空格後取長度,更新最大值
  4. 第三輪:Columns[i].Width := aDgCLength[i] * 8 設置像素寬度

完整代碼

procedure MakeDBGridColumnsAutoFixItsWidth(objDBGrid: TDBGrid);
var
  cc, i, tmpLength: Integer;
  objDataSet: TDataSet;
  aDgCLength: array of Integer;
begin
  cc := objDBGrid.Columns.Count - 1;
  objDataSet := objDBGrid.DataSource.DataSet;
  SetLength(aDgCLength, cc + 1);

  { 標題寬度 }
  for i := 0 to cc do
    aDgCLength[i] := Length(objDBGrid.Columns[i].Title.Caption);

  { 數據寬度 }
  objDataSet.DisableControls; // 防止界面閃爍
  try
    objDataSet.First;
    while not objDataSet.Eof do
    begin
      for i := 0 to cc do
      begin
        tmpLength := Length(Trim(objDataSet.Fields.Fields[i].AsString));
        if tmpLength > aDgCLength[i] then
          aDgCLength[i] := tmpLength;
      end;
      objDataSet.Next;
    end;
  finally
    objDataSet.EnableControls;
  end;

  { 應用列寬 }
  for i := 0 to cc do
    objDBGrid.Columns[i].Width := aDgCLength[i] * 8;
end;

優化建議

  • 大數據集時可改為抽樣計算(如每 100 行取 1 行)或異步執行避免界面卡頓
  • 字符寬度系數 8 針對定寬字體,比例字體建議用 Canvas.TextWidth 精確測量
  • 可封裝為 TDBGrid 幫助類方法,調用更優雅
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved