toolbar上的toolbutton按下去就弹不上来了是为什么、怎么解决?还有actionlist是做什么的控件?

解决方案 »

  1.   

    设toolbutton的Style属性为tbsCheck,就可以了
    actionlist是和toolbutton或菜单联合使用的,只是为了方便罢了
      

  2.   

    // 关于ActionList
    // 注:由于以前我对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控件添加事件。
      

  3.   

    第一个我说错了,sorry,zfpcb(我是你的传说)说得对
      

  4.   

    我设toolbutton的Style属性为tbsCheck了,可运行的程序并没起作用。我这个按钮是用来断开数据库的快捷按钮,登录的快捷按钮也差不多有同样的问题,别的快捷按钮都是正常的按一下就执行然后自动弹起。