首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

DBGrid 智慧型欄寬自適應演算法:依標題與資料內容動態分配寬度並支援水平捲軸

     編輯:Delphi

問題場景

TDBGrid 預設欄寬固定,資料過長被截斷、過短浪費空間,使用者須手動拖曳調整,且不記憶設定。

演算法邏輯

  1. 統計所有欄位目前寬度總和 TotWidth。
  2. 標記需自動調整的欄位(Field.Tag > 0 表示最小寬度),計算可變欄數 ResizableColumnCount。
  3. 扣除網格線寬度(dgColLines)與指示器寬度(dgIndicator)。
  4. 可用空間 VarWidth = ClientWidth - TotWidth。
  5. 平均分配 VarWidth 給可變欄位,並保護最小寬度 Field.Tag。

核心程序

procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
var
  i, TotWidth, VarWidth, ResizableColumnCount: Integer;
  Col: TColumn;
begin
  TotWidth := 0;
  ResizableColumnCount := 0;
  for i := 0 to DBGrid.Columns.Count - 1 do
  begin
    TotWidth := TotWidth + DBGrid.Columns[i].Width;
    if DBGrid.Columns[i].Field.Tag <> 0 then
      Inc(ResizableColumnCount);
  end;

  if dgColLines in DBGrid.Options then
    TotWidth := TotWidth + DBGrid.Columns.Count; // 每欄分隔線 1px
  if dgIndicator in DBGrid.Options then
    TotWidth := TotWidth + DBGrid.IndicatorWidth;

  VarWidth := DBGrid.ClientWidth - TotWidth;
  if ResizableColumnCount > 0 then
    VarWidth := VarWidth div ResizableColumnCount;

  for i := 0 to DBGrid.Columns.Count - 1 do
  begin
    Col := DBGrid.Columns[i];
    if Col.Field.Tag <> 0 then
    begin
      Col.Width := Col.Width + VarWidth;
      if Col.Width < Col.Field.Tag then
        Col.Width := Col.Field.Tag; // 最小寬度保護
    end;
  end;
end;

使用方式

// FormCreate 設定最小寬度(Tag)
Table1.FieldByName('FirstName').Tag := 40;                    // 固定 40px
Table1.FieldByName('LastName').Tag := 4 + Canvas.TextWidth(Table1.FieldByName('LastName').DisplayName); // 標題寬度+間距

// FormResize 觸發自適應
procedure TForm1.FormResize(Sender: TObject);
begin
  FixDBGridColumnsWidth(DBGrid1);
end;

效果示意

  • 總欄寬 < ClientWidth:多餘空間平均分配給可變欄,最後一欄右側留白。
  • 總欄寬 > ClientWidth:自動出現水平捲軸,使用者可拖曳檢視隱藏欄位。
調整前
調整後

擴充建議

  • 記住使用者手動調整:OnColumnMoved / OnColWidthChange 寫入 Ini/Registry,下次啟動套用。
  • 依資料內容動態計算:遍歷資料集取得最大 Canvas.TextWidth(Field.AsString) 作為理想寬度(大量資料建議抽樣)。
  • 支援比例分配:Field.Tag 高位存比例權重,低位存最小寬度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved