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

Delphi DBGrid 彩色繪製技巧:自定義儲存格顏色與條件格式

     編輯:Delphi

DBGrid 是 Delphi 資料庫應用中最核心的顯示控件。預設情況下它以單調的黑白文字呈現資料,但透過關閉 DefaultDrawing 屬性並利用 OnDrawDataCell 事件搭配 Canvas 畫布,我們可以實現豐富的條件格式:依薪資高低、庫存狀態、異常標記等動態變更前景與背景顏色,大幅提升資料可讀性與警示效果。

核心原理

  • DefaultDrawing = False:關閉系統自動繪製,將繪製權交給開發者。
  • Canvas 畫布:每個儲存格對應一個 TRect 區域,透過 Canvas.Brush、FillRect、TextOut 完成填色與文字輸出。
  • OnDrawDataCell 事件:每個可見儲存格繪製時觸發,參數包含 Rect(儲存格矩形)、Field(字段)、State(狀態:選中、焦點、編輯等)。

實作範例:依薪資門檻變色

1. 控件佈局與屬性

Table1.DatabaseName = DBDEMOS
Table1.TableName = EMPLOYEE.DB
Table1.Active = True
DataSource1.DataSet = Table1
DBGrid1.DataSource = DataSource1
DBGrid1.DefaultDrawing = False  // 關鍵!
SpinEdit1.Increment = 200
SpinEdit1.Value = 20000
ColorGrid1.GridOrdering = go16x1

2. OnDrawDataCell 繪製邏輯

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  // 判斷薪資是否達標
  if Table1.FieldByName('Salary').Value >= SpinEdit1.Value then
    DBGrid1.Canvas.Brush.Color := ColorGrid1.ForegroundColor
  else
    DBGrid1.Canvas.Brush.Color := ColorGrid1.BackgroundColor;

  DBGrid1.Canvas.FillRect(Rect);                              // 填滿背景
  DBGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Field.AsString); // 繪製文字
end;

3. 互動刷新機制

// SpinEdit 數值變更時重繪
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  DBGrid1.Refresh;
end;

// ColorGrid 顏色變更時重繪
procedure TForm1.ColorGrid1Change(Sender: TObject);
begin
  DBGrid1.Refresh;
end;

// 表單建立時初始化預設色
procedure TForm1.FormCreate(Sender: TObject);
begin
  ColorGrid1.ForegroundIndex := 9;  // 灰色字
  ColorGrid1.BackgroundIndex := 15; // 白底
end;

進階應用方向

  • 整列/整行變色:在事件中判斷 Field.FieldName 或 DataSet 狀態,對整個 Row 統一 FillRect。
  • 漸層與圖案:使用 Canvas.GradientFill 或 Brush.Style = bsDiagCross 等畫刷樣式。
  • 圖示嵌入:搭配 Draw 或 StretchDraw 在儲存格繪製圖示(如紅旗、綠燈)。
  • 效能優化:大量資料時建議使用 Virtual Mode 或僅在可視範圍內繪製。

同樣原理適用於擁有 Canvas 屬性的其他控件(ListView、TreeView、StringGrid 等),讓整個應用程式介面更生動專業。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved