发掘ListBox的潜力(二):鼠标拖放插入点提示
鼠标拖放插入点提示
鼠标拖放是Windows常见的操作,比如拷贝文件就可用拖放方式进行。在我们编写的应用程序中,有时为了方便用户操作需要支持鼠标拖放。对于大部分的VCL控件只要鼠标将DragMode设为dmAutomatic,就可以在OnDragDrop、OnDragOver和OnEndDrag中处理拖放事件。与Drag类似的还有一个Dock方式用于支持控件悬浮,控件在悬浮时会显示一个虚线框来表示悬浮位置,而Drag方式却没有这功能。现在让我们尝试在Listbox中显示拖放插入点。
上面提及的三个事件中OnDragOver是用来拖放鼠标经过控件上面时产生的,要显示插入点提示当然是在这里进行处理了。事件中先用Listbox.ItemAtPos(Point(X, Y) , true)取鼠标所有在的打目Index,再用Listbox.ItemRect(Index)取得作图区域,最后在区域中画出提示线框。下面给出代码:
Unit1.pas内容 |
unit Unit1;
interface uses type var implementation {$R *.dfm} {======================================================================== 文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持! procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; procedure TForm1.DrawInsertLine; end. |
Unit1.dfm内容 [内容较长,请点击此处找开/折叠] |
object Form1: TForm1 Left = 192 Top = 107 Width = 540 Height = 376 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object ListBox1: TListBox Left = 24 Top = 24 Width = 201 Height = 265 Style = lbOwnerDrawFixed DragMode = dmAutomatic ItemHeight = 20 Items.Strings = ( ' Accept := (Source is TkktLabelListBox) and (TkktLabelListBox(S' + 'ource).ItemIndex>-1);') TabOrder = 0 OnDragDrop = ListBox1DragDrop OnDragOver = ListBox1DragOver end object ListBox2: TListBox Left = 264 Top = 24 Width = 233 Height = 265 Style = lbOwnerDrawFixed DragMode = dmAutomatic ItemHeight = 20 Items.Strings = ( '上代码的确可用而且被广泛使用,但它有一个很大的缺点:' '效率大低。因为每次在Listbox中追加、插入或删除一个' '条目时,都要调用此函数重新计算横向滚动条宽度' ',而遍历所有项目和调用TextWidth都是很是很' '耗时的操作。如果用户将条目从当前Listbox拖往另一' '个Listbox,那么用户一个操作将有两' '个Listbox必须重新计算横向滚动条宽度,当Listbox' '内容有上百条的时候,你将明显感觉反应迟缓。' ' OK,现在换个思路。' ' 当追加或插入新条目时,只要判断新内容的Text' 'Width是否大于滚动条宽度,如果是调整滚动条宽度' '即可。那么删除呢?是的,遍历是不可避免的,但并不' '是每次删除都需要。可以定义一个变量记录Listbox中' 'TextWidth值最大的条目Index,只有删除这个条目时' '才需要遍历,其它时候完全可以不管它。' ' 还有一种情况必须考虑,用户可能会改变' '屏幕字体,这时也必须重新计算横向滚动条宽度。' '跟删除操作一样计算原最大条目的新TextWidth值即可。' ' 如果窗体上有多个Listbox,记录每个Listbox的' '最大条目也是一件很麻烦的事,所以我把它封装起来,' '下面给出完整代码:') TabOrder = 1 OnDragDrop = ListBox1DragDrop OnDragOver = ListBox1DragOver end end |
(完)
http://blog.csdn.net/nhconch/article/details/228018
发掘ListBox的潜力(二):鼠标拖放插入点提示的更多相关文章
- 发掘ListBox的潜力(一):自动调整横向滚动条宽度
<自绘ListBox的两种效果>一文帖出之后,从反馈信息来看,大家对这种小技巧还是很认同.接下来我将继续围绕ListBox写一系列的文章,进一步发掘ListBox的潜力,其中包括:自动调整 ...
- 发掘ListBox的潜力(三):显示即时提示(Tips)
ListBox显示即时提示(Tips) Listbox内容太长时超出Listbox宽度的部分将无法显示,一种解决方法是让Listbox产生横向滚动条,滚动显示内容(见前面的<发掘ListBox的 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的是否接受鼠标拖放事件的acceptDrops属性及含义
acceptDrops属性表示当前部件是否接受鼠标拖放事件,鼠标拖放应该是与鼠标拖拽结合在一起的,在Qt Designer中可以通过属性acceptDrops设置部件是否接受鼠标拖放事件.如果部件接受 ...
- ASP.NET TextBox 当鼠标点击后清空默认提示文字
ASP.NET TextBox 当鼠标点击后清空默认提示文字 [ 方法一] 前台代码: <div> <asp:TextBox ID="txtName" ru ...
- Qt应用程序主窗口之二:拖放操作与打印文档
一.拖放操作 对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Creator中来打开整个项目一样.Qt中 ...
- 鼠标拖放div 实现
Javascript的mousemove事件类型是一个实时响应的事件,当鼠标指针的位置发生变化时(至少移动1个像素),就会触发mousemove事件.该事件响应的灵敏度主要参考鼠标指针移动速度的快慢, ...
- 【算法】【python实现】二叉搜索树插入、删除、查找
二叉搜索树 定义:如果一颗二叉树的每个节点对应一个关键码值,且关键码值的组织是有顺序的,例如左子节点值小于父节点值,父节点值小于右子节点值,则这棵二叉树是一棵二叉搜索树. 类(TreeNode):定义 ...
- 轻快的vim(二):插入
上一节我们讲到了VIM中的移动,既然已经能够在屏幕和光标间游刃有余了 那么,现在就来谈谈插入命令 不知道有多少VIM新手和我当年(去年)一样,信誓旦旦的以为只有i可以插入 唉,现在想想都觉得可笑,都是 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)
萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...
随机推荐
- CentOS 6.5上安装MySQL-Cluster
参考博文: CentOS 6.2下MySQL Cluster 7.2 配置数据库集群 CentOS 6.5上安装MySQL-Cluster 7.3.4过程笔记--下一步学习 MySQL Cluster ...
- C语言深度剖析--volatile(转载)
volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统,硬件或者其他线程等等.遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进 ...
- Qt Chart 5.7.0 傻瓜安装教程
前提 qtchart 里的README文件(注意红色标记处)(本人翻译不行.多多见谅,也可以在评论里纠正( ⊙ o ⊙ )) --------------- Qt Charts 5.7.0 ----- ...
- Linux ldconfig 查看动态库连接
/usr/lib64/tls: (hwcap: 0x8000000000000000) [root@wx02 ~]# ldconfig -v | grep keep libzookeeper_mt.s ...
- ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper
ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper 监控 master/slave 需要使用zk的临时节点 ...
- in window js 未定义和undifined的区别
浏览器报错:未定义和undifined不是同一概念,前者是没有申明,后者是没有赋值. 1: <html> <body> <script> ...
- Eclipse中JBOSS5.1无法启动的问题解决办法
今天在Eclipse中启动JBoss 5.1时遇到这样的一个错误: …… ERROR [AbstractKernelController] Error installing to Instantiat ...
- Domain(AD) 管理
新建账户 文件夹权限管理
- 富文本编辑器 - wangEditor 表情
效果: 文件夹中的表情: 代码:
- ACM比赛(第三次D)
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Description 有三户人家共拥有 ...