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

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

汽车巨人福特让“数据”说话 基调数据解读2014网购行业的3大变化 测测:用百度Clouda占卜移动互联网 微软的无奈:或允许Android应用运行于Windows平台 如何选择适合自己的编程语言 Google Now新增语音命令:生活简单一点,让爱更近一点 千万美金收购案:GetJar是一家怎样的公司 传苹果与时代华纳等公司合作,推新一代Apple TV 追本溯源 解析“大数据生态环境”发展现状 为Hadoop存储层增加对OpenStack Swift的支持 详解并行逻辑回归 在AWS上使用GPU实现分布式神经网络 大数据时代,看“小数据”如何支持决策 22人15天研发 微信红包系统发起“珍珠港偷袭”的背后 开发产品防脱节,DevOps来帮忙 手游福音:官方中文版Unity用户手册免费发布 支持多平台!2D和3D游戏引擎Godot宣布开源 从Google备份互联网看“数据安全” NBA全明星周末,数据打造下的辉煌盛事 2014情人节没活动?我们来帮你! Windows 8授权销售已超过2亿份 速度不及Win 7 IDC:2013年第四季度Windows Phone出货量大幅增长 深入思考SDN的核心本质:从SDN=OpenFlow回到软件定义网络 谷歌、VMware在Chromebooks上双赢了,微软你怎么看? Tizen真要来了!又有15家IT大佬成帮会成员 研发周报:开源世界应该致谢的五家公司 Square、LinkedIn、Google... 看国外巨头如何“绑架”用户? 一周消息树:5.5寸屏幕的iPhone 6概念机来袭、索契冬奥会开幕式现Bug 一周热点:美国大学生数学建模分析,Hadoop不是万能,探访雅虎数据中心 Google Play services 4.2全球推送,完全支持Chromecast! 移动周报:最快的Web开发IDE——HBuilder 有没有深层次的c语言书啊?(50分) 请问dbgrid对应的数据表的某个字段为0/1,可以把其cell显示为checkbox? 什么是3D加速卡? 请教NotesFactory问题,那里有资料 developer2000的疑惑 一个小问题,请给我看看! 是读软件工程硕士还是去当程序员? 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 请问这是什么错误?谁能帮我翻译一下。最好给出解决方法。对者给分!...在线等待! 紧急求助:关于打印的问题 如何用C#在ASP.net中对数据库进行查询? 网络打印问题 【求助】一个小问题,在线待回 DBGrid1如何获得2个表里的数据 帮帮菜鸟呀`/! 如何用C#在ASP.net中对数据库进行查询? 求获取FTP服务器上文件的创建日期的代码 系统已经从一个严重错误中恢复。 怎样使一个页面访问过后立即过期? and 和 or 有什么不同??? 关于oracle 配置的问题 Oracle数据库实例和数据文件的问题求助 调查:各位用Lotus开发的时候,对源码如何做版本控制的?效果如何? 请问各位高手现在业界对工作流与电子工单有没有统一的标准? 动态生成STATIC 文本框,把里面的文字都加上下划线,怎么做? 有什么好的类似于QQ的局域网通讯程序???可支持WIN98及WINXP间的通讯!!! 我快晕了,急救! 低手勿入,高手请进,剧难??? 一个程序调试中产生的问题 -------数据接收和发送模式的问题!(非资深程序员勿入)100分只给答的最好的 求救!关于坐标系转换问题 现在很多邮件服务器要身份验证,ASP.NET(C#)的SMTPMAIL类有设置身份验证和密码的属性吗? 怎么在基于对话框的程序中加入一幅bmp作为底图? 刚学java,碰到一问题,请 有空进来看看 showMessageDialog的使用问题 disable mainmenu控件的某个subitem怎样实现 哈哈,需要短信网关IP地址及其源代码的快来顶一下。 sybase12.0安装时的问题??? 怎么样能用asp编写使得IE打开pdf文件?在查询后怎样还能在查询的输入框里面保留查询的输入? 如何使用TreeView进行分级管理 触发器的效率问题! 寻求解决方案 组件刷新问题,UP有分 请问 虚拟目录 和 WEB站点 有什么区别? DBEXPRESS的问题!很简单 请问那里有支持中文好的jsp开发的webmail下载?很急!谢谢大家了! 我如何在程序中切换输入法 怎么把一个COleDateTime类型的变量转成time_t类型(long型)变量? 结构成员这样定义 WCHAR bString[0]; 长度为0有意义吗? 关于DLL中的函数 如何动态分配指针数组? 农民常用盐水来选种,当把种子放入盐水中时,所有种子都未浮起,为使不饱满的种子浮起,应当加盐还是加水?为什么? 英语翻译Present to the responsible European committee any enquiries on the interpretation,or proposals for change,and keep the UK interests informed.尤其是keep the UK interests informed这部分怎么解释,什么语法点啊 捷尔任斯克 切尔诺贝利 英文是什么?乌克兰的切尔诺贝利、 俄罗斯的捷尔任斯克的英文是什么呀?求助求助! 常温常压下8g氧气含有的电子数 脱水筛都可以用在哪些行业?有什么特点啊? 家里浇花用的手压式压力喷壶,如果打足了气其内部压力最大能达到多少个大气压? 司南为什么要做成勺型? 下列物质不能由金属与酸发生置换反应而得到的是 A、氯化铜 B、硫酸锌 C、氯化亚铁 D、硫酸镁 1151测气压 引压管有水会有什么影响 当司南的磁勺在指盘上停止转动指向南的是? 有什么办法能一个鸡蛋从四楼掉下来不碎 乌克兰的英文怎么写 怎样可以更好的学化学?更容易书写化学? Fe2+,NH4+,Cl-,Ba2+是否共存再加入NaOH发生什么现象? Hcl+盐=新盐+新酸,举两个例子, 亚硫酸铵与二氧化硫反应生成亚硫酸氢铵化学方程式 用玻璃的泡菜坛来泡酒, Hcl为什么叫盐酸?他是属于盐还是属于酸也不是金属阳离子和酸根阴离子的化合物吧?为啥叫盐酸呢 丁达尔效应是什么变化? 重庆哪里有玻璃泡菜坛卖重庆主城区哪里有玻璃泡菜坛卖,不喜欢那种陶瓷的,商场也没有玻璃泡菜坛,请知道的告诉下,最好是渝中区、沙坪坝的地方,太远了不方便啦~ 求教:DMEM细胞培养,只在中央一片生长良好,四周几乎不生长,贴壁也少,怎么回事啊?DMEM细胞培养,只在中央一片生长良好,四周几乎不生长,贴壁也少,怎么回事啊?另外,生长液在培养过程中,慢慢变 防毒面具有几种防有机农药的防毒面具有什么 桃源村附近哪里有卖泡菜坛?最好是玻璃,可以直观看到菜的变化. 为什么说喝蒸馏水不好?如题 纳投入到硫酸铜的现象及化学方程式 共价键与离子键有什么不同?请你举例说明.重点区别在带相反电荷离子间作用和原子间共用电子对的作用 2004年乌克兰参加欧锦赛时用的那首歌的歌名叫什么?是乌克兰语和英语的那首歌 在磁体内部放一个指南针,指南针的南北极指向哪里? 初中物理应该注意甚么 经过过滤的水是去离子水吗?我们公司有个过滤普通水后的水就直接喝机器,我想知道这些水是去离子水吗? 当指南针指南针指向南的一端是磁体的——极,指向北的一段是磁体的——级 注意要举例,举例!举例说明声源的振幅与频率主要影响乐音的哪些特性?注意是举例 木材的湿度要测量木材的温湿度,木材的种类也蛮多的所以希望温湿度计可以测量的木材种类也可以顾及是那仪牌子的那仪款好,可以的话给个联系方式吧 磁场强度达0.134T能吸起几根铁钉阿尔法磁谱仪中心磁场为0.134T,是地磁场的2800倍,我觉得这个概念有点.谁告诉我能吸起几根铁钉? 记忆细胞能特异性识别抗原 吞噬细胞能识别抗原,但不能特异性识别抗原. 口腔中的唾液淀粉酶遇高温会失去活性,这是因为高温破坏酶的什么?A.氨基酸 B.肽键 C.肽链 D.空间结构原因 T细胞和B细胞可以特异性识别抗原吗? 甲基绿、吡罗红染色观察DNA或RNA的实验染色时间过短或过长有什么影响?观察DNA与RNA的实验中要用到甲基绿与吡罗红.那么染色时间过短或过长对结果有什么影响? 氧化氮的化学式是什么 怎样清除炒菜锅里塑料的残留物前几天炒菜,在锅里倒上油就忘了.想起来的时候看见锅里的油着起了火,把油烟机下面接油的塑料盒给化了,掉在了锅里,完了锅里的塑料就一直弄不了,用了各个 为什么我以前买的高锰酸钾是紫色,这次买的是墨绿色,我把它们一部分混在一起了 氢氧化氮的化学式是N2OH吗?如果不是,那么N2OH是什么物质呢? 如何去除玻璃上的一些塑料物质,这个物质是照片撕下的残留物,该怎么清洗?RT.朋友那转了个鱼缸,他在鱼缸背面贴了俩照片,做景,我撕下来以后,照片正面的的一部分贴在了鱼缸上,洗了半天才 高锰酸钾中加入氢氧化钠,置于空气中,墨绿色,并出现褐色沉淀.不久,墨绿色退去,成淡红色.求原因及反应方程式. 氧化氮化学式中氧的化合价当N的化合价为+5时,氧化氮的化学式是什么, 二氧化硅为什么不溶于水不应该相似想溶吗? 氢氧化钠与高锰酸钾混合为什么变墨绿色,再跟三价的锑和铋离子反应 DNA的羟基末端称为图中所示的羟基端为在遗传病及刑侦破案中常需要对样品DNA进行分析,PCR技术能快速扩增DNA片段,在几个小时内复制出上百万份的DNA拷贝,有效地解决了因为样品中DNA含量太低 氧化氮化学式中氮的化合价? 黄色卷尾鼠彼此杂交,子代的表现型及比例为:6/12 黄色卷尾,2/12 黄色正常尾,3/1黄色卷尾鼠彼此杂交,子代的表现型及比例为:6/12 黄色卷尾、2/12 黄色正常尾、 3/12 鼠色卷尾、1/12 鼠色正常尾.上 在5%氢氟酸和15%硝酸混合液中、常温常压下选用哪种钢材最耐蚀? 是不对于非大脑为处理中枢的情况下是不是就只有1%被身体器官处理呢99%被丢了呢? 切尔诺贝利英文?请问这个镇的英文单词怎么拼?我找了好久 磁场强度的简称为什么是H?磁通密度的简称为什么是B? 99填上与人体器官想关的字.1,—开—绽 2,—枪—剑 3,—蜜—剑 4,—重—轻 切尔诺贝利的英文表达 调质钢在常温状态下的组织形态是回火索氏体还是珠光体?就拿45调质钢来说. 人体发育最早最快的器官是大脑还是神经系统 切尔诺贝利用英语怎么说 北海舰队某潜艇基地:中国海军“杀手锏北京今晨现雾霾空气质量差 以中、重度日欲解禁武器出口 妄图“一箭三雕”德将派高官赴美“讨说法” 德巴联大携美国安局否认网站被黑查尔斯的阿Q精神?判断是否对iPad上瘾7方法最高层着手\"顶层设计\" 中国周边分析称安倍推保密法系为自卫队海外行动河北唐山凌晨发生3.3级地震 与76吉林办公厅:厅级以下干部出差不得走贵弱冷空气影响中国东北华北 西南地区多北京香山遭10万人“挤爆” 早上7点香山景区乱象频现:厕所男女混用 柿子美华人开厕所餐厅:桌椅是马桶 卤肉饭报告称中国留学生美国名校退学率达25美国海军基地发生枪击案 两人受伤凶手英国乔治小王子接受洗礼 现“豪华”皇美媒:中美日竞争转向拼经济 争亚洲“杭拟规定新建公园或学校操场修地下车库李肇星:最近去曾母暗沙宣示主权 泡了“最佳留言”出自22岁小伙之手外储逼近4万亿美元我省优秀舞台剧北京展演廉政手册公安部公布举报投诉方式基层风采广受市民赞誉露天电影社区送清凉距俄罗斯世界杯开赛还有1425天木马病毒伪装二维码 淘宝商家损失4万巢湖水污染防治不力 或被开除公职警方突袭赌博机房 有人拉下电闸欲趁乱开发商疏忽没有注销房产证 40多拆迁合肥兴起水下艺术摄影 不会游泳别轻易合肥房地产“半年报”出炉 住宅均价破省城长江路桥露新颜 暂时无法放行志愿者马永红:现在的我学会了妥协(图981钻井平台将转场至海南岛陵水项目单位使用派遣员工有了“紧箍咒“ 不得今夏最强降雨昨日洗刷申城 明起步入晴上海高招已录取近7000人 一本录取
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘