以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  分享一最短代码实现控件移动(附2种方法实例)  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=7315)

--  作者:qtcks
--  发布时间:2010/6/7 9:18:00
--  分享一最短代码实现控件移动(附2种方法实例)

在人机互动中,或多或少需要实现控件的移动.
如果通过最有效的方法来实现控件移动.而不干扰其他事件的影响.
有2种方法实现控件移动.

1\\MouseMove 在控件上移动鼠标时.
   在昨天之前我一直使用这种方法,
   最大的优势是拖拽控件,能实时显示.
   但有我的代码有很大的弊端.会影响到其他事件的正常运行.
   附代码:
      1、全局变量:
    kg,sbx,sby as integer
          
      2、内部函数
    1.移动控件开关
     Vars("kg")=Args(0)
     Vars("sbx")=Args(1)
     Vars("sby")=Args(2)

    2.移动位置
     with Forms(Args(0)).Controls(Args(1))
      if Vars("kg")=1 then
       .left=.left + Args(2) - Vars("sbx")
       .top=.top + Args(3) - Vars("sby")
      else
      end if
     end with
      3、窗口事件
       1、MouseDown
        if 选中控件符合条件 then Functions.Execute("移动控件开关",1,e.x,e.y)
        
       2、MouseMove
        if 选中控件符合条件 and Vars("kg")=1 then
         Functions.Execute("移动位置",e.Form.name,e.Sender.name,e.x,e.y)
        else
        end if
        
       3、MouseUp
        if 选中控件符合条件 then
      Functions.Execute("移动控件开关",0,0,0)
     else
     end if

2\\MouseUp     松开鼠标后
 这种方法,在松开鼠标后,才执行控件移动.
 附代码:
  一.全局代码
   Public ydname As String        \'控件名称
   Public ydax As Integer        \'控件按下X坐标
   Public yday As Integer        \'控件按下Y坐标
   Public ydx As Integer         \'控件移动X坐标
   Public ydy As Integer         \'控件移动Y坐标
   Public ydh As Integer         \'控件高
   Public ydw As Integer         \'控件宽
  
   二.内部函数
     新移动控件
      ydname=Args(0)
    ydx=Args(1)
    ydy=Args(2)
    ydh=Args(3)
    ydw=Args(4)
  三.窗口事件
    1.MouseDown
     ydax=e.x      \'控件按下X坐标
     yday=e.y      \'控件按下Y坐标
     
    2.MouseMove
     Functions.Execute("新移动控件",e.Sender.name,e.x,e.y,e.Sender.Height,e.sender.Width)
     
    3.MouseUp
     e.sender.top=e.sender.top+ydy-yday
     e.sender.left=e.sender.left+ydx-ydax
  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.rar

[此贴子已经被作者于2010-6-7 14:55:23编辑过]

--  作者:狐狸爸爸
--  发布时间:2010/6/7 9:53:00
--  

呵呵,多谢,没有看出特别耗时的代码啊。

之前论坛也有人发过一个实例,你可以参考参考。

 


--  作者:yangming
--  发布时间:2010/6/7 10:05:00
--  
多谢分享
--  作者:qtcks
--  发布时间:2010/6/7 11:37:00
--  

恩,我现在的案例是这样。

一个中心控件,围绕上百的子控件。分布在中心控件周围,用直线把两者相连。

现在移动中心控件,使用第一种方法,特别消耗系统资源,将遍历N次所有连接线。

    还严重影响其他事件的运行

使用第二种方法,只需要遍历一次。

所以效能提高很多。


--  作者:kylin
--  发布时间:2010/6/7 13:14:00
--  
以下是引用qtcks在2010-6-7 11:37:00的发言:

恩,我现在的案例是这样。

一个中心控件,围绕上百的子控件。分布在中心控件周围,用直线把两者相连。

现在移动中心控件,使用第一种方法,特别消耗系统资源,将遍历N次所有连接线。

    还严重影响其他事件的运行

使用第二种方法,只需要遍历一次。

所以效能提高很多。

能否贴出例子看看,谢谢


--  作者:狐狸爸爸
--  发布时间:2010/6/7 15:54:00
--  
用SetBounds调整位置和大小,会好一些
--  作者:kylin
--  发布时间:2010/6/7 19:19:00
--  

多谢楼主!

 


--  作者:程兴刚
--  发布时间:2010/6/7 20:49:00
--  
谢分享!