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

如何修改Dbgrid元件的Title可被按下,其視覺效果就像Button被按下一般?

答題得分者是:wameng
ucdesign2
一般會員


發表:24
回覆:33
積分:11
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-10 16:57:00 IP:211.23.xxx.xxx 未訂閱
請教各位前輩:
如何修改Dbgrid元件的Title可被按下,使其視覺效果就像Button被按下一般?
我是要做出按title排序功能,排序功能的討論已有許多!但title被按下的視覺效果好像沒看到!?
如有請告知!我有去找TButton的原始碼,試著去找出處理Button被按下的視覺效果部份,
但找不到相關的程式段落,請前輩告知或是有任何類似程式碼可參考?!
先謝謝大家的幫忙

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-10 18:19:15 IP:61.31.xxx.xxx 訂閱
Dbgrid 點Title 要有沈下去的感覺難。
主要是 DBGrids 的 DrawTitleCell 部分,無法插入程式碼。不會觸發 onDrawColumnCell or onDrawDataCell 事件。
除非要 Override DrawCell

我的方法是重寫整個DBGrids Saveas 為自己的元件。並在關鍵地方插入程式碼。

可能還有一個作法直接繼承TDBGrid。我不確定。沒試過。
在 TitleClick 時,計算該方格區域,並 invalidateRect 及記憶區塊位置及大小。
Override Paint 事件 在 inherited 之後,畫上 該區塊下沈畫面。
用 DrawEdge API 畫出被按下的狀態。

參考

ucdesign2
一般會員


發表:24
回覆:33
積分:11
註冊:2002-10-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-13 08:40:24 IP:211.23.xxx.xxx 未訂閱

===================引 用 wameng 文 章===================
Dbgrid 點Title 要有沈下去的感覺難。
主要是 DBGrids 的 DrawTitleCell 部分,無法插入程式碼。不會觸發 onDrawColumnCell or onDrawDataCell 事件。
除非要 Override DrawCell

我的方法是重寫整個DBGrids Saveas 為自己的元件。並在關鍵地方插入程式碼。

可能還有一個作法直接繼承TDBGrid。我不確定。沒試過。
在 TitleClick 時,計算該方格區域,並 invalidateRect 及記憶區塊位置及大小。
Override Paint? 事件 在 inherited 之後,畫上 該區塊下沈畫面。
用 DrawEdge API 畫出被按下的狀態。

參考
===================================================

謝謝wameng版主回答!
版主的回答已經給了很多的解決方向!
但因為我的程度不夠!想了許久還是無法完成點擊Title 要有沈下去,鬆開mouse則回原來樣子的效果!
如果我直接繼承TDbgrid元件,重新寫一新原件該怎麼做?或那裡有更具體的參考資料?
請各位前輩不吝指教!謝謝
ucdesign2
一般會員


發表:24
回覆:33
積分:11
註冊:2002-10-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-15 14:42:43 IP:211.23.xxx.xxx 未訂閱
請各位前輩幫忙!謝謝
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-15 17:41:54 IP:61.222.xxx.xxx 訂閱
花了二十分鐘寫好了。自己動作做,其樂無窮。
<textarea cols="60" rows="10" class="delphi" name="code"> type TDBGrid = Class(DBGrids.TDBGrid) Private TitleDown :Integer; Protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override; procedure Paint;override; Public end; TForm1 = class(TForm) ..... .... procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); var GridCoord :TGridCoord; begin TitleDown := -1; inherited MouseDown(Button, Shift, X, Y); if Button = mbLeft then begin GridCoord := MouseCoord(X,Y); if (GridCoord.Y=0) and (GridCoord.X>0) then begin TitleDown := GridCoord.X; InvalidateCell(GridCoord.X,0); end; end; end; procedure TDBGrid.MouseUp(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); begin inherited MouseUp(Button, Shift, X, Y); if TitleDown > 0 then begin InvalidateCell(TitleDown,0); TitleDown := -1; end; end; procedure TDBGrid.Paint; var ARect :TRect; begin inherited; if TitleDown>0 then begin ARect := CellRect(TitleDown,0); DrawEdge(Canvas.Handle, ARect, BDR_SUNKENOUTER ,BF_RECT); end; end; </textarea>
ucdesign2
一般會員


發表:24
回覆:33
積分:11
註冊:2002-10-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-16 12:05:23 IP:211.23.xxx.xxx 未訂閱
謝謝wameng版主如此費心回答,我看的目瞪口呆!只能說太神奇
系統時間:2024-04-28 19:32:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!