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

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

【最具价值CTO评选秀】途家美女CTO杨孟彤:不创业会后悔 2014腾讯WE大会:开启未来的五大科技发展趋势 TIOBE 2014年11月编程语言排行榜:R受大数据影响跃至12位 深圳微信开发者大会全部议程出炉 最后仅剩30个参会名额 智能硬件:一半海水,一半火焰 聚焦SDN、NFV、云安全基础架构等技术热点 2014云安全联盟高峰论坛即将召开 富Web应用开发的七大原则 应用原型设计毫无压力!开源Sketch插件管理器Sketch Toolbox 【MDCC专访】友盟副总裁焦岳:从36万款App,看今年的热门领域 一切只为经典 微信开发者大会前瞻(附议程) 从手势识别到增强现实,开发实感应用该了解的技术细节 福利来了,爱拍原创免费为iOS版手游制作宣传视频 【工具推荐】Zrender——轻量级Canvas类库,让绘图大不同! 基于Docker和CoreOS的开源PaaS平台——Deis v1.0正式发布! 微软宣布.NET开发环境开源 支持三大操作系统 爆发吧,诺基亚!前员工开发物联网新设备 详解Visual Studio Emulator for Android,微软的Mobile First! HPC China 2014完美落幕,AMD Firepro荣获好评! 揭秘微软的Container技术之一Drawbridge AWS副总裁谈数据中心网络打造 【最具价值CTO评选秀】出门问问CTO雷欣:从技术极客到核心管理的秘密 《近匠》APICloud:“云”+“端”一体的移动API提供者 Oculus移动SDK发布!John Carmack操刀、集成Unity 4.5 11月15日深圳见!深圳微信开发者大会公布全部议程 参与2014中国大数据行业大调查 BDTC门票等你拿 HTML5规范尘埃落定,5个开发工具推荐 盘点最受开发者喜爱的Android 5.0 Lollipop API IoE Day侧记:想开发智能硬件?先要弄明白这几个问题 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(二) 微软承诺所有Lumia WP8设备将升级至Win10,用户会买账吗? 周末,深圳微信开发者大会等您来!(参会必读+名单) 欢迎大家来! 急!如何在一个form窗体里面来移动线条,就象类似于画基本的电路图那样,谢谢高手的指教!!! 哪儿有<<新编计算机绘图>>下载啊? 给高分 急!如何在一个form窗体里面来移动线条,就象类似于画基本的电路图那样,谢谢高手的指教!!! 可以用网页文件重新启动机器吗? 高手请看看!!!如何用ATL创建一个全局COM(只启动一个实例)供所有客户端使用? 哪里能下载到vs.net正式版?(100分) pascal 谁知道有没有创建Service的好工具? 谁来介绍一下CORBA ? 请教ODBC SQL中 CONVERT的用法? 笔记本电脑开不了机!!!! 关于ClientDataSet SQL动态参数的问题? 关于在PB的script中直接嵌入SQL 单机使用什么数据库最好! 怎么远程启动一个程序? 一个XSLT的小问题 C++Builder高手回答!!(关于在NOVELL上的应用) 急!请问哪位高手知道怎么用VB来开发组态软件。请多提提建议! 大家好!~新人来了!~ 如何实现MicroHelp即状态栏的分段 麻烦各位介绍几个有SCJP模拟题的网址!谢谢!!!! 关于Read&Data! 现在只能显示最新的120篇,能不能家多点呀,例如最新1000篇? VS.net哪里有正式版的下载呀?大侠们有没有地址呀? 谁能告诉我哪儿有TR下载,不是TRW,谢谢!50分相送~ 求助!!急!急!…… console下可以用ado访问sql server数据库马? 诸位仁兄,帮小弟推荐一本学J2EE的书。 DataModule4.ClientDataSet1.Locate的问题求救! NetLocalGroupEnum 如何使用列举远程用户 谁有有关游戏开发方面的软件工程文章? 各位大虾有无利用VC打开JPEG(JPG)图像并显示的源代码? 有关单文档多视图的一个小问题,答出有100分可拿!!! 如何优化编译,让编译后的文件最小? 请问软件是vfp3.0写的但是现在只有6.0,能转换么?是否需要重新编译?怎么编译,谢谢 vs.net 在PHP中如何把E_MAIL同时发给两个人? 有关注册表和其他一些问题 正版的vs。net几张盘? 有rtlinux的RCS库开发经验的朋友们 ACCESS能够,为什么SQL SERVER却不能?? 怎样生成新窗口? 有一个按扭,点一下后运行别的exe文件,代码怎么编啊? 请教各位大虾,有关带串口的数码相机的咨询! 有一个按扭,点一下后运行别的exe文件,代码怎么编啊?另外,点一个按扭,使c;\file1的文件,拷贝到d;\file2 有rtlinux的RCS库开发经验的朋友们 100分呀,还有挑战性,一个有点难度的问题,再网格控间上如何添加事件!!! 回答问题有钱给...用ATL创建一个全局COM(只启动一个实例)供所有客户端使用 无助,真喜欢一位小姐(不是那个‘小姐’别误会)真太想知道她有没有男友了,请问有什么办法知道么? 我能过高程么 如何控制和预防尾气污染? 真菌的概念是什么?和细菌如何区分? 做汽车尾气治理要花多长时间 亚硫酸钠吸收二氧化硫的离子方程式 真菌和细菌的定义及区别及其此两类包含的各种生物 汽车尾气应该怎样治理? 亚硫酸钠通入二氧化硫的方程式 冬天静电很多,经常触电怎么办? 如何处理汽车尾气 常温下,在27.5g水中溶解CuSo4.5H2o,恰好打到饱和,改溶液密度为1.21g/cm^3(1)该溶液仲阴阳离子的总物质的量(2)该溶液中CuSo4的物质的量浓度(3)取出20.0ml该溶液,配制成1.00mol/L的稀溶液,则稀 冬天时我的手碰到金属竟然有触电的感觉,希望哪位朋友能解释一下为什么会这样 汽车尾气的危害与治理 你有 这个的中文吗 为机油添加各种添加剂有必要吗? 为什么冬天摸到金属的水龙头会触电? 当物距为15cm,像距为多少时,成的是倒立放大的实像?答案是30cm,为什么?请进行分析, 钢铁厂用到的 接近开关和光电开关有哪一些?具体点的,大哥,你这说的很笼统我也知道也多 现在中国投入生产的煤化工企业都有哪些! 监控摄像头拍照时,几乎看不见车内的人,但车的外表很清晰,是因为车内的人的反射的光太___ ,摄像头几乎无法成像.夜晚,为了不影响司机开车,车内的灯应该____. 接近开关和光电开关的功能区别在哪大神们帮帮忙 中国的煤化工企业有哪些 一物体放在凸透镜前30厘米处,在凸透镜另一侧的光屏上成一个缩小的像,如果透镜的焦距为10厘米,则光屏的位置离透镜的距离是在_________之间. 光电开关和接近开关的哪个牌子好用设备来回频繁,我用着光电开关经常失灵,因为环境有点脏. 求教煤化工行业里甲醇制烯烃的副产品碳四的综合利用方法? Fe与Al2O3化学方程式好像生成Al,……具体是什么? 金属门上的静电如何消除 为什么汽车在冬天的时候会有很大的静电 常温下,在27.5g水中溶解12.5gCuSO4•5H2O(式量250),恰好达到饱和,该溶液密度为1.21g/cm3,求:1.该溶液中CuSO4的物质的量浓度 2.取出20.0ml该溶液,配制成1.00mol/L的稀溶液,则稀释后溶液的体积是多 如何用接近开关代替行程开关控制小车往返运动? 冬天怎么样才能减少静电啊? 关于凸透镜小明的妈妈买了一件商品,回家后发现说明书上的字像蚂蚁一样小,看不清,家里又没有放大镜.小明想了想,很快就帮妈妈解决了这一问题,你知道小明是怎样做的吗?(北师大版八年级 胆矾溶液的化学式 焦亚硫酸钠露置在空气中会发生什么反应?会生成二氧化硫吗?最好写出化学反应方程式, 二氧化硫和氨水反应生成亚硫酸氨方程式怎么写同题 电动机中的换向器是干吗的? 常温下在27.5克水中溶解CUSO4·5H2O,恰好达到饱和,该肉也密度为1.21g/cm3,求:1.该溶液中阴阳离子的总物质的量?2.该溶液中CUSO4的物质的量浓度?3.取出30.0ML该溶液,配浓度为1.00MOL/L的稀溶液,则稀释 二氧化硫如何反应生成亚硫酸根? 真菌,病毒,细菌和原生动物的外形和特征...那个是小学5年级的科学,关于微生物的...有的话,请附上照片...谢谢... CO(g)+2H2(g)可逆CH3OH(g)保持温度和密闭容器容积不变,再充入1molCO和2molH2,再次达到平衡时n(CH3OH)/n(CO)会减小, 亚硫酸钠与酸反应生成二氧化硫的反应方程式如果可以的化顺便告诉我一下二氧化硫与氢气反应生成硫酸的反应方程式浓硫酸加热反应生成二氧化硫的反应方程式 什么电机才用换向器 润滑油的作用 甲醇期货上市,想请问下甲醇主要相关的行业或是上下游涉及到的一些产品是什么另:看最近甲醇价格变化幅度有点大哦, 交流电机内部换向器干什么的 和直流电机内部的换向器 27.5g水中溶解12.5g Cuso4*5H20 恰好达到饱和.该溶液密度为1.21g/cm3 求该...27.5g水中溶解12.5g Cuso4*5H20 恰好达到饱和.该溶液密度为1.21g/cm3 求该溶液中cuso4 的物质的量的浓度 请问!燃料甲醇跟普通的工业甲醇有区别么?如果有,区别在哪里? 氧化铝和稀硫酸反应的方程式注意:是氧化铝不是铝 三氧化二铝可以通过分解反应制得吗? 汽车尾气的治理及再利用 关于稀硫酸和氧化铝反应的问题1、稀硫酸能和氧化铝反应吗?2、好像氧化铝易溶于酸溶液中,那么就可以溶于稀硫酸中了,是吗? 三氧化二铝如何制得 汽车尾气检测不过,用燃油优化剂可行吗? 氧化铝和稀硫酸反应生成什么? 为什么氧化铝的反应 ,总是强调“新制”? 急 在CO (g) +2H2 (g) ≈ CH3OH (g) 的反应中,在CO (g) +2H2 (g) ≈ CH3OH (g) 的反应中,若在一个500ml密闭容器中盛有5molH2和2molCO,经过5s达到平衡,此时CH3OH 蒸汽的浓度为2mol/l则 求h2的反应速率求co的转化率 下列说法是细菌.真菌和病毒的共同特征的是 二氧化硫与亚硫酸纳反应的化学方程式是什么啊 甲醇蒸汽重整法中反应CH3OH(g)==CO(g)+2H2(g)能自发进行的原因是什么? 1:CaC2和ZnC2、Al4C3、Mg2C3、Li2C2等都属于离子型化合物.请通过CaC2制C2H2的反应进行思考,从中得到必要的启示,判断下列反应产物正确的是( ).A:ZnC2水解生成乙烷(C2H6) B:Al4C3水解生成丙炔 亚硫酸反应生成二氧化硫的方程 润滑油中添加剂用处很大 ,这种说法对么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘