關於滑鼠滾輪的兩個問題 |
尚未結案
|
mi86018
一般會員 ![]() ![]() 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
一、我在CLX form上使用pagecontrol時,發現了一個在VCL沒有遇到的問題,就是多了滑鼠滾輪可以換頁的功能,但是因為我本來使用按鈕來進行換頁的動作(因為有一些權限上的控制),但是在CLX上時,卻突然發現滾輪居然也可以換頁,這樣我寫的控制全白費了,所以想問一下是不是要重寫一個繼承pagecontrol的元件,並把滑鼠滾輪的事件關掉呢?我該如何進行? 二、在String Grid上的使用滑鼠滾輪時,可以有捲動頁的功能,但是Select Row也會跟著變動,我要如何改寫,才能改成只捲動頁,而Selcet的ROW不動呢?我看了一些站上的文章,有寫到,可以把wheelup跟wheeldown中把handled值數為true,這個功能我試了之後是完全把滑鼠滾輪的功能都關掉了,但是我要如何改寫才會有我想要的功能呢?? 三、不好意思,又想到一個小問題,就是我用String Grid時,在程式Run之後,一定會有一個ROW被select(反白),我不知道該如何設定或寫程式去讓他不要自動select一個ROW(在程式一開始被啟動的時候),我要如何寫呢?? 感謝站上所有的高手!!!
|
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
我回答第一個問題:
我覺得你只要在onchanging那裏作控制就行了,使用按鈕去換頁時你可以多加一個flag,如FBtnChangePage=TRUE;
procedure TForm1.PageControl1Changing(Sender: TObject; var AllowChange: Boolean); begin if FBtnChangePage then begin AllowChange=true; FBtnChangePage =false; end else AllowChange=true; end;我想類似用這樣的方法應該就能擋掉滾輪換頁的功能了吧,其它的問題還沒試@_@ |
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
|
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
|
mi86018
一般會員 ![]() ![]() 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
|
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
不好意思沒看清楚你的問題,我覺得最簡單的方法就是繼承下來改
這個元件大概是改成這樣,經我在d7測試,二、三的問題都ok
第三個問題為什麼繼承的什麼都沒改也不會有反藍的顏色,我也不知
我測的時後是真的沒有,只有一個虛線的focus框,但沒有反藍的選取框
你可以把這個元件裝上去試試
unit TestStringGrid; interface uses SysUtils,Windows, Classes, Controls, Grids,Messages; type TTestStringGrid = class(TStringGrid) private { Private declarations } protected function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override; function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override; public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('test', [TTestStringGrid]); end; { TTestStringGrid } function TTestStringGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; begin result:=true; sendmessage(Handle,WM_VSCROLL,SB_PAGEDOWN,0); end; function TTestStringGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; begin result:=true; sendmessage(Handle,WM_VSCROLL,SB_PAGEUP,0); end; end. |
mi86018
一般會員 ![]() ![]() 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
|
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
第三個問題我直接幫你改在元件裏了,你自已試看看,這招是用做弊的方法,不知道這樣行不行,因為我只是把選取色藍色換成白色,哈哈哈。反正看起來就像沒選取。不然的話就肯定要去翻元件的source,我稍微看了一下source,好像沒有簡單直接可以改的地方,所以就用這個方法,障眼法,呵。希然這樣可以滿足你的需求。
unit TestStringGrid; interface uses SysUtils,Windows, Classes, Controls, Grids,Messages,graphics; type TTestStringGrid = class(TStringGrid) private FFirst:Boolean; protected function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override; function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override; procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; public constructor Create(AOwner: TComponent); override; procedure PaintWindow(DC: HDC); override; published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('test', [TTestStringGrid]); end; { TTestStringGrid } constructor TTestStringGrid.Create(AOwner: TComponent); begin inherited Create(AOwner); FFirst:=true; end; function TTestStringGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; begin result:=true; sendmessage(Handle,WM_VSCROLL,SB_PAGEDOWN,0); end; function TTestStringGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; begin result:=true; sendmessage(Handle,WM_VSCROLL,SB_PAGEUP,0); end; procedure TTestStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); begin if FFirst and (gdSelected in AState) then begin Canvas.brush.color:=clWhite; Canvas.fillRect(ARect); end else inherited; end; procedure TTestStringGrid.PaintWindow(DC: HDC); begin inherited PaintWindow(DC); FFirst:=false; end; end. |
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
第三個問題從元件的source看來,不是粉好改,
我想了一個比較偷機的方法,不知道這樣行不行。
完成的方法:
一。先將下個這個元件重裝一次
二。把元件的goRowSelect設成false
這樣一開始只會有一個focus虛線框,
unit TestStringGrid; interface uses SysUtils,Windows, Classes, Controls, Grids,Messages,graphics; type TTestStringGrid = class(TStringGrid) private protected function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override; function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('test', [TTestStringGrid]); end; { TTestStringGrid } function TTestStringGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; begin result:=true; sendmessage(Handle,WM_VSCROLL,SB_PAGEDOWN,0); end; function TTestStringGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; begin result:=true; sendmessage(Handle,WM_VSCROLL,SB_PAGEUP,0); end; procedure TTestStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not (gorowselect in Options) then Options:=Options [gorowselect]; inherited; end; end. |
iamjsn
初階會員 ![]() ![]() 發表:78 回覆:95 積分:44 註冊:2002-08-16 發送簡訊給我 |
|
mi86018
一般會員 ![]() ![]() 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |