如何使得拖动TrackBar的Thumb时不触发OnChange事件?而拖动释放后触发 |
尚未結案
|
hongxing
一般會員 發表:16 回覆:17 積分:6 註冊:2003-03-27 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
hongxing
一般會員 發表:16 回覆:17 積分:6 註冊:2003-03-27 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 用 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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |