DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: szliyu112358
今日帖子: 50
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 haiq (海强) ★☆☆☆☆ -
普通会员
2015/5/5 13:54:54
标题:
控件的两个事件 OnDblClick 和 OnClick 如何同时设定 浏览:928
加入我的收藏
楼主: 按此在新窗口浏览图片
    如果只设置控件的 OnDblClick 或 OnClick 均可正常触发。但是,两个事件同时设置时只能触发 OnClick 事件。

这个问题如何解决?请各位大侠帮忙解决一下!
----------------------------------------------
我不用,是因为不知有何用。
作者:
男 key_ok (大悟还俗) ▲▲▲▲▲ -
普通会员
2015/5/5 14:06:49
1楼: 当你点两下时,相当于 两次 OnClick  事件
----------------------------------------------
http://www.cnblogs.com/key-ok/我的技术笔记http://pan.baidu.com/share/home?uk=1177427271 我的源码笔记
作者:
男 supermay (supermay) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 14:35:36
2楼: 你是在调试状态下,发现只在onClick
----------------------------------------------
链接:https://pan.baidu.com/s/12jzmECYKhGCsHBxz8tmB6w 提取码:pelr --来自百度网盘超级会员V9的分享
作者:
女 sunyesy (文儿) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 14:46:18
3楼: 利用延迟执行onclic应该可以
----------------------------------------------
大象说他Delphi比我好,我想了三天没明白是怎么回事!按此在新窗口浏览图片
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
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;
----------------------------------------------
我不用,是因为不知有何用。
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 17:12:14
7楼: 什么叫做只执行一次?我觉得你的代码可以啊。

但是更优化一下,不要用sleep,要不然你这双击的难度太高了,因为睡眠期间是无法点击的。使用TTimer,设置10ms(即你定义的双击最长时间间隔),在这10ms内探测鼠标点击的数量,大于等于2,就算双击,等于1就单击,过时不候,超过时间间隔点击次数立刻清零。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 17:18:38
8楼: 另外还想到一个问题。你点击两次form,系统不一定这么认为,而是把它合成一次双击了(根本不会调用你的OnClick),所以你还要处理WM_LBUTTONDBLCLK ,把它转发成两次单击。最简单的办法是简单直接增加2个计数即可,不用转发消息什么的,也不用调用单击函数。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
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这两个消息处理函数来的可靠和方便;
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
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;
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2015/5/5 23:16:40
11楼: 楼上英明,才几个月没碰delphi,就把mousedown给忘了
----------------------------------------------
只有偏执狂才能生存!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS