全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2886
推到 Plurk!
推到 Facebook!

如何寫出DbGrid報表用顏色區分篩選的資料

答題得分者是:eaglewolf
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-30 13:24:51 IP:60.248.xxx.xxx 訂閱
請問我的報表列出是DbGrid
可以利用顏色篩選某各欄位的不同嗎?
假設我現在有一各欄位STATUS
0為正常 1為不正常
那可以當資料為1的時候
整筆序號顯示成為紅色嗎?
IF STATUS = '1' THEN BEGIN ..................
以下是我的SHOW的SQL
===================== SQL =============================
procedure TForm1.Button10Click(Sender: TObject); //全部列出
begin

Query1.SQL.Clear;
Query1.SQL.Add('SELECT (狀態) STATUS,(MODEL) 機種,(DESCS) 原因說明,(PROCESS) 工作站,(EMP) 領料人員 FROM TEST.DBF');
Query1.SQL.Add('ORDER BY SEQ DESC');
Query1.CLOSE;
Query1.OPEN;

end;

===================== END =============================
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
mypigbaby
高階會員


發表:11
回覆:168
積分:155
註冊:2006-07-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-31 08:47:54 IP:203.73.xxx.xxx 訂閱
豬寶寶之前做的範例給您參考

[code delphi]
procedure TForm1.DG1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected IN State then exit; //有選擇的話不要重畫

if query1.FieldByName('STATUS').value=1 then
(Sender as TDBGrid).Canvas.Brush.Color := clRed; //定義背景顏色(紅色 時間來不及了)
else
(Sender as TDBGrid).Canvas.Brush.Color := RGB(255, 255, 223); //定義背景顏色(米黃色)

end;
[/code]
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-31 10:36:04 IP:203.73.xxx.xxx 訂閱
//你若是想要STATUS='1', 整行 呈現 紅色, Ex:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
Canvas:TCanvas;
begin
Canvas := (Sender as TDBGrid).Canvas;
if Query1.FieldByName('STATUS').AsString = '1' then
begin
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;
end;
------
What do we live for if not to make life less difficult for each other?
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-31 17:14:10 IP:60.248.xxx.xxx 訂閱
怪了

我程式可以跑 可是沒有顯示出顏色

條件 對壓

當某欄位=1的時候......顯示紅色

可是沒有變紅@@
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-31 17:14:43 IP:60.248.xxx.xxx 訂閱
第一種


[code delphi]
procedure TForm1.DBGrid3DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if gdSelected IN State then exit; //有選擇的話不要重畫
if query1.FieldByName('工單').value=1 then begin
(Sender as TDBGrid).Canvas.Brush.Color := clRed; //定義背景顏色(紅色 時間來不及了)
end else
(Sender as TDBGrid).Canvas.Brush.Color := RGB(255, 255, 223); //定義背景顏色(米黃色)
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-31 17:15:40 IP:60.248.xxx.xxx 訂閱
第二種
[code delphi]
procedure TForm1.DBGrid3DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
Canvas:TCanvas;
begin
Canvas := (Sender as TDBGrid).Canvas;
if Query1.FieldByName('工單').AsString = '1' then
begin
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
DBGrid3.DefaultDrawDataCell(Rect, Field, State);
end;
end;

[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-31 19:37:11 IP:220.143.xxx.xxx 訂閱
Your Source Code?
------
What do we live for if not to make life less difficult for each other?
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-11-01 11:55:14 IP:60.248.xxx.xxx 訂閱
恩 恩 這裡

我希望打開資料庫就 就秀出紅色


[code delphi]
procedure TForm1.FormActivate(Sender: TObject);
begin
Query1.DatabaseName := GetCurrentDir;
Query2.DatabaseName := GetCurrentDir;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT (SEQ) 流水號,(WO) 工單,(MODEL) 機種,(PART) 料號,(PART_NO) 品名,(ESTIMATES) 領退數量,(PHYSICAL) 實際數量,(DESCS) 原因說明,(PROCESS) 工作站,(EMP) 領料人員,(UP_TIME) 領料日期 FROM TEST.DBF');
Query1.SQL.Add('ORDER BY SEQ DESC');
Query1.CLOSE;
Query1.OPEN;
DateTimePicker1.Date := NOW;
DateTimePicker2.Date := NOW-7;
DateTimePicker3.Date := NOW;
DateTimePicker4.Date := NOW;
end;
procedure TForm1.DBGrid3DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
Canvas:TCanvas;
begin
Canvas := (Sender as TDBGrid).Canvas;
if Query1.FieldByName('領退數量').AsString = '0' then
begin
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
DBGrid3.DefaultDrawDataCell(Rect, Field, State);
end;
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2007-11-01 11:58:24, 註解 無‧
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-11-01 12:10:16 IP:203.73.xxx.xxx 訂閱
試試
if(Query1.FieldByName('領退數量').AsString = '0')or (trim(Query1.FieldByName('領退數量').AsString)='')then
..

------
What do we live for if not to make life less difficult for each other?
mypigbaby
高階會員


發表:11
回覆:168
積分:155
註冊:2006-07-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-11-01 12:25:32 IP:203.73.xxx.xxx 訂閱
或者是
if( StrToIntDef(Query1.FieldByName('領退數量').asstring,0) = 0)then


===================引 用 christie 文 章===================
試試
if(Query1.FieldByName('領退數量').AsString = '0')or (trim(Query1.FieldByName('領退數量').AsString)='')then
..

lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-11-01 13:37:10 IP:211.22.xxx.xxx 訂閱
囧...三各都可以跑 但沒一各顯示紅色

怎回事@_@a


[code delphi]
procedure TForm1.DBGrid3DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
Canvas:TCanvas;
begin
Canvas := (Sender as TDBGrid).Canvas;
if (StrToIntDef(Query1.FieldByName('領退數量').AsString,0) = 0) then
//(Query1.FieldByName('領退數量').AsString = '0')
//(trim(Query1.FieldByName('領退數量').AsString)='')
//(StrToIntDef(Query1.FieldByName('領退數量').AsString,0) = 0)
begin
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
DBGrid3.DefaultDrawDataCell(Rect, Field, State);
end;
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-11-01 13:51:02 IP:210.66.xxx.xxx 訂閱
領退數量是數值欄位吧?
如果數值等於0,
那麼 FieldByName('領退數量').AsString的結果
是'0' 還是 #$0 ????

Trace一下就知道了.........^_^

===================引 用 lovemari 文 章===================
if (StrToIntDef(Query1.FieldByName('領退數量').AsString,0) = 0) then

lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-11-01 16:34:50 IP:210.64.xxx.xxx 訂閱
恩恩 我欄位是數值沒錯

值也是0

#$0 ??? < -不懂

我確認資料無誤= =

DATABASE 是ACCESS 的...DELPHI 7 去寫的

新增刪除修改資料庫都OK 那應該沒問題

怎會顏色都無法@@顯示
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-11-01 17:02:43 IP:203.73.xxx.xxx 訂閱
是否ZIP你的ACCESS / dpr / res / dfm / pas ?
===================引 用 lovemari 文 章===================
恩恩 我欄位是數值沒錯

值也是0

#$0 ??? < -不懂

我確認資料無誤= =

DATABASE 是ACCESS 的...DELPHI 7 去寫的

新增刪除修改資料庫都OK 那應該沒問題

怎會顏色都無法@@顯示
------
What do we live for if not to make life less difficult for each other?
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-11-02 13:15:29 IP:60.248.xxx.xxx 訂閱
TO樓上大大

沒有耶....副檔名.DBF

有無可能是我設定上的問題

DBGrid的設定上的問題 ? 譬如說...顯示顏色設定false

還是要加什麼元件上去才會有顏色?_?

ps.新手請多多包含@@


元件有
SaveDialog
Query 1 and 2
GridExport
PopupMenu
DataSource1
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2007-11-02 13:18:05, 註解 無‧
lovemari 重新編輯於 2007-11-02 13:34:33, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-11-02 16:46:41 IP:211.75.xxx.xxx 訂閱
Delphi 的說明文件:
Do not write an OnDrawDataCell event handler. OnDrawDataCell is obsolete and included for backward compatibility. Instead, write an OnDrawColumnCell event handler.
請改用OnDrawColumnCell

[code delphi]
procedure TForm1.DBGrid3DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (Query1.FieldByName('領退數量').AsInteger = 0) then
TDBGrid(Sender).Canvas.Brush.Color := clRed
else
TDBGrid(Sender).Canvas.Brush.Color := clWhite; //正常白色
TDBGrid(Sender).Canvas.FillRect(Rect);
TDBGrid(Sender).DefaultDrawDatacell(Rect, Column.Field, State);
TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column , State);
end;
[/code]


===================引 用 lovemari 文 章===================
恩 恩 這裡

我希望打開資料庫就 就秀出紅色


[code delphi]
procedure TForm1.FormActivate(Sender: TObject);
begin
Query1.DatabaseName := GetCurrentDir;
Query2.DatabaseName := GetCurrentDir;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT (SEQ) 流水號,(WO) 工單,(MODEL) 機種,(PART) 料號,(PART_NO) 品名,(ESTIMATES) 領退數量,(PHYSICAL) 實際數量,(DESCS) 原因說明,(PROCESS) 工作站,(EMP) 領料人員,(UP_TIME) 領料日期 FROM TEST.DBF');
Query1.SQL.Add('ORDER BY SEQ DESC');
Query1.CLOSE;
Query1.OPEN;
DateTimePicker1.Date := NOW;
DateTimePicker2.Date := NOW-7;
DateTimePicker3.Date := NOW;
DateTimePicker4.Date := NOW;
end;
procedure TForm1.DBGrid3DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
Canvas:TCanvas;
begin
Canvas := (Sender as TDBGrid).Canvas;
if Query1.FieldByName('領退數量').AsString = '0' then
begin
Canvas.Brush.Color := clRed;
Canvas.FillRect(Rect);
DBGrid3.DefaultDrawDataCell(Rect, Field, State);
end;
end;
[/code]
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-11-02 16:51:45, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-11-05 08:30:59 IP:60.248.xxx.xxx 訂閱
謝謝eaglewolf大大

可以正常顯示了


還有謝謝前面的前輩

雖然無法跑 可我也學到一些其他絕技



關於DataCell

那是處理什麼用的??
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
系統時間:2024-05-17 14:21:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!