DBGrid 的格內特效 |
尚未結案
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
前一陣子都在玩 StringGrid 的 Cell 特效
如 cell 變顏色,字串置左,置中,置右
後來想把它搬到 DBGrid 上,發現有很多問題
找過網站上的資料(http://delphisearch.ktop.com.tw/search.asp?MethodStr=DOIT&SearchStr=DefaultDrawDataCell&MyGood=N&memberid=1972),
發現大家都只提供線上 Help 的參考,自己根本沒試過,
或是說在舊版 Delphi 都 OK,因為我用 Delphi 7.0 所以不行 ??
我親自試的結果認為有幾個問題提出來供大家參考
1.OnDrawColumnCell 跟 OnDrawDataCell event 到底有何差別
我是不知道(Help 根本沒講到重點),有人說 Borland 建議大家
用 OnDrawColumnCell , 不過我試的結果
固定列(屬性為 gdFixed) 是不會觸發 DrawColumnCell 事件的
所以要將 固定列 中的文字置中對齊,是無法用 DrawColumnCell 事件處理的
2.DBGrid 的 DefaultDrawing 屬性有設跟沒設好像沒啥差別,都一樣永遠會觸發
OnDrawColumnCell , 而都一樣永遠不觸發OnDrawDataCell
3.OnDrawColumnCell 中除了無法處理固定列(屬性為 gdFixed)的特效,其他如隔行變色,置串置中,我都有參照資料試出來,但 OnDrawDataCell 的範例程式,我沒有試出任何半個
4.以目前我的認知裡,Delphi 7.0 的 DBGrid 之 有 OnDrawDataCell 事件有BUG ?? 以下為我要將 固定列的資料以及 在 Col 0,2 的資料行字串置中顯示的範例
供各位參考,程式是寫在 OnDrawColumnCell 的,使用 Delphi 7.0 ; 希望有長官可幫我搬到 OnDrawDataCell 事件中,或是可以處理 gdFixed 的行列也可
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin {由於 狀態為 gdFixed 的行列不會觸發 DrawColumnCell , 固底下六行白寫 //判斷是否是 Fixed 行列 if (gdFixed in State) then begin _DBGridDrawText(TDBGrid(Sender), Rect, Column, DT_CENTER ); //DT_LEFT , DT_CENTER , DT_RIGHT exit; end; } if DataCol in [0,2] then _DBGridDrawText(TDBGrid(Sender), Rect, Column, DT_CENTER ); //DT_LEFT , DT_CENTER , DT_RIGHT end; procedure TForm1._DBGridDrawText(ADBGrid:TDBGrid ; ARect: TRect; AColumn: TColumn; AuFormat:Word); var FixRect: TRect; begin //填滿每一 Cell 背景 (清掉舊 Cell Text) ADBGrid.Canvas.FillRect(ARect); //繪製新的 Cell Text FixRect:=ARect; //修正 Rect 座標 FixRect.Left:=ARect.Left 2; FixRect.Top :=ARect.Top 2; DrawText(ADBGrid.Canvas.Handle, PChar(AColumn.Field.AsString),Length(AColumn.Field.AsString), FixRect,AuFormat); end; |
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
引言: 前一陣子都在玩 StringGrid 的 Cell 特效 如 cell 變顏色,字串置左,置中,置右 後來想把它搬到 DBGrid 上,發現有很多問題 找過網站上的資料(http://delphisearch.ktop.com.tw/search.asp?MethodStr=DOIT&SearchStr=DefaultDrawDataCell&MyGood=N&memberid=1972), 發現大家都只提供線上 Help 的參考,自己根本沒試過, 或是說在舊版 Delphi 都 OK,因為我用 Delphi 7.0 所以不行 ?? 我親自試的結果認為有幾個問題提出來供大家參考 1.OnDrawColumnCell 跟 OnDrawDataCell event 到底有何差別 我是不知道(Help 根本沒講到重點),有人說 Borland 建議大家 用 OnDrawColumnCell , 不過我試的結果 固定列(屬性為 gdFixed) 是不會觸發 DrawColumnCell 事件的 所以要將 固定列 中的文字置中對齊,是無法用 DrawColumnCell 事件處理的 2.DBGrid 的 DefaultDrawing 屬性有設跟沒設好像沒啥差別,都一樣永遠會觸發 OnDrawColumnCell , 而都一樣永遠不觸發OnDrawDataCell 3.OnDrawColumnCell 中除了無法處理固定列(屬性為 gdFixed)的特效,其他如隔行變色,置串置中,我都有參照資料試出來,但 OnDrawDataCell 的範例程式,我沒有試出任何半個 4.以目前我的認知裡,Delphi 7.0 的 DBGrid 之 有 OnDrawDataCell 事件有BUG ??請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20448 中的 [重要事件] 說明
------
將問題盡快結案也是一種禮貌! |
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
bruce0211 你好: Fixed Row/Col 也不會觸發 DrawDataCell Event, 我是 Set TColumn.Title.Alignment 來達到 "居中對齊"
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); var i :integer; Column : TColumn; begin Column := nil; for i := 0 to TDBGrid(Sender).Columns.Count-1 do if TDBGrid(Sender).Columns[i].Field = Field then begin Column := TDBGrid(Sender).Columns[i]; break; end; if Column<>nil then begin Column.Title.Alignment := taCenter; if i in [0,2] then _DBGridDrawText(TDBGrid(Sender), Rect, Column, DT_CENTER) else TDBGrid(Sender).DefaultDrawDataCell(Rect,Field,State); end else TDBGrid(Sender).DefaultDrawDataCell(Rect,Field,State); end;PS. Column.Title.Alignment Property 應該移到較恰當的 Event, 設定一次就好. 發表人 - Mickey 於 2003/12/08 21:58:33 |
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
根據長官的資料我整理了一下設定 DBGrid 格內文字位置的兩種方法
1.使用 OnDrawColumnCell 或 OnDrawDataCell 事件皆可,
但只要用其中一種即可
2.DBGrid 的 DefaultDrawing 屬性設不設無所謂
3.下面的範例是以將固定列及 Column 0 , 2 內的文字都置中為例
//--------------------------------------------------------------------------- procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin //設定固定列(屬性為 gdFixed)中內文永遠置中 Column.Title.Alignment := taCenter; //決定某些 Column 之 Text 位置 if DataCol in [0,2] then Column.Alignment:=taCenter; TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State); end; //--------------------------------------------------------------------------- procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin //設定固定列(屬性為 gdFixed)中內文永遠置中 TDBGrid(Sender).Columns[Field.Index].Title.Alignment := taCenter; //決定某些 Column 之 Text 位置 if Field.Index in [0,2] then Field.Alignment:=taCenter; TDBGrid(Sender).DefaultDrawDataCell(Rect,Field,State); end; //--------------------------------------------------------------------------- |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |