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

DBGrid 的格內特效

尚未結案
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-08 15:15:09 IP:211.21.xxx.xxx 未訂閱
前一陣子都在玩 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-08 15:28:21 IP:211.76.xxx.xxx 未訂閱
引言: 前一陣子都在玩 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-08 15:47:08 IP:211.21.xxx.xxx 未訂閱
引言: 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20448 中的 [重要事件] 說明
可是前面說過,我測試的結果 OnDrawColumnCell 無法處理固定列(屬性為 gdFixed)的特效 因為在 draw 固定列時不會觸發 OnDrawColumnCell
Mickey
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-08 21:25:11 IP:218.32.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-09 11:22:14 IP:211.21.xxx.xxx 未訂閱
根據長官的資料我整理了一下設定 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-09 12:33:28 IP:218.163.xxx.xxx 未訂閱
bruce0211 你好: TColumn Index 可能不完全等同於 TField Index. (當 DBGrid.Option include dgColumnResize 時 TColumn 可以拖動調整) 這可能須注意一下喔.
系統時間:2024-04-26 19:40:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!