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

關於滑鼠滾輪的兩個問題

尚未結案
mi86018
一般會員


發表:20
回覆:39
積分:21
註冊:2003-11-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-30 10:00:12 IP:61.222.xxx.xxx 未訂閱
一、我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-31 15:25:26 IP:203.204.xxx.xxx 未訂閱
我回答第一個問題: 我覺得你只要在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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-31 15:47:28 IP:203.204.xxx.xxx 未訂閱
回答第二個問題: sendmessage(StringGrid1.Handle,WM_VSCROLL,SB_PAGEDOWN,0); //WM_hSCROLL,SB_PAGEup
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-31 15:57:42 IP:203.204.xxx.xxx 未訂閱
第三個問題 如果不要出現反白 procedure TForm1.FormCreate(Sender: TObject); begin postmessage(StringGrid1.Handle,WM_SetFocus,0,0); end; 希望上面的回答對你有點用,呵呵
mi86018
一般會員


發表:20
回覆:39
積分:21
註冊:2003-11-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-01 19:05:31 IP:218.174.xxx.xxx 未訂閱
真的非常感謝iamjsn大哥的幫忙! 我試過了之後,第一個問題解決了!(第二個AllowChange要改為false) 但是第二個和第三個問題卻沒辦法,本來我以為是因為我開的是 > 我是頭號「問題」份子...
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-01 22:52:47 IP:203.204.xxx.xxx 未訂閱
不好意思沒看清楚你的問題,我覺得最簡單的方法就是繼承下來改 這個元件大概是改成這樣,經我在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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-01 23:49:38 IP:218.174.xxx.xxx 未訂閱
謝謝iamjsn大哥的解答,我試著裝了這個新的元件之後第二個問題也解決了!!第三個問題是因為我沒說清楚,是在StringGrid選了RowSelect之後才會有我說的情形,anywhy,很感謝iamjsn大哥!!! 我是頭號「問題」份子...
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-02 00:31:57 IP:203.204.xxx.xxx 未訂閱
第三個問題我直接幫你改在元件裏了,你自已試看看,這招是用做弊的方法,不知道這樣行不行,因為我只是把選取色藍色換成白色,哈哈哈。反正看起來就像沒選取。不然的話就肯定要去翻元件的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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-02 01:16:46 IP:203.204.xxx.xxx 未訂閱
第三個問題從元件的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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-02 01:21:54 IP:203.204.xxx.xxx 未訂閱
對了,請用最後那篇的解法(改mousedown的),因為上上篇(就是直接改drawcell的那個方法)後來我測的時候發現了一個bug。
mi86018
一般會員


發表:20
回覆:39
積分:21
註冊:2003-11-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-02 01:30:50 IP:218.174.xxx.xxx 未訂閱
呵呵...這也是一個很好的方法ㄟ...完全解決了我的三個問題!! 謝謝了!!! 我是頭號「問題」份子...
系統時間:2024-06-27 10:44:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!