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

  • 相关阅读:
    机器学习笔记(二)---- 线性回归
    机器学习笔记(一)----基本概念
    ZZ:SDNLAB技术分享(一):ODL的SFC入门和Demo
    zz:NETCONF协议详解
    技术谈 | SDN 和 NFV 之间的爱与恨
    华为云内容审核—性能更加狂野,价格更加腼腆
    【并发技术01】传统线程技术中创建线程的两种方式
    【开发者portal在线开发插件系列五】命令的响应,即命令结果的上报(mid的使用)
    【并发技术16】线程同步工具Exchanger的使用
    什么是API文档?--斯科特·马文
  • 原文地址:https://www.cnblogs.com/zhrong/p/5680560.html
Copyright © 2011-2022 走看看