国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于DBGrid的分類顏色顯示

2019-11-18 18:06:33
字體:
來源:轉載
供稿:網友
 這兩天在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;

end.


上一篇:模擬Nokia手機輸入的編輯框

下一篇:使TStringGrid自適應寬度

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 北京市| 达拉特旗| 苍溪县| 荥阳市| 洱源县| 贵港市| 寿阳县| 海盐县| 武冈市| 远安县| 隆化县| 南昌县| 威海市| 玉林市| 包头市| 双柏县| 宁远县| 南靖县| 板桥市| 宜昌市| 大同县| 南宁市| 平山县| 金溪县| 尼勒克县| 大同市| 淮南市| 嫩江县| 上犹县| 六枝特区| 大化| 宁陕县| 渭南市| 汨罗市| 淮阳县| 西城区| 陇西县| 定兴县| 邵武市| 阿勒泰市| 永仁县|