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

如何使得拖动TrackBar的Thumb时不触发OnChange事件?而拖动释放后触&#21457

尚未結案
hongxing
一般會員


發表:16
回覆:17
積分:6
註冊:2003-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-13 16:08:04 IP:218.104.xxx.xxx 未訂閱
谢谢了
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-13 16:21:57 IP:202.39.xxx.xxx 未訂閱
取消: TrackBar1.OnChange := nil; 回復: TrackBar1.OnChange := TrackBar1Change;    --- 每個人都是一本書
hongxing
一般會員


發表:16
回覆:17
積分:6
註冊:2003-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-13 17:12:58 IP:218.104.xxx.xxx 未訂閱
谢谢您的回答 您只是解决了将OnChange暂时关闭的功能。 我的问题是:怎样防止在拖动Thumbs时触发OnChange事件。在释放鼠标左键后 调用一次OnChange事件?
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-13 17:57:54 IP:61.155.xxx.xxx 未訂閱
procedure TForm1.TrackBar1Enter(Sender: TObject); begin TrackBar1.OnChange:=nil; end;    procedure TForm1.TrackBar1Change(Sender: TObject); begin showmessage('ok'); end;    procedure TForm1.TrackBar1Exit(Sender: TObject); begin TrackBar1.OnChange :=TrackBar1Change; TrackBar1Change(nil); end;    好象TrackBar没有鼠标DOWN与UP的事件,你可以用焦点ENTER与EXIT来实现; 供参考!!!    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-13 20:24:33 IP:218.16.xxx.xxx 未訂閱
TrackBar 沒有 publish onMouseDown 和 onMouseUp 事件,所以想找緊 MouseUp 時才一次性的 onChange 動作比較難。    用 onExit 來直接處理也可以是一個方法 (若使用的話 onChange 程式碼直接寫在 onExit 就去,不用開始時又 Enter 時又 disable, exit 時 Enable 又手動呼叫 onChange)。不過這樣做的缺點是少了即時性,一定要等使用者離開該 Control 才會觸動。    自定元件 publish onMouseDown / onMouseUp 的效果會比用 onExit 好, 但比較麻煩。    用用腦筋想想看也許有更好的方法,以下是我想及試了個多小時的結果,可約略模擬出 onMouseUp 時機 : 放一個 TTimer 到 Form, 並設 Enabled := FALSE, Interval = 200 (你可改為你覺得好的) 然後設定 TrackBar 的 onChange 事件 及 TTimer 的 onTimer 時件如下    
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Timer1.Enabled := false;
  Timer1.Enabled := true; // 重新計時
end;    procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Mouse.Capture <> TrackBar1.Handle then // 使用者放手了
  begin
    Timer1.Enabled := false; //關掉 Timer
    ShowMessage('Do Change'); //做你原本在 onChange 做的事
  end;
end;
幾句 Code 就可以了,卻花了個多小時去想,看來我也是笨笨的
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-13 23:45:29 IP:61.221.xxx.xxx 未訂閱
Hi, 寫了一個小元件繼承 TTrackBar 自己處理滑鼠的事件, 看合不合用. 其中 TVirtualClass 是一個虛擬的 class, 為了動態給事件使用. 請參考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30055    程式如下, FOldValue 是用來檢驗是否和原來的 position 一樣, 在滑鼠左鍵按下時會先存起來, 到滑鼠左鍵放開時, 會檢驗是否相同, 不同才會執行 OnmyChange event < class="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TVirtualClass = class(TObject) class procedure myevent(Sender: TObject); end; TmyTrackBar = class(TTrackBar) private FOldValue: Integer; FOnmyChange: TNotifyEvent; procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; published property OnmyChange: TNotifyEvent read FOnmyChange write FOnmyChange; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var myTrackBar: TmyTrackBar; begin //動態生成 TmyTrackBar. myTrackBar:= TmyTrackBar.Create(self); myTrackBar.Parent := self; myTrackBar.Top := 200; myTrackBar.Left := 100; myTrackBar.FOnmyChange := TVirtualClass.myevent; end; { TmyTrackBar } procedure TmyTrackBar.WMLButtonDown(var Message: TWMLButtonDown); begin FOldValue := Position; inherited; end; procedure TmyTrackBar.WMLButtonUp(var Message: TWMLButtonUp); begin inherited; if Assigned(FOnmyChange) and (FOldValue<>Position) then FOnmyChange(Self); end; { TVirtualClass } class procedure TVirtualClass.myevent(Sender: TObject); begin showmessage('only one take place'#13#10'Position:' IntToStr(TmyTrackBar(Sender).Position)); end; end. 發表人 - timhuang 於 2003/05/13 23:59:03
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-14 08:02:43 IP:61.155.xxx.xxx 未訂閱
timhuang 兄:    < >技术真是高!实在佩服! 小弟又学了一招,哈哈~~~< > <><><>风花雪月 >< />
------
风花雪月 e梦情缘
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-14 09:14:12 IP:218.16.xxx.xxx 未訂閱
引言: 用 onExit 來直接處理也可以是一個方法 (若使用的話 onChange 程式碼直接寫在 onExit 就去,不用開始時又 Enter 時又 disable, exit 時 Enable 又手動呼叫 onChange)。不過這樣做的缺點是少了即時性,一定要等使用者離開該 Control 才會觸動。 自定元件 publish onMouseDown / onMouseUp 的效果會比用 onExit 好, 但比較麻煩。
自定元件的最大好處是可重覆使用,所以反正是自訂可考慮安裝好了它以後在那裡也可用。 1. 將下列一段抄進 NotePad/Delphi 然後 Save 做 MyTrackBar.pas (或你要的名字) 2. Component->Install->Browse 選該 File 3. Build and Install 就可以了
unit MyTrackBar;
 
interface
uses Classes, ComCtrls;
  Type
    TMyTrackBar = class(TTrackBar)
    published
      property onMouseDown;
      property onMouseUp;
    end;
Procedure Register;
 
implementation
 
Procedure Register;
begin
  RegisterComponents('Sample', [TMyTrackBar]);
end;
end.
之後就會出現在 Sample 頁(你也可修改上面程式到你喜歡的頁)使用與一般TrackBar 無異,多了 onMouseUp 和 onMouseDown 事件。你可直接在 onMouseUp 寫你的一次過處理 Change 事件 若你想只有在 Value 不同才引發,也可在 onMouseDown 記下原 Value, 然後 在 onMouseUp 檢查若相同則離開不同才繼續。 不過,若你只是一次過使用,始終覺得使用 Timer 那方法較簡單。若你想只在Value 不同時才執行某些程式碼,可加一 OldPos 變數,在 FormShow 事件加一行 : OldPos := TrackBar1.Position; // 記下起始 OldPos Timer1 的 Timer 事件改為 :
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Mouse.Capture <> TrackBar1.Handle then // 使用者放手了
  begin
    Timer1.Enabled := false; //關掉 Timer
    if TrackBar1.Position = OldPos then exit; // Position 一樣跳過下面事件
    ShowMessage('Do Change'); //做你原本在 onChange 做的事
    OldPos := TrackBar1.Position; // 記下新的 OldPos
  end;
end;
系統時間:2024-05-16 17:18:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!