说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi拖放编程(2)

HTML文档下载 WORD文档下载 PDF文档下载
Delphi拖放编程(2)

9.2开发拖放功能的一般步骤

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

●开始拖动操作

●接收拖动项目

●放下拖动项目

●终止拖动操作

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

9.2.1开始拖动操作

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

在TabSet拖放中,我们用下面的MouseDown事件处理过程来开始一个标签的拖动。

首先判断按下的是否是左键,而后再判断项目是否合法。

procedure TForm1.TabSet1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X

Y: Integer);

var

DragItem: Integer;

begin

if Button = mbLeft then

begin

DragItem := TabSet1.ItemAtPos(Point(X

Y));

if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) then

TabSet1.BeginDrag(False);

end;

end;

9.2.2接收拖动项目

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

procedure TForm1.TabSet1DragOver(Sender

Source: TObject; X

Y: Integer;

State: TDragState; var Accept: Boolean);

var

DropPos: Integer;

begin

if Source = TabSet1 then

begin

DropPos := TabSet1.ItemAtPos(Point(X

Y));

Accept := (DropPos > -1) and (DropPos <> TabSet1.TabIndex) and

(DropPos < TabSet1.Tabs.Count);

end;

else

Accept := False;

end;

9.2.3放下拖动项目

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

procedure TForm1.TabSet1DragDrop(Sender

Source: TObject; X

Y: Integer);

var

OldPos: Integer;

NewPos: Integer;

begin

if Source = TabSet1 then

begin

OldPos := TabSet1.TabIndex;

NewPos := TabSet1.ItemAtPos(Point(X

Y));

if (NewPos > -1) and (NewPos <> OldPos) then

TabSet1.Tabs.Move(OldPos

NewPos);

end;

end;

9.2.4结束拖动操作

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

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

9.3  拖放应用实例:文件管理器的拖放支持

在第六章最后开发的文件管理器应用实例,虽然功能上已初具规模,但在操作上与Windows的文件管理器相比还有很大不足。其中最大的缺陷是它不支持文件的拖放移动和拖放拷贝。在这一章结束的时候,我们可以来弥补这一缺陷了。

文件拖放移动指的是当用户把一个文件拖动到目录树下的某一目录并放下时,文件将自动移动到该目录中;文件拖放拷贝指的是当用户把一个文件拖动到某个驱动器标签上并放下时,文件将自动拷贝到该驱动器的当前目录下。作为源控件的文件列表框和作为目标控件的目录树、驱动器标签可以位于不同的子窗口。驱动器的当前目录是任一子窗口的最新操作结果,而不论这一子窗口与拖动源、拖动目标是否有关系。

为了实现上述功能,有两个问题必须首先解决:

1.如何记录每一驱动器的当前目录?

为此我们定义了一个全局变量:

var CurentDirList: Array[0...25] of string[70];

在DirectoryOutline的OnChange事件中:

procedure TFMForm.DirectoryOutlineChange(Sender: TObject);

begin

CreateCaption;

FileList.clear;

FileList.Directory := DirectoryOutline.Directory;

FileList.Update;

CurrentDirList[DriveTabSet.TabIndex] := DirectoryOutline.Directory;

FileManager.DirectoryPanel.Caption := DirectoryOutline.Directory;

end; 

由于DriveTabSet在响应OnDragDrop事件前先响应OnClick事件,并由该事件激发DirectoryOutline的Onchange事件,因而可保证在任何时候OnDragDrop事件中用到的CurrentDirList数组项不为空字符串。

2.如何保证移动、拷贝与子窗口的无关性?

在这里一个关键问题是我们判断源控件时是用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

with 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: TObject; X

Y: Integer; State: TDragState; var Accept: Boolean);

begin

if Source is TFileListBox then

Accept := True;

end;

procedure TFMForm.DriveTabSetDragOver(Sender

Source: TObject; X

Y: Integer; State: TDragState; var Accept: Boolean);

var

PropPos: Integer;

begin

if Source is TFileListBox then

with DriveTabSet do

begin

PropPos := ItemAtPos(Point(X

Y));

Accept := (PropPos > -1) and (PropPos < Tabs.Count);

end;

end;

DirectoryOutline是无条件的接受,而DriveTabSet需检查是否是合法的标签。

3.拖动放下的响应

DirectoryOutline的拖动放下用于实现文件移动功能。程序中调用ConfirmChange 事件处理过程,目标路径由DirctoryOutline.Items[GetItem(X

Y)].FullPath来得到。

procedure TFMForm.DirectoryOutlineDragDrop(Sender

Source: TObject; X

Y: Integer);

begin

if Source is TFileListBox then

with DirectoryOutline do

begin

ConfirmChange('Move'

FileList.FileName

Items[GetItem(X

Y)].FullPath);

end;

end;

DriveTabSet的拖动放下用于实现文件拷贝功能。程序中把当前位置转化为相应的驱动器号,目标路径由CurrentDirList[DriveTabSet.TabIndex]获得。

procedure TFMForm.DriveTabSetDragDrop(Sender

Source: TObject; X

Y: Integer);

var

APoint: TPoint;

begin

APoint.X := X; APoint.Y := Y;

DriveTabSet.TabIndex := DriveTabSet.ItemAtPos(APoint);

if Source is TFileListBox then

with DriveTabSet do

begin

if CurrentDirList[TabIndex] <> '' then

ConfirmChange('Copy'

TheFilename

CurrentDirList[TabIndex]);

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编程的精髓。

实现画面的各种切换方法-VB资料 实现屏幕变暗的效果 -VB资料 实现图像切换效果 -VB资料 提取Win9x拷贝的动画-VB资料 一个图像滤光处理程序-VB资料 一个用VB5.0 实现的鼠标绘图程序 用VB6.0制作画图板 用VB6设计有趣的动画场景 用VB编程绘制网格图像 用VB绘制抛物线动画曲线 用VB绘制正弦动画曲线 用VB实现“百叶窗”的图形特效 用VB实现托盘动画图标 用Visual Basic 定制BMP文件 用Visual Basic的Move方法实现动画效果 用Visual Basic与MS-Draw开发通用作图软件 在VB中获取可执行文件及Windows 95快捷方式的图标 在VB中进行各种图形切换的方法 在VB中制作可滚动的图像显示 在图片上平滑移动文字 -VB资料 VB怎样使程序的标题条闪烁? VB制作图像的Mask图 CWinInetConnection-一个封装了WinInet API函数的类 -VB资料 MODEM通讯意外处理-VB资料 MsComm 文字传输-VB资料 PING一个IP地址(向它发送一个数据包并等待回应) -VB资料 SMTP协议简介 (Simple Mail Transfer Protocol) -VB资料 VB5.0 中远程数据库的访问 VB下如何编写CRC校验程序 Visual Basic 6中发送邮件的新方法 Visual Basic通信程序设计 如果我想删除日志文件的所有记录该怎么办?????? 怎么样把两个ArrayList合并成一个??我在文档里找了半天也没找到!急~~!!!!!!! 请问,NT4.0下怎样配置网关和路由? 请问如何知道一个弹出菜单是否以经关闭 升级后问题,奇怪,请指教? 什么是存储过程? 大侠们帮忙看看,简单问题 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169. 请问怎样才能在Access中选取指定行数的记录如第5-10条. 关于XML命名空间的疑问?请教各位高手帮帮忙!谢谢! 请问哪里有《情深深雨蒙蒙》下载??? ******斑竹快出来啊 看看我这个贴子啊!!!!!!!!!!!!!! 如何读取寄存器中的数据? 请问在数据库中如何操作日期型字段: Help,如何把本机加入主域服务器? 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169 怎么用vbscript定义一个函数阿。我想作一个下拉框的onchange事件,请指教 如何确定adoquery的数据是否被修改了? 有关程序调试的问题 全都转行卖大白菜。 对于各个.h和.cpp文件分工如何,我的各种函数各个变量到底该放在哪个文件中的哪个class中? 如何停止asp调用的dll文件,我调用my_dll.dll文件一次之后就不能对my_dll.dll更改了,为什么?怎样解决? 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169.. 关于附件下载过程中权限控制的问题 如何编辑LILO文件? 糊涂啦。。。看看汉字库(hzk24)吧? 请问在listbox控件中如何设置特定行的颜色? 问一个关于ODBC的问题 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169.... 各位大侠,哪有设计专家系统的c语言的源代码阿(全分奉送)? 请问:如何处理MFC提供的CList类模板产生的异常问题呢? 散分!快抢! 调用对象 阿呆,只有你能救我了~~!!!!! 100大洋~~!!! Excel报表的汇总 请问VC有像Delphi或者C++Builder那样的作报表的工具吗? delphi怎么调用CHM文件啊? win98 登陆win nt Java远程调用的合法类型(legal types for Java RMI)都有哪些? 安装盘的制作问题 如何设置多个Timer? VFP的程序怎么才能运行在任何目录下?主程序应该怎么写? 这个问题很老套,但对于一个什么想成为一个优秀程序员的菜鸟来说,很重要,谢谢!进入........... @_@ 怎么灌水? 向资深灌水工请教! 难到这个问题没人回答吗?????http://www.csdn.net/Expert/topic/430/430088.shtm StringGrid中单元格合并问题? Delphi的TMainMenu和TPopupMenu没有Font属性,请问如何修改它们的字体? like 查询小问题 紧急求救:网管程序开发! 请问那理由chm格式的javascript的帮助可以下载啊? 这是为什么!---关于TQuery, Update, Sql 水平面上有一个物体受水平方向力的作用由静止开始无摩擦的运动,经过位移s1,速度达到v又经过位移s速度达到2v,则两段位移中该力所做功之比是多少? 将1~10这十个自然数分别填入图中的十个○内,使各条线段上四个○内数的和相等,每个三角形三个顶点上○内数的和也相等. 一个梯形,下底长14CM,高12CM,如果下底减少6CM,它就成为一个平行四边形.梯形的面积是多少? 在水平面上有一个质量为M的物体,在水平力作用下由静止开始运动一段距离后,到达一斜面底端.这时撤去外力.物体冲上斜面,沿斜面上滑的最大距离和水平面上运动的距离相等,然后物体又沿斜 一个梯形的下底是上底长度的3倍,将上底延长8厘米,则梯形变成平行四边形.梯形的上、下底各是多少厘米? 根号5在4*4方格上怎么画急 在恒定力F作用下,物体由静止开始运动,经过一段位移s后,速度达到v,做功为w.在相同的恒定合力F作用下,物体的速度由0增至nv,则F做得功是原来的___倍,若要物体的速度由v增至nv,则需对它做的功 为什么水在沸腾的实验中,发现上升的气泡大小不一样:开始时,气泡上升时逐渐变小;沸腾后气泡上升时逐渐变大,这是为什么? 10*10的方格中怎样画根号三不用尺子等辅助工具:calli159 怎么画根号2与1垂直 插入一个图片 水平地面上有一质量为10kg的物体,在50N水平力作用下由静止开始运动,6秒内位移为36m,6s末撤去这个水平力,则再经 s,前进 m距离物体停止运动.快 一个梯形的上底是下底的3倍,如果将梯形的下底延长8厘米,那么这个梯形变成了平行四边形.这个梯形的上、下底各是几厘米 要算式 利用4*4的方格画出边长为根号5的正方形只要算式,越快越好 一个三角形有多少个角?如果在三角形中添画一条线段,会增加多少个小于180 度角?在添画一条线段呢一个三角形有多少个角?如果在三角形中添画一条线段,会增加多少个小于180度角?在添画一条 一个梯形的上底是下底长度的3倍,如果将梯形的下底延长8厘米,那么这个梯形就成了平行四边形.上下底分别多少厘米 两个同样的梯形上底长23cm下底长27cm高20cm如果把这两个梯形分拼成一个平行四边形平行四边形的面积是多少是练习册上的, 一个三角形从一个角到对边引一条线分成2个三角形,问:有这个三角形共有几个角对边的那个平角算不? 梯形下底是上底的3倍,如果把上底延长8厘米就成了一个平行四边形,梯形的上底和下底是多少厘米 一个平行四边形的一条边是27cm,高是15cm,另一条边是18cm,另一条边上的高是多少? 长16厘米宽10厘米的长方形框架拉成一平行四边形,面积减少16平发厘米,那这平行四边形的高是多少厘米 数学题(等腰三角形的周长为16,底边上的高为4,求等腰三角形的面积) 一个圆周上有9个点,以这9个点为顶点作3个三角形.当这3个三角形无公共顶点且边互不相交时,我们把它称为一种构图,满足这样条件的构图共有______种 把一个面积是81平方厘米的正方形框架拉成一个平行四边形框架,面积减少了4.5平方厘 数学题解答器等腰三角形底边上的高为8周长为32,则三角形的面积为? 平面α外的一侧有一个三角形,三个顶点到α的距离分别是7,9,13.则这个三角形的重心到α的距离为? 材料中的“气球小车”是被怎样推动的 等腰三角形底边上的高为4厘米,周长为16厘米,求三角形的面积 正八边形的中心和顶点共9个点,以其中3个点为顶点的三角形有多少个 从n边形出发,连接其余各顶点,n边形有几个三角形. 在家自己用钢盆电解水,却发现有新物质生成,图中气泡为氢气,那黄色的就是不明物质,我用的水槽在家自己用钢盆电解水,却发现有新物质生成,图中气泡为氢气,那黄色的就是不明物质,我用的 平面上有9个点,以这些点为顶点,能组成多少个三角形 桌上放一个装满水的瓶子,中间有一个气泡,用手推一下瓶子,气泡将会向哪边运动,为什么? 一个梯形,上底长8厘米,如果下底缩短6厘米,则变成一个平行四边形,面积缩小了15平方厘米,梯形面积是C一个梯形,上底长8厘米,如果下底缩短6厘米,则变成一个平行四边形,面积缩小了15平方厘米, 平行四边形的周长是78cm,以CD为底时,它的高是18cm;AC是24cm,求它的面积. 水平放置的小瓶内装有水,其中有气泡,当瓶子从静止状态突然向右运动时,小气泡在瓶内将向何方运动?当瓶子向右匀速运动突然停止时,小气泡在瓶内又将如和运动? 数学题:小红要建一个面积为40平方厘米的三角形纸片,它的一边是10cm,那么它这边上的高是【】? 一个平行四边形的周长是78CM(如图),以CD为底时,它的高是18CM,BC是24CM,求它的面积. 把一个长10cm宽8cm的长方形的框架拉成一个平行四边形这时面积减少了12平方cm平行四边形的高是多少cm用方程解 一个三角形的面积是100平方厘米,已知高是10厘米,则它的底是多少厘米? 一个平行四边形a.b.c.d周长是78cm,c.d作底边,高是18cm,bc长24cm,求梯形的面积? 桌上放一个装满水的瓶子,中间有一个气泡,用手推一下瓶子,气泡将是向前,但是气泡有惯性呀,不是先向原来位置的方向吗拜托,瓶子是横放的 ,气泡在液面 问一道数学题,等腰三角形斜边长为8厘米,因此三角形的面积是多少平方厘米? 一个平行四边形的周长是78CM,以CD为底时,它高是18CM,BC是24CM,求它的面积. 在三角形内一顶点引射线,当引到30条射线时有多少个三角形,规律及公式? 在网格中画出面积是根号10的正方形根号10不是周长 一个平行四边形的周长是78cm(如图),以CD做底时,它的高是18cm,又知BC是4cm,求这个梯形的面积 由三角形的一个顶点向对边引m条线段,可以得到多少个三角形?假设三角形个数为n,请写出n和m之间的关系式. 正方形网格中的每个正方形的边长都是1,以格点为顶点,画出一个三角形,使三边长分别是根号13,根号34,根号45. 一个多边形从一个顶点引出的对角线将它分成9个三角形,它是几边形? 1.三角形的中线是指连接三角形的一个顶点与它的对边的____的线段2.三角形的角平分线是指三角形的一个内角的____ __于对边交点的线段3.三角形的分类:①按___分,可分为______ _______ _______②按__ 将一个装满水静止瓶子向左推动,问水中气泡运动状况水具有惯性,仍保持原来静止的状态,但是既然瓶子已经运动,水怎么可能还会有静止的状态呢?高分悬赏 求解 一个梯形的下底是上底的二分之三倍,下底为18cm,高为10cm,这个梯形的面积 从三角形的一个顶点到它的对边作一条( ),( )之间的线段叫做三角形的高.( )叫做三角形的底. 正方形网格中画一个等腰三角形DEF,是它的腰长为根号5,且他的顶点都在都在格点上,一共可以画几个三角形..注意,彼此不全等 一个梯形的下底是上底的二分之三倍,下底为18cm,高为10cm,这个梯形的面积? 一辆运油的油罐车,油上方有气泡,当气泡突然想后运动时,此时车可能处于什么状态,为什么!要正确的答案, 水平放置的小瓶内装有水,中有气泡当瓶子突然从静止向右加速 则小气泡将如何运动 从九边形一顶点出发做对角线,可做几条对角线?,分成了几个三角形? 三角形的一个顶点到()的()线段叫做三角形的高 在上底18cm,下底30cm,高12cm的梯形中剪下一个最大的平行四边形,剩下的面积是多少平方厘米?列式计算 把一个八变形的一个顶点与其余各定点连接,可把这个八边形分割成几个三角形急!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn