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

Delphi拖放编程(1)

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

拖放(DragDrop)是Windows提供的一种快捷的操作方式。作为基于Windows的开发工具,Delphi同样支持拖放操作,而且开发应用系统的拖放功能十分方便,真正体现了Delphi 的强大功能和方便性。

Delphi提供的所有控件(Control,即能获得输入焦点的部件)都支持拖放操作,并有相应的拖放属性、拖放事件和拖放方法。下面我们先介绍控件的拖放支持,而后再给出开发拖放操作的一般步骤和应用实例。

9.1 控件的拖放支持

拖放操作中控件可以分为源控件和目标控件两类。绝大部分控件既可以作为源控件也可以作为目标控件。但也有一部分控件只能支持其中的一种。

9.1.1拖放属性

拖放属性主要有两个:

●DragMode:拖动模式

●DragCursor:拖动光标

它们都是在拖放的源控件中设置。DragMode控制用户在运行时间内当在控件上按下鼠标时控件如何反应。如果DragMode置为dmAutomatic,那么当用户在控件上按下鼠标时拖动自动开始;如果DragMode置为dmManual(这是缺省值),则将通过处理鼠标事件来判断一个拖动是否可以开始。

DragCursor用于选择拖动时显示的光标,缺省值是CrDrag,一般不要去修改它。在程序设计过程中通用的界面规范应该得到开发者的尊重。但有时候为了特定的目的,开发者也可以把自己设计的光标赋给DragCursor。

9.1.2拖放事件

拖放事件主要有三个:

●OnDragOver:拖动经过时激发

●OnDragDrop:拖动放下时激发

●OnEndDrop:拖动结束时激发

前两个事件由目标控件响应,后一个事件由源控件响应。

OnDragOver事件最主要的功能是确定当用户就地放下拖动时控件是否可以接受。它的参数包括:

Source:TObject; {源控件} X,Y:Integer; {光标位置} State:TDragState;{拖动状态} var Accept:Boolean {能否接受}

TDragState是一个枚举类型,表示拖放项目与目标控件的关系。

type TDragState = (dsDragEnter

dsDragLeave

dsDragMove);

不同取值的意义如下表:

表9.1 DragState的取值与意义

━━━━━━━━━━━━━━━━━━━━━━━━━━━

取值意义

───────────────────────────

dsDragEnter拖动对象进入一个允许拖动对象放的控件中。为缺省状态。

dsDragLeave拖动对象离开一个允许拖动对象放下的控件。

dsDragMove拖动对象在一个允许拖动对象放下的控件内移动。

━━━━━━━━━━━━━━━━━━━━━━━━━━━

用户可以利用提供的参数来确定放下的拖动是否可被接受,如:

●判断源控件类型:

Accept := Source is TLabel;

●判断源控件对象:

Accept := (Source = TabSet1);

●判断光标位置:

见(9.2)

(9.3)中的例程。

●判断拖动状态:

If (Source is TLabel) and (State = dsDragMove) then

begin source.DragIcon := ' New.Ico '; Accept := True;

end

else

Accept := False;

当Accept=True时,目标控件可以响应OnDragDrop事件,用于确定拖动被放下后程序如何进行处理。

OnDragDrop事件处理过程的参数包括源控件和光标位置。这些信息可用于处理方式的确定。

OnEndDrag事件是在拖动操作结束后由源控件来进行响应的,用于源控件进行相应的处理。拖动操作结束既包括拖动放下被接受,也包括用户在一个不能接受放下的控件上释放了鼠标。该事件处理过程的参数包括目标控件(Target)和放下位置的坐标。如果Target=nil

表示拖动项目没有被任何控件接受。

在第3节将介绍的文件拖放移动、拖放拷贝操作中,如果操作成功,则文件列表框应更新显示内容。下面这段程序用于实现这一功能。

procedure TFMForm.FileListEndDrag(Sender

Target: TObject; X

Y: Integer);

begin

if Target <> nil then FileList.Update;

end;

除以上介绍的三个事件外,还有一个事件OnMouseDown也常用于拖放操作的响应。

OnMouseDown虽然不是一个专门的拖放事件,但在人工模式下拖动的开始是在这一事件的处理过程中实现的。

9.1.3拖放方法

拖放方法有三个:

●BeginDrag:人工方式下开始一个拖动

●EndDrag:

结束一个拖动

●Dragging:判断一个控件是否正被拖动

这三个方法都被源控件使用。

当DragMode置为dmManual时,拖动必须调用控件的BeginDrag方法才能开始。

BeginDrag有一个布尔参数Immediate。如果输入参数为True,拖动立即开始,光标改变到DragCursor的设置。如果输入参数为False,直到用户将光标移动了一定的距离(5个象素点)后才改变光标,开始拖动。这就允许控件接受一个OnClick事件而并不开始拖动操作。

EndDrag方法中止一个对象的被拖动状态。它有一个布尔参数Drop。如果Drop设置为True,被拖动的对象在当前位置放下(能否被接受由目标控件决定);如果Drop设置为False,则拖动就地被取消。

下面一段程序表明当拖动进入一控制面板时拖动被取消。

procedure TForm1.Panel1DragOver(Sender

Source: TObject; X

Y: Integer;

State: TDragState; var Accept: Boolean);

begin

Accept := False;

if (Source is TLabel) and (State = dsDragEnter) then

(Source as TLabel).EndDrag(False);

end;

Draging方法判断一个控件是否正被拖动。在下面的例子中当用户拖动不同的检查框时窗口改变为不同的颜色。

procedure TForm1.FormActivate(Sender: TObject);

begin

CheckBox1.DragMode := dmAutomatic;

CheckBox2.DragMode := dmAutomatic;

CheckBox3.DragMode := dmAutomatic;

end;

procedure TForm1.FormDragOver(Sender

Source: TObject; X

Y: Integer;

State: TDragState; var Accept: Boolean);

begin

if CheckBox1.Dragging then

Color := clAqua;

if CheckBox2.Dragging then

Color := clYellow;

if CheckBox3.Dragging then

Color := clLime;

end;

初创公司SwiftStack:“放在盒子里的S3” 赫尔辛基:全球移动游戏开发者的“黄埔军校” 不只属于三星!uMoove将发布“眼球追踪”SDK Android掌门人Andy Rubin宣布辞职 Chrome主管接任 openSUSE 12.3发布 弃MySQL拥抱MariaDB Meteor:让实时Web App成为主流 别了,Google Reader!谷歌于7月1日关闭服务 “天网”降临 机器人或将崛起? 涅槃重生:Qt 5 for Android预览版发布 Google Play将逐步移除广告拦截应用 Shapeways公司开放API 3D打印时代来临 37signal设计师眼中的iOS与Android系统 VMware/Oracle向公有云拓展生态系统 AWS“山寨”技术伙伴创意与产品,是自我完善还是杀鸡取卵? 苹果发布OS X 10.8.3 新版Boot Camp可支持Windows 8 恭喜!麻省理工两密码学教授获2012图灵奖 Rovio的逆袭,发布首款RPG游戏“克鲁德一家” 百会呼吁微软提供合法经营Office 365的相关证明 谁说Vim不是IDE?(四) RDS升级:单DB实例最高可获得3TB存储和3万IOPS 移动周报:“先验证,后开发”的App开发必杀技 Supercell首席执行官谈公司运营理念 SwiftKey:Galaxy S4输入法背后的开发团队 前IE团队领导:IE是如何走向衰败的 谷歌更新BigQuery 允许在其中加入大型数据集 初创公司Spiral Genetics:超越现有DNA序列分析平台40倍速 六大开源监测工具 你用过哪个? TUP第28期:Intel 微软 Yahoo的大数据实践 惊变14天,从“小白”到上架App Store商店 “今日头条”CEO张一鸣:我是爱冒险的技术宅 OpenStack基金会COO Mark Collier:2014年将超越AWS 软件发布:DIP2000标准版 软件发布:邮件群发机 软件发布:iFORM 软件发布:QQrobberBuild(QQ强盗生成器) 软件发布:freeRes 软件发布:公务员之路 软件发布:智能拨号系统 问个INET 控件使用时遇到的问题 软件发布:RegTool注册控件组 软件发布:Windows变脸王 软件发布:FIFA2002视频设置 软件发布:Flash播放器 我写好了一个applet画板程序,愿和大家交流,分享原码,并一同解决余下问题。 请问在BCB中怎样实现动态数组??? Window2000+Apache+Tomcat4.0下class文件放哪里呀?自己建新的目录,怎么建? 请问在win98中的sql server数据库如何导入winnt下sql server服务器中。 济南 应用程序端传递过来的参数不能在导出函数外用吗? BCB 用Install shield制作oracle数据安装程序,在客户端不装ORACLE,如何设置DBE? to:chechy 分来了! 请问哪里有 com本质论 下载啊,最好是中文版的,英文亦可 为什么我的程序在案康柏的ipad上不能使用? 如何在image里预先显示白色背景? 回复phoenix96_2000(Jack Of All Trades) 请问哪里有《Delphi5企业级解决方案及应用剖析》配套光盘源码下载? hehe...请问能不能在WIN2000P建域呢?? 在对话框中放一个静态文本,为何执行时看不到该文本? 哪里有Inside COM+的书籍下载? 请教各位:如何对zf='dd'转换成十六进制? 请教: 二级域名name.***.com是怎么实现的? vc中使用string类型的问题 肮脏的九运会,肮脏的广州!建议以后取消全运会!! 我做了一个OCX控件,里面有个属性SName,我现在想在属性窗口里改了它的值,马上可以在控件上改变,请教各位! 为什么我的USB接口键盘在用软盘启动后的DOS状态下不响应? JSP,薪水有多少? delphi中怎样调用package? ado 的问题 图片从数据能显示,图片名称不能显示? 请问unix下有没有类似于windows下的DLL的二进制代码存储文件机制?(当然不是javaBean) 关于语音控件CTTS1.0? 请教各位:问如何对变量zz='02'转换成16进制? flash 5。0哪里有下载 在vc中调用用vb写的com出错,为什么? 关于多态性的理解,对吗? 如何知道1个类是不是存在? ??请教:我的程序 help!help! 如何对程序执行动作放缓慢! 很小很小的问题!! 棘手问题??急急!!! 如何写一篇学会满足的话题作文 围绕改革开放三十年的变化写一篇作文主要写家乡在改革开放后的变化,希望有高人把结构给我列出来,不要作文,不知道写这样的征文是否要向积极的方向去写啊,请说明观点 写一作文:继承革命传统,宏扬中华文明.要700字以上,高中水平的可以 以"初一的生活"为话题的作文 急求一篇改革开放30周年写自己家乡变化的文章我是郑州市的就写郑州市的变化就行了1500个字 求继承革命传统,弘扬长征精神的作文偶们寒假的历史作业,1000字啊~求各位帅哥美女帮忙了昂! 爱,带给我的烦恼 作文 作文“成长烦恼“怎么写 有关革命传统教育的诗歌或文章 【我的烦恼】初一作文600= =最好原创.不是自己写的也找几篇作文拼起来的 怎样点评作文“成长中的烦恼”?请帮我试写一段,是点评作文的内容,不是作文 关于好人好事的作文200~300字 好滴加分分噢 中华经典文章有哪些 初一作文我的烦恼. 体裁不限,诗歌除外,以良心为话题一小时内解决, 请帮忙介绍几本小学5.6年纪能读得中华经典文章 我喜欢荷花的作文400字 (一)阅读下面文字,自选角度,写一篇不少于800字的作文.除诗歌外,文体不限.曾经有这(一)阅读下面文字,自选角度,写一篇不少于800字的作文.除诗歌外,文体不限.曾经有这样一个故事:有个 读《英雄中国》有感急!寒假要结束了,马上就要交了!各位英雄豪杰,救命啊! 400字荷花作文? 速求一篇初中生600字作文,体裁除诗歌、散文外,一律不限. 怎么写 描写荷花的400字作文荷花我喜欢浪漫的玫瑰花,喜欢富丽堂皇的牡丹,喜欢高雅的郁金香,更喜欢洁白美丽的荷花。“接天莲叶无穷碧,映日荷花别样红。”这句诗是宋朝诗人杨万里写的。 好人好事作文500字左右的我急等啊,好心人帮帮我 我的烦恼作文400字的怎么写啊急!我的烦恼是胆小,说以希望大家写的烦恼是胆小.谢谢 作文题材:改革开放30年如何写类似文章? 写我们班的好人好事多作文,至少500字. 怎样写关于我的烦恼的作文我的烦恼作文有哪些知识点?写时要注意些什么? 作文“我的烦恼”怎么写500字 我身边的好人好事作文 ..500字以上 “如何才能成功”话题作文怎么写?范文 我的烦恼作文怎么写? 好人好事作文100字 求一篇以“探索与成功”的话题作文 请帮忙写篇"我的烦恼"的作文,800字左右,要有真情实感,高中生作文. 关于改革开放的作文500字左右 以成功写一篇话题作文600字 请根据材料,自选角度,自选文体(除诗歌)800字!两条小鱼一起游泳,遇到一条老鱼从另一个方向游来,老鱼向他们点点头,说:“早上好,孩子们,水怎么样?”两条小鱼一愣,接着往前游.游了一会 改革开放以来的变化的作文怎么写?1000字以上,2000字以下.各位有段落也行,(初中水平) 写一篇话题作文歌德曾说,我这一生基本上只是辛苦地工作.我可以说,我活了75岁,没有哪一个月过的是真正舒服的生活.就好像古希腊神话中的西西弗斯堆一块石头上山,石头不停地滚下来有堆 求一篇关于暑假好人好事的1000字文章是以班级的名义的那种文章.不要是第一人称 我 的那种文章.也可以是义务劳动,也可以是好人好事.要多件事情. 作文:从改革开放到现在之间650字左右条理清晰 明确中心 高中作文800字左右比较切合生活的 谁能给我一篇好人好事的作文800字左右 改革开放论文本人现在需要一篇关于改革开放30周年的论文,字数1500至1800左右, 关于革命的题材.文章或书籍最好是关于看完革命书籍后的心得体会 一千字好人好事作文写一同学的事迹,助人为乐.平常默默无闻,没有人看得见他.但他随手捡垃圾、关门关窗,帮同学盛饭……习惯铸成美.我是实在写不出来.一点感觉都没有.明天就交,1000字. 急需以”用美好的心灵看世界”为题的文章!希望看到帖子的各位朋友, 帮忙写一篇有关革命题材感人故事的作文,400-500字, 求一篇作文!《让我感动的那一刻》作文水平在初二 600字左右 写身边的事我不要网上已经有的 要新的! “用美好的心灵看世界”为题写一片作文要一记叙文 联系自己和社会生活的实际来写- 春天像刚落地的小娃娃”“春天像小姑娘”“春天像健壮的青年”,朱自清在文章结尾以人喻春,赞美春天.你能根据自己的阅读感受用另外一种表达方法为文章写一个结尾吗14课 《春》 只允 借物喻人400字的作文 写荷花最好是写荷花 以“用美好的心灵看世界”为话题不少于五百字的作文 以春天为主题的作文? 拜托帮我写一篇关于宁波30年改革开放的变化的作文吧关于宁波的30年,14号以前要,需要1500字 革命传统教育作文要500字以上,小学水平的可以 怎么写话题作文“留下”? 求描写家乡变迁,歌颂改革开放带来新变化的作文要从新颖的角度,多描写家乡的事,身边的事,我要几篇范文,参考参考. 写以《弘扬延安精继承革命传统》写1200的作文怎么写?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn