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

請問有關於DBGrid的問題

 
Dreamlied
一般會員


發表:21
回覆:13
積分:6
註冊:2002-07-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-02 17:12:16 IP:210.202.xxx.xxx 未訂閱
請教一下, 當我在DBGrid導入所有的資料時, 希望可以篩選適合的資料並改變其文字的顏色, 該如何下手.. 謝謝
klmer
一般會員


發表:11
回覆:46
積分:13
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-02 17:17:14 IP:210.243.xxx.xxx 未訂閱
可以利用 DataSet的 Filter,以及Filtered 屬性來控制.. 如果要修改顏色可以利用DBGRID的 OnCalcCellColors 事件來控制
delphiwww
資深會員


發表:145
回覆:363
積分:368
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-03 09:02:06 IP:202.145.xxx.xxx 未訂閱
站長在網頁上不是有其供顏色控制的範例
引言: 可以利用 DataSet的 Filter,以及Filtered 屬性來控制.. 如果要修改顏色可以利用DBGRID的 OnCalcCellColors 事件來控制
Dreamlied
一般會員


發表:21
回覆:13
積分:6
註冊:2002-07-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-07-05 16:29:40 IP:210.202.xxx.xxx 未訂閱
謝謝各位的熱心, 我可能敘述的有些不完整, 如果DBGrid內有100筆資料時,其中的40筆資料符合條件, 我希望可以不同的顏色來區分他,該如何作呢? 謝謝
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-05 16:36:45 IP:192.168.xxx.xxx 未訂閱
引言: 謝謝各位的熱心, 我可能敘述的有些不完整, 如果DBGrid內有100筆資料時,其中的40筆資料符合條件, 我希望可以不同的顏色來區分他,該如何作呢?
是要像這樣嗎? 若是請進入:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19121 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Dreamlied
一般會員


發表:21
回覆:13
積分:6
註冊:2002-07-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-07-05 16:53:59 IP:210.202.xxx.xxx 未訂閱
不是, 以您的圖為例, 我是要1-3列全部有顏色(假設前3筆為符合資料者) 另, 您可以教我如何在像您在留言版插入圖片嗎?^_^ 不好意思我還只是初學者
Dreamlied
一般會員


發表:21
回覆:13
積分:6
註冊:2002-07-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-07-05 17:00:18 IP:210.202.xxx.xxx 未訂閱
補充一下, 其實我早就study過您的範例, 我的篩選方式並非因為更改數據, 而是例如當有100筆訂單資料時, 其中有40筆資料已驗收, 此時其40筆便會特別以其他顏色標示. 如果有敘述不全的地方, 請見諒..
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-07-05 18:41:44 IP:192.168.xxx.xxx 未訂閱
那這樣咧
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
   with DBGrid1.canvas do
   begin
      // 先預設顏色
      if gdselected in state then // Select光棒停在此Cell
      begin
         font.color:=clHighLightText; // 正常的DBGrid顏色
         Brush.color:=clHighLight; // 正常的DBGrid顏色
      end
      else // Select光棒未停在此Cell
      begin
         font.color:=clBlack; // 正常的DBGrid顏色
         Brush.color:=clWhite; // 正常的DBGrid顏色
      end;
      // 設定指定Cell的顏色
          if gdselected in state then // Select光棒停在此Cell
          begin
             if (sender as tdbgrid).datasource.dataset.fieldbyname('size').asinteger>=10  then
              Font.Color:=clred or $888888 // 字變紅色加一點白色調(這樣反白效果才會好)
             else
              Font.Color:=clBlue or $888888 // 字變籃色加一點白色調(這樣反白效果才會好)
          end
          else // Select光棒未停在此Cell
          begin
             if (sender as tdbgrid).datasource.dataset.fieldbyname('size').asinteger>=10  then
              Font.Color:=clred // 字變紅色
             else
              Font.Color:=clBlue; // 字變藍色
          end;
      // 一定要執行繪圖的動作
      DbGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,[]);
   end;
end;    
~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-07-05 18:43:20 IP:192.168.xxx.xxx 未訂閱
引言: 另, 您可以教我如何在像您在留言版插入圖片嗎?^_^
請見:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=7332 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Dreamlied
一般會員


發表:21
回覆:13
積分:6
註冊:2002-07-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-07-09 11:23:23 IP:210.202.xxx.xxx 未訂閱
可以了, 非常謝謝您..^_^
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-09-18 12:56:12 IP:61.221.xxx.xxx 未訂閱
在DELPHI中利用API實現網格內元件的嵌入 陳學軍 2000-11-07 16:01:36 Delphi中向TDBGrid添加元件是一件十分麻煩的事情。筆者在這裏向大家介紹一種利用WIN32 API函數在TDBGRID中嵌入CHECKBOX元件的方法。 TDBGrid部件是用於顯示和編輯資料庫表中記錄資訊的重要部件,它是我們在程式設計過程中要經常使用的一個強有力的工具。TDBGrid具有很多重要的屬性,我們可以在程式設計階段和程式運行過程中進行設置。TDBGrid部件中有很多重要的屬性,我們在這裏重點介紹Option屬性和DefaultDrawing屬性,其他屬性及其設置方法請參看聯機幫助文件。 Options屬性:它是TDBGrid部件的一個擴展屬性,在程式設計階段設置Options屬性可以控制TDBGrid部件的顯示特性和對事件的回應特性。 DefalultDrawing屬性:該屬性是布林型屬性,它用於控制網格中各網格單元的繪製方式。在缺省情況下,該屬性的值?True,也就是說Delphi使用網格本身缺省的方法繪製網格中各網格單元,並填充各網格單元中的內容,各網格單元中的資料根據其對應的欄位部件的DisplayFormat屬性和EidtFormat屬性進行顯示和繪製。如果DefaulDrawing屬性被設置?False,Delphi不會自動地繪製網格中各網格單元和網格單元中的資料,用戶必須自己?TDBGrid部件的OnDrawDataCell事件編寫相應的程式以用於繪製各網格單元和其中的資料。 需要注意的是,當一個布林欄位得到焦點時,TDBGrid.Options中的 gdEditing屬性不能被設置成?可編輯模式。另外,TDBGrid.DefaultDrawing屬性不要設置?FALSE,否則,就不能得到網格中畫布屬性的控制碼。 程式設計開始時就應考慮:需要設定一變數來存儲原始的 TDBGrid.Options的所有屬性值。這樣,當一boolean欄位所在欄得到焦點時將要關閉TDBGrid.Options中gdEditing的可編輯模式。與此相對應,若該欄失去焦點時,就要重新恢復原始的 TDBGrid.Options的所有屬性值。 在實例中可以通過滑鼠點擊或敲打空白鍵改變布林值,這樣就需要觸發TDBGrid.OnCellClick事件和TDBGrid.OnKeyDown事件。因?這兩個事件都是改變單格中邏輯欄位的布林值,所以?了減少代碼的重復最好創建一個私有過程(SaveBoolean;)來完成邏輯值的輸入,以後,在不同的事件中調用此過程即可。 對 TDBGrid.OnDrawColumnCell事件的處理是整個程式的關鍵。處理嵌入元件的顯示的傳統方法是:在表單上實際添加元件物件,然後對元件的位置屬性與網格中單格的位置屬性進行調整,以達到嵌入的視覺效果。這種方法雖然可行但代碼量大,實際運行時控制性很差。筆者採用的方法是充分利用WIN32 API函數:DrawFrameControl(),由於此函數可以直接畫出Checkbox元件,所以就無須在表單中實際添加元件。如何使用API函數:DrawFrameControl()是本程式技巧所在。 在TDBGrid.OnDrawColumnCell事件中,我想大家會注意到:設定一個整型陣列常數,而這個返回的整數值是與布林值相一致的,如果欄位是邏輯欄位,則只將其布林值放入陣列中,提供給DrawFrameControl()函數中的狀態參數進行調用,從而實現了Checkbox元件在網格中的嵌入效果。 源代碼如下: type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBGrid1: TDBGrid; procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); procedure DBGrid1ColEnter(Sender: TObject); procedure DBGrid1ColExit(Sender: TObject); procedure DBGrid1CellClick(Column: TColumn); procedure DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } OriginalOptions : TDBGridOptions; procedure SaveBoolean; public { Public declarations } end; {...} procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const // 這個整數值將按照布林值返回,並送入陣列 CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); begin //確保只有在邏輯欄位才能插入元件 if Column.Field.DataType = ftBoolean then begin DBGrid1.Canvas.FillRect(Rect); DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); end; end; procedure TForm1.DBGrid1ColEnter(Sender: TObject); begin // 確保該欄是邏輯欄位 if DBGrid1.SelectedField.DataType = ftBoolean then begin OriginalOptions := DBGrid1.Options; DBGrid1.Options := DBGrid1.Options - [dgEditing]; end; end; procedure TForm1.DBGrid1ColExit(Sender: TObject); begin //確保該欄是邏輯欄位 if DBGrid1.SelectedField.DataType = ftBoolean then DBGrid1.Options := OriginalOptions; end; procedure TForm1.DBGrid1CellClick(Column: TColumn); begin //確保該欄是邏輯欄位 if DBGrid1.SelectedField.DataType = ftBoolean then SaveBoolean(); end; procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //確保該欄是邏輯欄位和空白鍵在鍵盤中被敲擊 if ( Key = VK_SPACE ) and ( DBGrid1.SelectedField.DataType = ftBoolean ) then SaveBoolean(); end; procedure TForm1.SaveBoolean; begin DBGrid1.SelectedField.Dataset.Edit; DBGrid1.SelectedField.AsBoolean := not DBGrid1.SelectedField.AsBoolean; DBGrid1.SelectedField.Dataset.Post; end; 以上根源程式在PWIN DELPHI5.0環境調試通過,可以直接引用。 ********************************************************************** 請問有人試過使用DBGrid來動態變更圖片方式嗎? **********************************************************************
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-26 14:36:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!