DBGrid 無法觸發 OnDrawDataCell 事件??? |
尚未結案
|
epl
一般會員 發表:5 回覆:9 積分:2 註冊:2003-02-19 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
epl
一般會員 發表:5 回覆:9 積分:2 註冊:2003-02-19 發送簡訊給我 |
我的 DataSource 有設定,ADOTable 也確定有資料存在,
只是剛開始的時候,要等使用者選定一個條件後,
才會從資料庫過濾出我想要的資料,
我有用另外弄一個小程式測試過,這樣不會有影響!! 另外,如果我把 DBGrid.DefaultDrawing property 設成 False 的話,
會變成實際上有資料,可是卻看不到(變成透明???)。 我測過 DBGrid1.Columns.State 屬性,
的確是 csCustomized 沒錯,
可是當我在 DrawDataCell 中設成 DBGrid.Columns.State := csDefault
似乎也沒有辦法去改變這個屬性,要怎樣才能去改呢? 其實我的程式有二個有關聯性的 DBGrid
(DBGrid1 的第一筆會對映到 DBGrid2 的第一筆 ),
我想要做的就是,
當我在第一個 DBGrid 中選了一筆資料時,
就把兩個 DBGrid 裡,相對映的資料整列顯示不同的顏色,
現在卻卡在連填入顏色都有問題,
可以請各位給我個提示要如何做嗎?
謝謝!!
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
我上面說過,若是DBGrid1.Columns.State := csCustomized的話,DrawDataCell 及 OnDrawDataCell 就不會被觸發的了。 即然 DrawDataCell 及 不會被觸發,又甚麼可能在這個程序裡改 DBGrid1.Columns.State 呢? 要改的話就放在別的必行的程序罷。 不過,dbgrid 的預設 DBGrid1.Columns.State 是 csDefault ,應是有些程式碼設了它做 csCustomized, 即使你在一些 code 裡設了做 csdefault, 另一些 程式碼又將它設回 cscustomized 也沒用。 Borland 其實己說了儘量不要用 OnDrawDataCell ,試試小弟的建議,轉用OnDrawColumnCell 罷。 DBGrid1.Fields[DataCol] 就等於 OnDrawDataCell 的 Field 參數,其他碼應不用改。
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 另外,如果我把 DBGrid.DefaultDrawing property 設成 False 的話, 會變成實際上有資料,可是卻看不到(變成透明???)。Call "DefaultDrawDataCell" Method. Example Code as following :(Copy from Delphi Help) procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin if Table1.FieldByName('Size').AsFloat > 10 then DBGrid1.Canvas.Font.Color := clRed; DBGrid1.DefaultDrawDataCell(Rect, Field, State); end;/* Free 和 Create 一樣重要 */ |
epl
一般會員 發表:5 回覆:9 積分:2 註冊:2003-02-19 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
epl
一般會員 發表:5 回覆:9 積分:2 註冊:2003-02-19 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 可以用程式去控制我想要著色的整列資料或是特定的區域範圍嗎? 不能修改不太符合我目前的需求 謝謝!!這樣做,是不是你要的 ? type tmpGrid=class(TCustomGrid); type tmpDataSet=class(TDataSet); procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin with tmpGrid(Sender) do begin if (tmpGrid(Sender).Row-tmpGrid(Sender).FixedRows) = tmpDataSet(TDBGrid(Sender).DataSource.DataSet).ActiveRecord then TDBGrid(Sender).Canvas.Font.Color := clRed else TDBGrid(Sender).Canvas.Font.Color := clWindowText; end; TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,column,state); end;/* Free 和 Create 一樣重要 */ |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
epl
一般會員 發表:5 回覆:9 積分:2 註冊:2003-02-19 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
簡單來說,就是查看正在 Draw 的 Cell 內顯示的資料是否現在 DataSet (Table/Query) 內選定的記錄,若是的話將文字顏色變紅。 因於需要用都的參數都是保護著而不能直接使用的,所以就要先宣告一個承繼的子代 Class 來以該子代的身份去存取這些變數來計算。 至於你另外一個DBGrid,只要同樣使用這個 DBGrid1DrawColumnCell, 並在 DBGrid1 的 DataSet AfterScroll 事件 Locate DBGrid2 的 DataSet 就可以了。
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
引言: 謝謝 Mickey兄、Justmade兄 及各位前輩的熱心指導, 終於可以動作了,可以幫我解釋一下為什麼嗎?我看不太懂啊!ㄟ...簡單的說是利用繼承的特性, 將 protected 屬性抓出來. 不過運用時需要小心(只讀取就好), Delphi Source 放到 protected 都有它的道理的呦. 引言: 另外,如果我要讓另一個有關聯性的 DBGrid 跟著一起動作的話(就是把兩個 DBGrid 裡,相對映的資料整列顯示不同的顏色),要怎麼寫呢?Detail DataSet 應該可以依據關連 Key 值, 決定該 record 要不要變顏色. /* Free 和 Create 一樣重要 */ |
epl
一般會員 發表:5 回覆:9 積分:2 註冊:2003-02-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |