程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 關於DBGrid的分類顏色顯示

關於DBGrid的分類顏色顯示

編輯:Delphi
這兩天在csdn裡轉轉,發現很多人問關於DBGRID或DBGRIDEH的分類顯示的問題,今天閒下來,就這個問題聊兩句。實際上對於DBGRID的自畫,Delphi 提供了兩個事件供我們使用,
  一個是畫行的:
  OnDrawDataCell(Sender: TObject; const Rect: TRect;  Field: TFIEld; State: TGridDrawState);
  另一個是畫列的:
  OnDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
  這就給我們很大的方便。對於DBGRID的分類顏色顯示,明顯應該用第一個事件。那麼怎麼才能分類按顏色顯示呢,實際上聽起來很難,但實際上很簡單。
          首先定義一個類型為TColor的變長數組,然後在數據集的AfterOpen事件中,將數組的長度定義為數據集的記錄個數。然後根據你的分類計算出數組的每一個元素的顏色值,數組的每一個元素應該和數據集的一條記錄相對應。最後,在你的OnDrawColumnCell事件中寫下如下代碼。
          DBGRID1.Canvas.Brush.Color := C[Low(c)+DBgrid1.DataSource.Dataset.RecNo()-1];
          上面是設置行的背景色,如果你要設置字體色只需要用
           DBGRID1.Canvas.Font.Color := C[Low(c)+DBgrid1.DataSource.Dataset.RecNo()-1];
          最後不要忘記了還要加上一句
          DBGrid1.DefaultDrawDataCell(Rect, FIEld, State);
  如此就可以隨心所欲的顯示你所喜歡的顏色。以上只是我的一點愚見,有心人會說了,你這樣做效率很低的
  你需要將數據庫全都遍歷一遍。是的,你要想顯示,肯定要遍歷數據庫,只不過對於大型數據庫來說,你可以不一定在數據庫的AfterOpen後做,你也可一一次只遍歷數據庫的一部分,比如說你在別的事件比如說ClIEntDataset的AfterGetRecords中作。另外最好的方法是在服務器端用一個存儲過程計算此數組的值,這樣是最有效率的方法。當然這些都是原理,這裡不做詳細討論。下面是一個簡單的DEMO將DBgrid的數據每10個
  一組顯示紅綠兩色,在Delphi7.0下邊以通過。
  unit Unit1;

  interface

  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

  type
    TForm1 = class(TForm)
      DataSource1: TDataSource;
      Query1: TQuery;
      DBGrid1: TDBGrid;
      procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
        Field: TFIEld; State: TGridDrawState);
      procedure Query1AfterOpen(DataSet: TDataSet);
      procedure FormCreate(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;

  var
    Form1: TForm1;
    clf:array of Tcolor;
  implementation
  {$R *.dfm}

  
  procedure TForm1.FormCreate(Sender: TObject);
  begin
    Query1.Active := False;
    Query1.DatabaseName := 'DBDEMOS';
    Query1.SQL.Add('select * from orders');
    DataSource1.DataSet := Query1;
    Dbgrid1.DataSource := DataSource1;
    Dbgrid1.Align := alClIEnt;
    Query1.Active := True;
  end;

  procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
  var
    i,aa:integer;
    c:Tcolor;
  begin
    query1.DisableControls;
    setlength(clf,query1.RecordCount);
    query1.First;
    i := Low(clf);
    clf[i] := clRed;
    c := clRed;
    aa:=1;
    while not query1.Eof do
    begin
      if (query1.RecNo - aa)>9 then
      begin
        aa := aa + 10;
        if c = clRed then c:= clGreen
        else c := clRed;
      end;
      clf[i] := c;
      Inc(i);
      query1.Next;
    end;
    query1.First;
    query1.EnableControls;
  end;

  procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
    Field: TFIEld; State: TGridDrawState);
  begin
      DBGrid1.Canvas.Brush.Color := clf[Dbgrid1.DataSource.DataSet.RecNo-1+Low(clf)];
      DBGrid1.DefaultDrawDataCell(Rect, FIEld, State);
  end;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved