导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
haiq (海强)
★☆☆☆☆
-
普通会员
2015/5/5 13:54:54
标题:
控件的两个事件 OnDblClick 和 OnClick 如何同时设定
浏览:928
加入我的收藏
楼主:
如果只设置控件的 OnDblClick 或 OnClick 均可正常触发。但是,两个事件同时设置时只能触发 OnClick 事件。这个问题如何解决?请各位大侠帮忙解决一下!
----------------------------------------------
- 我不用,是因为不知有何用。
作者:
2015/5/5 14:06:49
1楼:
当你点两下时,相当于 两次 OnClick 事件
----------------------------------------------
http://www.cnblogs.com/key-ok/我的技术笔记http://pan.baidu.com/share/home?uk=1177427271 我的源码笔记
作者:
2015/5/5 14:35:36
2楼:
你是在调试状态下,发现只在onClick
----------------------------------------------
链接:https://pan.baidu.com/s/12jzmECYKhGCsHBxz8tmB6w 提取码:pelr --来自百度网盘超级会员V9的分享
作者:
2015/5/5 14:46:18
3楼:
利用延迟执行onclic应该可以
----------------------------------------------
大象说他Delphi比我好,我想了三天没明白是怎么回事!
作者:
2015/5/5 15:34:07
4楼:
好问题。 但是这种情况下,已经不是通常意义的OnDblClick了。你可以把代码都写在OnClick里,一定时间内收集点击次数,然后再判断执行哪一个。
----------------------------------------------
只有偏执狂才能生存!
作者:
haiq (海强)
★☆☆☆☆
-
普通会员
2015/5/5 15:59:28
5楼:
通过测试,在 OnClick 的代码中暂停 200 毫秒可以调用 OnDblClick 不过这样延时后还是接着执行其后的代码...想用个全局变量控制一下好像不起作用??????? var lIsClick: Boolean = True; // - 双击执行 procedure TForm.OnDblClick(Sender: TObject); begin lIsClick := False; ... ... end; // - 单击执行 procedure TForm.OnClick(Sender: TObject); begin // - 延时 Sleep(200); if lIsClick then begin // - 单击后要执行的代码 ... ... end else lIsClick := True; ... ... end;
----------------------------------------------
- 我不用,是因为不知有何用。
作者:
haiq (海强)
★☆☆☆☆
-
普通会员
2015/5/5 16:18:56
6楼:
to nevergrief (孤独骑士),这样不行,好像无论是单击还是双击,OnClick 都只执行一次?????? var lHitCount: Integer = 0; procedure TForm.OnClick(Sender: TObject); begin Inc(lHitCount); if lHitCount = 1 then Sleep(500); case lHitCount of 1: // - 单击 begin ... ... end; 2: // - 双击 begin ... ... end; end; lHitCount := 0; end;
----------------------------------------------
- 我不用,是因为不知有何用。
作者:
2015/5/5 17:12:14
7楼:
什么叫做只执行一次?我觉得你的代码可以啊。 但是更优化一下,不要用sleep,要不然你这双击的难度太高了,因为睡眠期间是无法点击的。使用TTimer,设置10ms(即你定义的双击最长时间间隔),在这10ms内探测鼠标点击的数量,大于等于2,就算双击,等于1就单击,过时不候,超过时间间隔点击次数立刻清零。
----------------------------------------------
只有偏执狂才能生存!
作者:
2015/5/5 17:18:38
8楼:
另外还想到一个问题。你点击两次form,系统不一定这么认为,而是把它合成一次双击了(根本不会调用你的OnClick),所以你还要处理WM_LBUTTONDBLCLK ,把它转发成两次单击。最简单的办法是简单直接增加2个计数即可,不用转发消息什么的,也不用调用单击函数。
----------------------------------------------
只有偏执狂才能生存!
作者:
2015/5/5 21:18:38
9楼:
基本上只能这样处理: 在onclick里写如下: var continue:Boolean ; Msg:TMsg; begin continue:=True; SetCapture(YourControl.Handle); while Continue do begin while not PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin end; if (GetFocus<>Handle) or (Msg.message = WM_CANCELMODE) then continue:=false else if (Msg.message=WM_LBUTTONDOWN) then begin Showmessage('click!'); continue:=False; end else if (Msg.message=WM_LBUTTONDBLCLK) then begin Showmessage('double click!'); continue:=False; end else DispatchMessage(Msg); end; end; 但一般很少会同时处理click和doubleclick事件。如果需要处理,都不如继承控件,然后重写 WM_LBUTTONDBLCLK和WM_LBUTTONDOWN这两个消息处理函数来的可靠和方便;
----------------------------------------------
-
作者:
2015/5/5 21:53:03
10楼:
想了想,糊涂了,根本没这么复杂,处理mousedown事件就可以了。 procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssdouble in Shift then begin Label1.Caption:='double click!'; end else begin Label1.Caption:='click!'; end; end;
----------------------------------------------
-
作者:
2015/5/5 23:16:40
11楼:
楼上英明,才几个月没碰delphi,就把mousedown给忘了
----------------------------------------------
只有偏执狂才能生存!