delphi经典编程入门(9)

上传人:ldj****22 文档编号:35911140 上传时间:2018-03-22 格式:PDF 页数:9 大小:100.96KB
返回 下载 相关 举报
delphi经典编程入门(9)_第1页
第1页 / 共9页
delphi经典编程入门(9)_第2页
第2页 / 共9页
delphi经典编程入门(9)_第3页
第3页 / 共9页
delphi经典编程入门(9)_第4页
第4页 / 共9页
delphi经典编程入门(9)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《delphi经典编程入门(9)》由会员分享,可在线阅读,更多相关《delphi经典编程入门(9)(9页珍藏版)》请在金锄头文库上搜索。

1、Delphi园地 http:/ 第九章 Delphi拖放编程 第九章 Delphi拖放编程 拖放(DragDrop)是Windows提供的一种快捷的操作方式。作为基于Windows的开发工具,Delphi同样支持拖放操作, 而且开发应用系统的拖放功能十分方便,真正体现了Delphi的强大功能和方便性。 Delphi提供的所有控件(Control,即能获得输入焦点的部件)都支持拖放操作,并有相应的拖放属性、拖放事件和 拖放方法。下面我们先介绍控件的拖放支持,而后再给出开发拖放操作的一般步骤和应用实例。 9.1 控件的拖放支持 拖放操作中控件可以分为源控件和目标控件两类。绝大部分控件既可以作为源控

2、件也可以作为目标控件。但也有一 部分控件只能支持其中的一种。 9.1.1 拖放属性 拖放属性主要有两个: DragMode : 拖动模式 DragCursor : 拖动光标 它们都是在拖放的源控件中设置。DragMode控制用户在运行时间内当在控件上按下鼠标时控件如何反应。如果 DragMode置为dmAutomatic,那么当用户在控件上按下鼠标时拖动自动开始;如果DragMode置为dmManual(这是缺省 值),则将通过处理鼠标事件来判断一个拖动是否可以开始。 DragCursor用于选择拖动时显示的光标,缺省值是CrDrag,一般不要去修改它。在程序设计过程中通用的界面规范 应该得到

3、开发者的尊重。但有时候为了特定的目的,开发者也可以把自己设计的光标赋给DragCursor。 9.1.2 拖放事件 拖放事件主要有三个: OnDragOver:拖动经过时激发 OnDragDrop:拖动放下时激发 OnEndDrop :拖动结束时激发 前两个事件由目标控件响应,后一个事件由源控件响应。 OnDragOver事件最主要的功能是确定当用户就地放下拖动时控件是否可以接受。它的参数包括: Source : TObject; 源控件 X,Y : Integer; 光标位置 State : TDragState; 拖动状态 var Accept : Boolean 能否接受 TDragSt

4、ate是一个枚举类型,表示拖放项目与目标控件的关系。 type TDragState = (dsDragEnter, dsDragLeave, dsDragMove); 不同取值的意义如下表: 页码,1/9第九章 Delphi拖放编程表9.1 DragState 的取值与意义 取 值 意 义 dsDragEnter 拖动对象进入一个允许拖动对象放下 的控件中。为缺省状态。 dsDragLeave 拖动对象离开一个允许拖动对象放下 的控件。 dsDragMove 拖动对象在一个允许拖动对象放下的 控件内移动。 用户可以利用提供的参数来确定放下的拖动是否可被接受,如: 判断源控件类型: Accep

5、t := Source is TLabel; 判断源控件对象: Accept := (Source = TabSet1); 判断光标位置: 见(9.2),(9.3)中的例程。 判断拖动状态: If (Source is TLabel) and (State = dsDragMove) then begin source.DragIcon := New.Ico ; Accept := True; end else Accept := False; 当Accept=True时,目标控件可以响应OnDragDrop事件,用于确定拖动被放下后程序如何进行处理。 OnDragDrop事件处理过程的参数包

6、括源控件和光标位置。这些信息可用于处理方式的确定。 OnEndDrag事件是在拖动操作结束后由源控件来进行响应的,用于源控件进行相应的处理。拖动操作结束既包括拖 动放下被接受,也包括用户在一个不能接受放下的控件上释放了鼠标。该事件处理过程的参数包括目标控件(Target)和 放下位置的坐标。如果Target=nil, 表示拖动项目没有被任何控件接受。 页码,2/9第九章 Delphi拖放编程在第3节将介绍的文件拖放移动、拖放拷贝操作中,如果操作成功,则文件列表框应更新显示内容。下面这段程序 用于实现这一功能。 procedure TFMForm.FileListEndDrag(Sender,

7、Target: TObject; X, Y: Integer); begin if Target -1) and (DragItem -1) and (DropPos OldPos) then TabSet1.Tabs.Move(OldPos, NewPos); end; end; 9.2.4 结束拖动操作 结束拖动操作的方式有两种:或者是用户释放了鼠标键或者是程序用EndDrag方法强行中止拖动。结束拖动操作的 后果有两种:放下被接受或放下被忽略。 拖动操作结束后源控件都要收到一条消息响应拖动结束事件OnEndDrag。 9.3 拖放应用实例:文件管理器的拖放支持 在第六章最后开发的文件管理

8、器应用实例,虽然功能上已初具规模,但在操作上与Windows的文件管理器相比还有 很大不足。其中最大的缺陷是它不支持文件的拖放移动和拖放拷贝。在这一章结束的时候,我们可以来弥补这一缺陷 了。 文件拖放移动指的是当用户把一个文件拖动到目录树下的某一目录并放下时,文件将自动移动到该目录中;文件拖 放拷贝指的是当用户把一个文件拖动到某个驱动器标签上并放下时,文件将自动拷贝到该驱动器的当前目录下。作为源 控件的文件列表框和作为目标控件的目录树、驱动器标签可以位于不同的子窗口。驱动器的当前目录是任一子窗口的最 新操作结果,而不论这一子窗口与拖动源、拖动目标是否有关系。 为了实现上述功能,有两个问题必须首

9、先解决: 1.如何记录每一驱动器的当前目录? 为此我们定义了一个全局变量: var CurentDirList: Array0.25 of string70; 在DirectoryOutline的OnChange事件中: procedure TFMForm.DirectoryOutlineChange(Sender: TObject); begin CreateCaption; FileList.clear; FileList.Directory := DirectoryOutline.Directory; FileList.Update; CurrentDirListDriveTabSet.

10、TabIndex := DirectoryOutline.Directory; 页码,6/9第九章 Delphi拖放编程FileManager.DirectoryPanel.Caption := DirectoryOutline.Directory; end; 由于DriveTabSet在响应OnDragDrop事件前先响应OnClick事件,并由该事件激发DirectoryOutline的Onchange事 件,因而可保证在任何时候OnDragDrop事件中用到的CurrentDirList数组项不为空字符串。 2.如何保证移动、拷贝与子窗口的无关性? 在这里一个关键问题是我们判断源控件时是

11、用is操作符进行类型检查: If Source is TFileList then 如果我们用下面的语句: If Source = FileList then 则移动、拷贝操作将限制在本子窗口范围内。 当解决了上述问题后我们的工作就只是遵循拖放的一般开发步骤,按步就班来完成了。 1.FileList开始拖动操作 procedure TFMForm.FileListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then wi

12、th Sender as TFileListBox do begin if ItemAtPos(Point(X, Y), True) = 0 then BeginDrag(False); end; end; ItemAtPos用来检查当前是否有文件存在。而BeginDrag方法传递参数False, 允许FileList单独处理鼠标事件而并 不开始拖动。事实上这种情况是大量存在的。 2.DirectoryOutline、DriveTabSet决定是否能接受拖动的就地放下。 procedure TFMForm.DirectoryOutlineDragOver(Sender, Source: TOb

13、ject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if Source is TFileListBox then 页码,7/9第九章 Delphi拖放编程Accept := True; end; procedure TFMForm.DriveTabSetDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var PropPos: Integer; begin if Source is

14、TFileListBox then with DriveTabSet do begin PropPos := ItemAtPos(Point(X,Y); Accept := (PropPos -1) and (PropPos then ConfirmChange(Copy,TheFilename,CurrentDirListTabIndex); end; end; 4.FileList响应拖动结束,更新文件列表 procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer); begin if Target nil then FileList.Update; end; 到目前为止,我们的文件管理器功能已足够强大。 不过还有许多问题值得读者去进 一步探讨,如: 1.文件与应用程序关联的建立; 2.在文件列表框中显示更多的文件信息; 3.文件列表框中的文件按后缀各排序等。 文件管理器是一个真正的综合例程,对它的钻研会使您更进一步模到Delphi编程的精髓。 目录 上一页 下一页 页码,9/9第九章 Delphi拖放编程

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号