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

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

IndieBros访谈:探寻《2+18+200万》背后的故事 移动周报:生存还是毁灭 HTML5未来路在何方? 开发者的新机遇:微软生态系统打开开源大门 阻碍创新:谷歌、Facebook请求驳回抽象专利概念 Apple专利战分析:战火不停 创新不止 史上最牛独立开发者:花20美元狂赚100万美元 Twitter VS. Instagram:照片分享大战爆发 第二届“龙芯杯”中国开源软件设计大赛圆满落幕 TUP Masters第六期实录:Jeffrey Richter讲解Win8应用开发与.NET4.5 [简讯]Bootstrap 2.2.2发布 官博宣布新特性 我们正处于API的黄金时代吗? 敏捷开发的26条至理名言 12月10日:1815年首位程序员Augusta Ada出生 TOP30+应用排行榜:十一月国内外综合榜单 抱大腿:Square礼品卡服务进驻Passbook 科技创新剑指开源产业 “龙芯杯”破题自主研发 25GPU的Linux集群6小时内破解标准Windows密码 Lady Gaga与大数据的“火花” 手势才是王道:3款应用捕获3个设计灵感 YouTube的挑战者 JustinTV教你如何打造实时视频网站 黑客挟持160万用户密码 抗议联合国监管互联网 Twitter面对危机火速上线照片滤镜产品 Nike推创业孵化器:每个参与团队获2万美金 傲游发布云浏览器 支持跨终端数据同步 12个git实战建议和技巧 用友UAP产品线总设计师史周军访谈录 IE10新功能解析 支持Media Query(图) 单页Web应用或引领下一代Web新趋势? [CTO俱乐部第89期]新时代的前端开发 [多图]160台Mac mini打造的数据中心机架 是谁动了我的CPU! 应该是简单问题,求高手帮忙,100分相送,绝不食言,一下午都没弄出来,太灰心了..... linux下,mysql数据库密码怎么找回?(在线等) 新手求救:关于8086和80386的中断类型号上的冲突? sleep函数 网络难题,跨网段传输 恢复数据库 有谁的信誉分比我低阿!!我送给他50分阿!! 谁能提供一个切实可用的“防止刷新页面重复提交表单”的方法 Web安装项目中的managed.msm和stdole.dll是何东东,何用?? java中字符串操作函数在哪?java中分解字串的函数(如asp中的:split)在哪个类中? 为何ACCESS出现“#已删除的”的记录? 欲交Java良师益友,愿伸援助之手请进。 关于复选框的初始问题(100份在线4:00-8:00 怎样在asp中把一个文件变成临时文件?? 求解奇怪问题,非常奇怪,分不够再加! 高分求IPMI开发资料 如何用Jtree将一个xml文件显示出来? 招聘系统分析员(北京) 深圳兼职电脑维护,哪个有兴趣? 求购 产品进销存源代码 VB or c# +SQL SERVER @@@@@@ 不送分而送现金!!!!! 谁能教我配置PHP服务器啊? 帮我看一下, 紧急求救!!!jsp的出错信息! 如何合并两个Image对象为一个Image对象 还有一个问题,帮帮我嘛! 高分请教高手!简单,看了你也是高手 代码编辑器的问题。 计论:大家都用什么工具进行数据库的比较? 我高中的班主任 请大家评评理,特别是JAVA版版主! 这样的SQL语句怎么写啊 form切换!VB.net里面如何在语句里调出别的FORM 如何用ADO连接EXCEL数据? 什么是上溯造型? 如何把console.write 输出很多内容保存到文件?thread.join()如何使用? 我想实现像网络蚂蚁那样在IE上点右键,把这个IE中的信息传送给我主程序,现在遇到两个问题! 控件的布局问题? 实例化算不算继承? 急!!!!关于SQL数据堵塞 请大家推荐一下哪个汇编集成环境比较好用?DOS下用什么?WIN下用什么? 向各位请教两个tomcat的问题:(谢谢) 高手请问 拉格朗日算法VB=>BCB 求ASP的字符串比较函数. 找C++BUILDER高手!! 我在做演示光盘,用camtasia录制的屏幕图象,可是在客户的机器上播放不出来,在线等待,解决问题马上揭贴! fastreport如何不进行预览而直接打印! 不使用下拉数据窗口,如何实现输入产品代码即可显示产品名称 大哥救命啊 一个简单问题,在一个Win32 applicaion 中如何使用CString变量! 在线等待! 倒霉!!!平白无故被副总扣了100点! 我高中的班主任 一个周长为64厘米的长方形,是由3个完全一样的正方形平成的,求每个正方形的周长 谁能帮我写篇英语作文?作文要求如下:(Direction:Write a short piece of around 150 words about the advantages of bicycling to work.In your writing be sure to include the following points)Bicycling to Work1.lighten the burden on public tra 如图,直线AB,CD与直线EF相交与点P,Q,∠APE=∠CQE,∠APQ=2∠CQE,求∠APQ、∠CQE、∠BPF的度数 用32个一平方厘米的正方形平成长方形,有几种不同的拼法?他们的周长各是多少?列一个表格. 求写英语作文!高奖赏!求写八十字英语作文(初一学生)1.I love shopping2.My favourite international city3.It's fun to fly kites4.Our Life in the future5.We should save electricity6.An Enjoyable School Life 一篇英语作文~不好意思,忘了题材…如果好的会加30分题材:上个星期天,刘老师带我们去附近的公园参加学雷锋做好事的活动。刘老师把我们分成三组,第一组的同学负责植树种花,第二 伤仲永-受之天和受之人怎么理解 蜗牛每分钟爬行七分之三米,二分之一小时可以爬行多远?注意单位(分钟和小时) A我是光明中学的一名学生.B年龄16.C爱好:集邮,滑冰,打网球,旅游等.D理想职业:导游或者英语教师. 《伤仲永》中的“受于天”指什么?“受于人”又指什么,两者有何关系? 什么动物绕家三圈 此较电子辞典与字典的优劣.要求写出你选用的辞典及理由 (伤仲永)受之天也的也是什么意思? 如何应用数学课程标准解决生活中的数学问题? 映射的个数映射f :A→B,如果满足集合B中任意一个元素在A中都有原象,则称为"满射".已知集合A中有4个元素,集合B中有3个元素,那么从A到B的不同满射有多少个? 到处为家的动物有什么 映射个数公式A中有m个元素,B中有n个元素,那么从A到B的映射个数就可以这样算:对于A中的每个元素都可以分别对应B中的每个元素,也就是A中一个元素可以对应B中n个元素,这样一共就可以有n^m 求Owl City的照片清晰 正面侧面无所谓 最好美型一点~ 麻烦看下高中数学小论文要从什么方面写哟? 会的人说下嘛,非常谢谢了耗7 什么动物是家野 Owl city上海演唱会情况.曲目. 麻烦大家看下高中数学小论文要从什么方面写哟?会的人说下嘛, 吃家饭呵野屎 只顾外头是什么动物啊 关于 OWL CITY我以前比较刺激的歌,我听完这个乐队的歌后,我的音乐审美观一下就变了.喜欢他的小清新了.这是怎么回事? 伤仲永里 受之天也 受的意思 (急求)tan(a-3π/2)化简之后等于多少? 风采 风彩两个词的区别 勤家有余指什么动物 as if,seem to区别 风彩飞扬,风采飞扬 求文字功底好的给我区分哈?青春舞动,风彩(采)飞扬,该用哪个cai Can you finish your homework?No,I cna't.It's so d_____ .Can you help me?.填入d字開頭的單詞 as if,seem as区别 柬埔寨,共有几划 伤仲永中的受于天和受与人各指什么? 化简:{sin(2派-α)cos(3派+α)cos3派/2+α}/{sin(-派+α)sin(3派-α)cos(-α-派)} 柬埔寨这三个字怎么读呀```用拼音表示出来谢谢`!``柬埔寨是不是世界上最穷的国家之一呀```那里是不是`都是人妖啊``谁能详细说说啊```那么穷的话为什么人们要出国去那里呀``是不是都是去 真的很急了,本人先在此谢谢给位朋友了7n 请问look as if与seem as if有什么不同? 柬埔寨 这3个共有多少划 伤仲永第三段受于天指什么 受于人又指什么 双手自残家难和 指一 个什么动物 第六题, 伤仲永 怎样认识受之天与受之人的关系 伤仲永中受之天和受之人分贝什么意思? 天梭表什么型号有海拔高度功能 四字词成语,第二同第四个字是一样的.例如:将心比心 特别简单的映射个数问题A集合有m个元素,B集合有n个元素,从A到B的映射个数为什么是n^m个.比如A:{a,b,c} B:{1,2} A中元素到B中元素不是有两种选择吗?那一共应该有2+2+2=6种选择,为什么是8种?求大家 天梭touch怎么调海拔如题,怎么调touch的海拔 问字~一个王字旁,草字头下面一个宝盖在下班一个玉,读什么? 映射数量问题假设集合A中有m个元素,集合B中有n个元素构造A到B的映射求A、B之间映射的数量和一一映射的数量 映射个数. 会的人说下嘛,非常感受大伙了 关于映射个数的题函数f:{1,2,3}→{1,2,3}满足f[f(x)]=f(x),则这样的函数个数共有几个? CQE是什么意思? 会的人说下嘛,非常谢谢了8i 【急】怎么求一一映射个数?如题,设集合A={1,2,3},集合B={a,b,c}那么从集合A到集合B的一一映射个数为( B)A.3 B.6 C.9 D.18 如图.直线AB、CD与直线EF相交于点P,Q.角APE=角CQE\x08,角APQ=2角CQE\x08,求角APQ,CQE,BPF的度数 麻烦大家看下高中数学小论文要从什么方面写哟?会的人说下嘛,非常谢谢了5i 形容头脑不清辨不清方向的成语是什么 直线ab,cd与直线ef相交于点p,q∠ape=∠cqe,∠apq等于2∠cqe,求∠apq,∠cqe,∠bp(急求) 联合国称叙利亚完成对化武生产设施功能叙利亚当局表明愿无条件参加叙问题国际留祥路本月起改叫石祥西路 路牌错了破男硕士年薪5万月花400 穿旧衣相亲男子为救假装落水儿童瘫痪 28年后获美国六大互联网巨头致信国会要求改革监自称21岁大学生 40岁男子男扮女装中央第八巡视组组长:着力发现选人用人杭州13岁姑娘失踪5天 在社会上结识快递哥邱师傅倒在送货路上 同行前去凭绍兴印染温州电镀两个“污染大户”转型温州双岙村遭垃圾围堵 焚烧垃圾引消防爱心的哥贵师傅往返江山衢州送尿毒症患思鑫坊曾是杭城近代建筑代表 如今成无空气污染致癌 波兰向碳排放开刀法缩短我公民办理赴法旅游签证时间“美丽中国”大型图片展在莫斯科举行解决伊核问题需要信任和耐心智利沿海发生6.6级地震 圣地亚哥房尼日尔移民车沙漠抛锚 致90人脱水而人民币设计者:女拖拉机手不是“人民币银行小微产品线日渐成熟百余人体验“没有弯道的传祺世界”巴宝莉CEO明年起改投苹果长泰东郊御园:超高性价比联排别墅错过新一代iPad下周或现身29座污水处理厂提标改造华晨汽车登陆上海金秋八万人汽车节奇迹之车告别莫拉蒂 再见“大国米”“土豪”扎堆房地产中小企业13℃伴大风,今晨冷飕飕韩媒:朝鲜干部子女沉迷韩国电视剧校方称被中伤,照片被移花接木湖群湿地绿野,淀山湖打造水生态环境英国皇家列车将驶入历史定心啦!多名专家围着一人转全国法院七年判处犯罪分子685万余人一批假冒保健食品集中曝光一汽 大众奥迪9月刷新销售纪录美财政“定时炸弹”延至明年?“盛女”小米的美好生活
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘