DBGrid的分類顏色顯示

2021-04-20 04:33:55 字數 3054 閱讀 9088

這兩天在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;

inte***ce

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

public

end;

varform1: tform1;

clf:array of tcolor;

implementation

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);

vari,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.

DBGRID分組顯示

dbgrid分組顯示 delphi windows sdk api dxgrid cxgrid 和 fastreport 有什麼衝突嗎?qzmp sc 你是白雲 我是烏鴉 用兩個dbgrid如何實現,能詳細說明嗎 cngram 阿琦 我重灌delphi三次了,每次裝任意乙個控制項都是好的,可是再裝完...

dbgrid用兩種顏色間隔分行顯示

delphi 如下 procedure tform1.dbgrid1drawcolumncell sender tobject const rect trect datacol integer column tcolumn state tgriddrawstate begin with sender...

隔行改變DBGrid網格顏色

delphi5 隔行改變dbgrid網格顏色 在 form1 上放置 dbgrid1 query1 datasource1 三個資料庫元件,設定相關的屬性,使 dbgrid1 能顯示表中的資料。然後,在 dbgrid1 的 ondrawcolumncell 事件中鍵入以下 然後執行程式 proced...