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

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

代价究竟高不高,苹果为什么要在Android专利诉讼上花费2亿美元? 产品与设计专题论坛(下):App之美 产品与设计专题论坛(上):扁平还是拟物?产品说了算! 首届移动娱乐游戏峰会:中外手游的交锋与对抗(下) 研发人员超过500,基金会金牌会员,华为豪赌OpenStack New way of thinking:索尼SmartWatch 2应用开发马拉松大赛圆满结束 离了你地球照样转,谷歌地图并非苹果的必需品 面试必备的9大成功秘诀 Chuck Goldman:乔布斯从来不会说苹果不是企业应用的公司 全球最大的图片社交分享网站Pinterest发布首个API UX设计程序的五个谬论 研发周报:2013年美国开发者薪资调查报告 【开源推荐】PredictionIO:构建预测功能的机器学习服务器 只需4步 百度SiteApp助力京华网移动版落地 Windows Azure开放公测5个月的收获 RDS添加PostgreSQL支持 几家欢喜几家忧 首届智能硬件峰会:解读硬件创业机遇与挑战(下) 平台与技术专题论坛(二):游戏开发实践分享及IE11新体验 看Twitter上市后的入职面试题 六届中国大数据技术大会PPT精粹(三) AMD推多款异构计算开发工具 着力打造APU软件生态系统 Ceylon 1.0发布:又一个“Java语言替代品”? HTML5开发工具:英特尔XDK New 苹果公司为何“情系”PrimeSense 微App专场:不同平台下微App开发运营那些事 25载工程经验,HBase七年——BDTC2013讲师Michael Stack 或许对你创业有所启示:10个英国快速增长的科技创业公司 小米游戏中心10月报告:分析各种手游活动之优劣 欢网王智勇:传统电视厂商须补互联网基因 透露与百度合作细节 支付宝声波支付之初体验 首款使用HSA架构的Kaveri APU、多款异构计算开发工具APU13上齐亮相 请问使用STL如何将字符串变成大写 OOAD 我对这段代码很困惑!!不知为何出错,请大虾指点一二!!! SQL Server数据库中支持的数据表的最大数是多少? 有会用SDL(Simple DirectMedia Layer)的么? 如何重新启动电脑啊 ooad 有人对xml文档及schema映射为数据库的记录和表作过研究吗? 窗体启动时,Load之后是什么事件 安装好了J2EESDK1。4后怎样运行JAVA程序? 有关DBGrid的问题 IBM的硬盘是不是很菜!惨啊!奉劝大家多多备份,不要买IBM的盘 合格的程序员应该具备哪些知识和技能? 在报表中如何显示出来----共n页/第几页 急寻广州深圳两地图书城管理软件公司 用jdk写出的application里的汉字很难看,有没有解决的办法? 面向对象分析与设计 那位有<<java大学教程>>的光盘,可不可以把光盘上的附录部分发给我!(100分) 关于win2000中的odbc的问题 vfw 软件工程师和程序员有什么不同? 一方有难,八方支援,我有疑难,你能否来? 唉。 发现有人还在吃糠。。。。痛心ing.............. 为什么我连不到mysql? 有什么比做ghost更好的硬盘数据备份方法? 请教:在dataGrid 中如何根据行值的不同,设置不同的颜色 一般菜的问题,不知道你遇到过没有,请大家过来看一下 分析与设计 3D場景鋸齒消除問題 一方有难,八方支援,我有疑难,你能否来? 发布新软件,请帮助测试 一个白痴问题!哪个函数可以去除字符串中的空格? 在两台服务器上的数据库间创建触发器的注意事项? 有一好的想法,但途中这个问题搞不定 各位高手,请问用API怎样获得本机的网卡的IP地址 面向对象ooad 有没有类似deltree功能的函数啊? weblogic初级问题 小问题, 如何把个DBIMAGE里的图片复制到剪贴板里去?? 如何正确更新ADO的记录 分全给出,各位大侠看一看为什么动态库中的窗体调不出来:。。。。 更佳编程之路(转贴) 菜鸟问什么是水晶报表? 我的第一次发问? 集思广益整理一下有关类型转换的函数!(出力的都有分!!!不够再加!!) 有高分!有高分!有高分!有高分! 大家都用什么工具来做J2ME开发?调查一下!!! 急!sql server中的数据备份我在用程序操作,应如何写那(在deplhi中) msdn的提问~~~ datagrid的滚动条上下滚动的事件是什么阿? OOAD提示 刚结束的一道中考物理题弹古筝时,演奏者的另一只手不断变换按弦的位置,这是为了改变弦发声时的A振幅B响度C音色D音调因为答案有分歧,所以希望你们给出答案时给个解释,我加10分 1 下列说法正确的是:A 匀速圆周运动是一种匀变速曲线运动B 向心力加速度描述线速度变化的快慢C 航天飞机中的物体处于失重状态,是因为地球对它的吸引力全部用来提供向心力D 做圆周运动 全站仪水平度盘不动,转动望远镜水平读数为什么变化? 室内要替换60W的白炽灯用多少的节能灯 低碳生活是指什么 全站仪引点时坐标读数是错的是什么问题?测站点和后视点都没有错.就是照准好了以后对中棱镜测点得出的坐标读数是错的.是不是全站仪坏了?有哪个见到这样的问题? 第二题,解方程, 22.单项选择( )22.---Are his pens ____________ desk?---Yes,____________ are.A.on his,it B.on my,you C.on his,they D.his,it’s 7x-x^2=10 x=? 5、如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒PQ,MN,当PQ在外力的作用下运动时,MN在磁场力作用下向右运动,则PQ所做的运动可能是 A.向右匀加速运动 B.向左匀加速运动C.向 2012 年2月10号星期五下的雪周记 急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急 10-7x=x+2 如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒PQ,MN,MN的左边有一闭合如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒PQ、MN,MN的左边有一闭合电路,当PQ在外力作用下 关于雪的周记!明天就交了, 利用因式分解计算如何算?(1-1/2^2)×(1-1/3^2)×………………x(1-1/2013^2) 例、如图所示,水平放置的两条光滑轨道上有可自由移动的金属棒 PQ 、 MN ,当 PQ 在外力作用下运动时,MN 在磁场力的作用下向右运动,则 PQ 所做的运动可能是( BC )A .向右加速运动B .向左加 周记怎么写啊?急 怎么算因式分解 现有甲“220伏100瓦”、乙“110伏100瓦”、丙“36伏100瓦”三个灯泡,分别在额定电压下工作哪个灯最亮 谁能给一篇关于校园的周记!400字左右的! 帮我算一下.因式分解 四年级上册简算60 全站仪坐标放样要分盘左盘右吗? 铝粉的主要用途是什么? 四年级上册简算1390-390÷15怎样算? 中纬全站仪的盘左盘右怎么判断 色漆中铝粉的作用是什么? 如图所示,电源电动势为12V,内电阻为1 Ω ,R1=3 Ω ,R2=2 Ω ,R3=4 Ω ,C1=4µF,C2=1µF ,则C1所带电量为多少C,C2所带电量为多少C. 已知在10只产品中有2只次品,在其中取两次,每次任取一只,作不放回抽样求下列事件的概率:2只都是正品.一只是正品,一只是次品.第2次取出的是次品.是用排列还是组合啊. 铝粉用途 C5H12 是什么东西啊 它的碳原子可能共面么 【考试在线】有10件产品,其中有2件次品,每次抽取1件检验,抽检后不放回,共抽2次.求下列事件的概率问题一,两次抽到的都是正品问题二,第一次抽到正品,第二次抽到次品问题三,抽到的恰有一 铝粉主要有哪些?用途是什么 低碳生活是指什么啊? 在10件产品中有2件次品,现从中无返回抽取3件,计算下列事件的概率:(1)恰有2件正品 (2)含有次品 牛的头数比羊的只数多25%,羊的只数比牛的头数少百分之几?要用方程法,要有算式、过程、结果. C5H12的碳原子为什么不共面我知道每个CH3是空间正四面体,但C原子可以共面啊 正戊烷分子中的5个C原子是可以共面吗?我们老师说不能。 雪的周记500字 两个乘积的3/1是-6,其中一个数是-4的绝对值的八倍,求另一个数. C5H12的碳原子是否在同一平面内 帮我写周记给分不要写雪 世界上到底有没有鬼这类的东西啊 有太多无法解释的事了! 英语 单项选择 (31 20:10:12)The rain was ____ heavy ____Cindy had to stop to buy an umbrella.A.too toB.so thatC.such thatD.as as选哪个?为什么? 上海市奉贤中学我能上吗?我现在户口在浦东新区,我妈妈想把我的户口迁到奉贤青村镇,我在长岛中学读初二,排名在年级前十左右(100分的卷子四门平均92左右,数学大概95左右)古筝7级,女,我 解方程组2x+3y=240 x+2y=150, al最高价氧化物的水化物是什么?(请写出方程式) “自从我上中学以后‘’用英语怎么表达 '奇妙'是什么意思了 碘的最高价氧化物对应的水化物分子式是什么 中学同学用英文怎么说啊?美国人真是的! “很神奇”有什么特别的意思? 英语 英语的烦恼 (27 20:12:5)我什么英语成绩提不高  英语翻译 求1.2.3. 最高价氧化物的水化物中,酸性最强的化合物的分子式是什么,名称是什么? 英语翻译 一列火车在平面的铁轨上行驶,由于遇到紧急情况,火车以速度v(t)=5-t+55/(1+t)紧急刹车至停止.求 (1一列火车在平面的铁轨上行驶,由于遇到紧急情况,火车以速度v(t)=5-t+55/(1+t)紧急刹 一道中考物理题如图16所示,甲是小艳利用某透镜观察到的小明眼睛的像;乙是小亮利用某眼镜观察到的课本上“物理”字的像.关于上述两种情况中所观察到的像或用到的光学仪器,下列说法 Al的最高价氧化物与cl的最高价氧化物的水化物反应式急,请速回要离子方程式 =IF(ISNA(VLOOKUP($A$1,订单台帐!$A:$U,12,FALSE))," ",(VLOOKUP($A$1,订单台帐!$A:$U,12,FALSE)))详细的解释三个函数(IF,ISNA,VLOOKUP),它们各自的公式、意思及整体的意思.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘