toolbar上的toolbutton按下去就弹不上来了是为什么、怎么解决?还有actionlist是做什么的控件?
解决方案 »
- 在局域网查询5千条数据会卡吗?
- 如何设置fastreport可以改列的宽度?
- 要用encoding 这个函数,需要uses 哪个单元啊?
- ms sql 问题
- 为什么DELPHI5里用IdFTP1.TransferType:=ftAscii;编译不能通过,提示没定义ftAscii
- 这段代码错在哪了[改变任务栏上的"开始"按钮的文本]
- 制作帮助文件过程中遇到的问题。。。。
- idhttp与www.google.com的奇怪问题
- 高分相关送,调查目前流行的报表开发工具
- 如何实现打印dbgird的内容,这段代码应该怎么写
- 如何实现按字符筛选Tstrings的内容,输入字符包括数字、英文字母、拼音首字母?
- delphi7 的报表组件哪儿去了?
actionlist是和toolbutton或菜单联合使用的,只是为了方便罢了
// 注:由于以前我对MVC理解有误,所以下面关于MVC的论述并不完全正确。现在主要是讲一下ActionList
ActionList其实在Delphi 5中就已经有了。用它,可以很好地实现界面和功能模块的分离,也就是更加符合MVC设计模式。
我们在写程序的时候,通常同一个功能会以几种不同的UI方式提供给用户。例如,用户想把一段文本复制到剪贴板,可能是通过点击菜单项“编辑-->复制”,也可能是通过工具按钮“复制”,还有可能是通过点击鼠标右键,在快捷菜单中选择“复制”,甚至有可能是直接通过快捷方式Ctrl + C。如果我们为每一个方式都写一个方法,而这些方法都执行相同的操作,那么其实我们所做的很多工作是在浪费时间。因为同样的功能,我们写代码却要写4、5次甚至更多。
用方法指针是一种解决办法。如前所述,Dephi的事件其实就是方法指针。我们可以为一种操作方法添加事件,比如为菜单添加单击事件。然后我们把其他UI控件的相应事件连接到这个指针。假设我们想把一个Button的单击事件连接到菜单的单击事件,在Dephi IDE的对象观察器的Event页中,找到该Button的OnClick事件,点击右边下拉框的下拉三角,可以看到窗体中所有已经添加的事件。选中对应菜单的OnClick事件,这样就把Button的OnClick事件连接到了菜单的OnClick事件。
这种方法虽然可以实现,但它有几个问题。
首先,功能模块完全依赖于用户界面(或者说是视图View)。当界面发生变化时,我们将不得不重新改写所有相关的方法。
其次,如果其中某个控件的功能发生了变化,例如上面的菜单功能变了,而别的控件功能都没变,那我们除了要改写菜单的事件外,还要改写其他控件的方法。因为他们只是简单地把方法指针指向菜单的事件,现在已经不适用了。
上面所说的问题,其实也是非MVC模式中经常存在的问题。
其实这个问题Delphi已经为我们提供了一个很好的解决工具——ActionList.。它是由一系列的Action组成的,我们可以添加自己定义的Action,或标准的Aciton,如文本的复制粘贴等。
我们给一个Action添加事件,然后把UI控件的事件连接到Aciton。在运行时,我们根本看不到Action的存在——它并不是用户界面控件。但用户操作时,执行功能的其实是Acion。它并不知道有菜单、按钮或快捷菜单的存在,当然也不知道用户究竟是点击了菜单还是Button。当我们修改界面时,不会影响到Action。如果菜单的功能变化,而其他控件的功能没有变,我们只要把菜单连接到新的Action就可以了,不会影响到其他控件。
综上所述,MVC模式有很多优点,而ActionList就是MVC模式的最好体现。所以我个人认为我们用Delphi开发时应该尽量用ActionList,而避免直接用UI控件添加事件。