線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2453
推到 Plurk!
推到 Facebook!

DBGrid 無法觸發 OnDrawDataCell 事件???

尚未結案
epl
一般會員


發表:5
回覆:9
積分:2
註冊:2003-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-21 16:59:11 IP:163.28.xxx.xxx 未訂閱
請教一下各位前輩: 我用ado元件連接mysql資料庫 不知為什麼無法觸發 OnDrawDataCell 事件 結果在 dbgrid 上的資料完全無法設定字體顏色、背景顏色等等 可是如果我用一個簡單的測試程式, 又可以觸發 OnDrawDataCell 事件 我實在是不知道問題出在哪裡, 有什麼屬性要設定的嗎?? 請教一下各位的看法 謝謝!!
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-21 17:32:53 IP:211.74.xxx.xxx 未訂閱
1.AdoQuery是否確定有資料?? 2.dbgrid 的DataSource是否有設定?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-21 18:16:00 IP:218.16.xxx.xxx 未訂閱
你是否在某處設定了 DBGrid1.Columns.State := csCustomized; 呢? 若是的話,DrawDataCell 及 OnDrawDataCell 就不會被觸發的了。 試試將 onDrawDataCell 的 code 寫在 OnDrawColumnCell 罷。 DBGrid1.Fields[DataCol] 就等於 OnDrawDataCell 的 Field 參數。
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-24 20:34:50 IP:218.32.xxx.xxx 未訂閱
DBGrid.DefaultDrawing property 設成 False. /* Free 和 Create 一樣重要 */
epl
一般會員


發表:5
回覆:9
積分:2
註冊:2003-02-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-25 10:06:21 IP:163.28.xxx.xxx 未訂閱
我的 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-25 10:19:05 IP:211.74.xxx.xxx 未訂閱
epl...你要不要把程式上傳到求助區ㄋ??這樣可能比較好看錯在哪..
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-25 10:34:48 IP:218.16.xxx.xxx 未訂閱
我上面說過,若是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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-25 11:03:31 IP:61.219.xxx.xxx 未訂閱
引言: 另外,如果我把 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-25 11:06:49 IP:163.28.xxx.xxx 未訂閱
Hello 不好意思, 再問一個很笨的問題 我現在已經可以在點到某一欄的時候,把那一欄的顏色改變 但是我不知道怎麼把整列的顏色一起跟著變 底下是我寫在 OnDrawColumnCell 中的程式碼  
If gdFocused in State then
begin
   DBGrid1.Canvas.Font.Color := clRed;
   DBGrid1.DefaultDrawColumnCell(Rect,DataCol,column,state);
end;
 
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-25 11:25:42 IP:218.16.xxx.xxx 未訂閱
將 dbgrid 的 options.rowselect 設成 true 及 將你的程式碼 gdfocused 改成 gdselected 的話,可達到整行變色的效果,但由於是 row select 所以不能直接修改資料。
epl
一般會員


發表:5
回覆:9
積分:2
註冊:2003-02-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-25 11:45:42 IP:163.28.xxx.xxx 未訂閱
可以用程式去控制我想要著色的整列資料或是特定的區域範圍嗎? 不能修改不太符合我目前的需求 謝謝!!
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-03-25 12:46:51 IP:61.219.xxx.xxx 未訂閱
引言: 可以用程式去控制我想要著色的整列資料或是特定的區域範圍嗎? 不能修改不太符合我目前的需求 謝謝!!
這樣做,是不是你要的 ?
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-03-25 13:05:15 IP:218.16.xxx.xxx 未訂閱
利害啊,小弟雖然解答了 DBGrid 無法觸發 OnDrawDataCell 事件 的原因與解決方法,一到較深奧的問題還是是靠版主大大來解決,佩報。
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-03-25 13:09:18 IP:61.219.xxx.xxx 未訂閱
引言: 利害啊,小弟雖然解答了 DBGrid 無法觸發 OnDrawDataCell 事件 的原因與解決方法,一到較深奧的問題還是是靠版主大大來解決,佩報。
瞎貓碰上死耗子的. /*
epl
一般會員


發表:5
回覆:9
積分:2
註冊:2003-02-19

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-03-25 14:01:47 IP:163.28.xxx.xxx 未訂閱
謝謝 Mickey兄、Justmade兄 及各位前輩的熱心指導, 終於可以動作了,可以幫我解釋一下為什麼嗎?我看不太懂啊! 另外,如果我要讓另一個有關聯性的 DBGrid 跟著一起動作的話(就是把兩個 DBGrid 裡,相對映的資料整列顯示不同的顏色),要怎麼寫呢?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-03-25 14:15:55 IP:218.16.xxx.xxx 未訂閱
簡單來說,就是查看正在 Draw 的 Cell 內顯示的資料是否現在 DataSet (Table/Query) 內選定的記錄,若是的話將文字顏色變紅。 因於需要用都的參數都是保護著而不能直接使用的,所以就要先宣告一個承繼的子代 Class 來以該子代的身份去存取這些變數來計算。 至於你另外一個DBGrid,只要同樣使用這個 DBGrid1DrawColumnCell, 並在 DBGrid1 的 DataSet AfterScroll 事件 Locate DBGrid2 的 DataSet 就可以了。
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-03-25 14:24:13 IP:61.219.xxx.xxx 未訂閱
引言: 謝謝 Mickey兄、Justmade兄 及各位前輩的熱心指導, 終於可以動作了,可以幫我解釋一下為什麼嗎?我看不太懂啊!
ㄟ...簡單的說是利用繼承的特性, 將 protected 屬性抓出來. 不過運用時需要小心(只讀取就好), Delphi Source 放到 protected 都有它的道理的呦.
引言: 另外,如果我要讓另一個有關聯性的 DBGrid 跟著一起動作的話(就是把兩個 DBGrid 裡,相對映的資料整列顯示不同的顏色),要怎麼寫呢?
Detail DataSet 應該可以依據關連 Key 值, 決定該 record 要不要變顏色. /* Free 和 Create 一樣重要 */
epl
一般會員


發表:5
回覆:9
積分:2
註冊:2003-02-19

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-03-25 15:27:36 IP:163.28.xxx.xxx 未訂閱
非常感謝大家的熱心回答 尤其是 Mickey兄 和 Justmade兄 又讓我學了不少東西呢!  再次謝謝大家!!
系統時間:2024-06-24 19:58:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!