zoukankan      html  css  js  c++  java
  • 鼠标拖放

    开发拖放功能的一般步骤 

      拖放作为Windows提供的一种方便操作对象的功能,在Delphi中可以很容易地开发出来。根据拖放操作的过程可以把开发步骤划分为四个阶段,即:

      ● 开始拖动操作

      ● 接收拖动项目

      ● 放下拖动项目

      ● 终止拖动操作 

      在介绍过程中我们将结合一个TabSet(标签集)的拖放操作实例。界面设计如图。在运行时当用户把一个标签拖动到另一个标签的位置时,该标签将移动到该位置并引起标签集的重新布置。

    9.2.1 开始拖动操作 

      当拖动模式(DragMode)设置为dmAutomatic时,用户在源控件上按下鼠标时拖动自动开始;当设置为dmManual时通过处理鼠标事件来决定拖动是否开始。如果想开始拖动调用BeginDrag方法。

      在TabSet拖放中,我们用下面的MouseDown事件处理过程来开始一个标签的拖动。首先判断按下的是否是左键,而后再判断项目是否合法。 

     1 procedure TForm1.TabSet1MouseDown(Sender: TObject; Button: TMouseButton;
     2 
     3 Shift: TShiftState; X, Y: Integer);
     4 
     5 var
     6 DragItem: Integer;
     7 
     8 begin
     9 
    10 if Button = mbLeft then
    11 
    12 begin
    13 
    14 DragItem := TabSet1.ItemAtPos(Point(X, Y));
    15 
    16 if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) then
    17 
    18 TabSet1.BeginDrag(False);
    19 
    20 end;
    21 
    22 end;

    9.2.2 接收拖动项目 

      一个控件能否接收拖动项目是由该控件的OnDragOver事件决定的。在TabSet拖动中,主要是利用鼠标的位置进行判断。  

     1 procedure TForm1.TabSet1DragOver(Sender, Source: TObject; X, Y: Integer;
     2 
     3 State: TDragState; var Accept: Boolean);
     4 
     5 var
     6 
     7 DropPos: Integer;
     8 
     9 begin
    10 
    11 if Source = TabSet1 then
    12 
    13 begin
    14 
    15 DropPos := TabSet1.ItemAtPos(Point(X, Y));
    16 
    17 Accept := (DropPos > -1) and (DropPos <> TabSet1.TabIndex) and
    18 
    19 (DropPos < TabSet1.Tabs.Count);
    20 
    21 end;
    22 
    23 else
    24 
    25 Accept := False;
    26 
    27 end;

    9.2.3 放下拖动项目 

      当OnDragOver事件处理过程返回的Accept为True且项目被放下时,由OnDragDrop事件处理过程来完成拖动放下后的响应。在TabSet拖放实例中是改变标签的位置。 

     1 procedure TForm1.TabSet1DragDrop(Sender, Source: TObject; X, Y: Integer);
     2 
     3 var
     4 
     5 OldPos: Integer;
     6 
     7 NewPos: Integer;
     8 
     9 begin
    10 
    11 if Source = TabSet1 then
    12 
    13 begin
    14 
    15 OldPos := TabSet1.TabIndex;
    16 
    17 NewPos := TabSet1.ItemAtPos(Point(X, Y));
    18 
    19 if (NewPos > -1) and (NewPos <> OldPos) then
    20 
    21 TabSet1.Tabs.Move(OldPos, NewPos);
    22 
    23 end;
    24 
    25 end;

    9.2.4 结束拖动操作 

      结束拖动操作的方式有两种:或者是用户释放了鼠标键或者是程序用EndDrag方法强行中止拖动。结束拖动操作的后果有两种:放下被接受或放下被忽略。

      拖动操作结束后源控件都要收到一条消息响应拖动结束事件OnEndDrag。

    原文链接:http://www.ntgs.com.cn/cjp/TUTORIAL/delphi/delphi9.1.htm

  • 相关阅读:
    SrsDataConnector The SQL Server Reporting Services account is a local user and is not supported.
    Marketing with Microsoft Dynamics CRM IDEA CONFERENCE
    Discuz!X 系列 HTTP_X_FORWARDED_FOR 绕过限制进行密码爆破
    PHPCMS v9.5.6 通杀getshell(前台)
    PHPCMS v9.5.8-设计缺陷可重置前台任意用户密码
    PHPCMS v9.6.0 任意用户密码重置
    PHPCMS V9 任意文件下载(Windows)
    Joomla!3.7.0 Core SQL注入漏洞动态调试草稿
    利用FOFA搜索WatchGuard防火墙
    如何删除Windows休眠文件(hiberfil.sys)
  • 原文地址:https://www.cnblogs.com/zhrong/p/5680560.html
Copyright © 2011-2022 走看看