Delphi中菜单与工具栏按钮的状态控制
在好多的桌面应用程序中,会使用到菜单和工具栏按钮,不同的用户登录到应用系统中会依据其权限显示相应的菜单与工具栏按钮,在显示出来的菜单与按钮中又会根据程序的状态来设置其有效性。举个简单的例子,通常保存按钮是在编辑内容发生变化后才可以使用,数据集的保存需要在编辑状态下才可以使用。
刚开始编写程序时,代码中到处都是这些状态控制代码,如在数据集的“编辑”按钮、菜单的单击事件中启用“保存”和“取消”按钮、菜单,同时要禁止“编辑”按钮、菜单,以防止用户在编辑状态下再次点击编辑按钮、菜单;同时还要在“保存”和“取消”按钮、菜单的单击事件中作相反的设置,禁用“保存”和“取消”按钮、菜单。
其实完全没有必要如此麻烦,首先我们将菜单的单击事件和工具栏按钮单击事件指向同一个事件过程上,这样代码量就可以减少一倍。如果还为客户提供其他调用方式,如上下文菜单,同样也可以将其单击事件指向这个事件过程。让多个用户调用接口都指向一处是一个很明智的做法,不仅降低了代码编写量,同时也规范了执行动作。
我们只要善加使用Delphi提供的VCL控件,就会发现有一个很好用的ActionList控件。它是若干Action的群集,每个Action对象都使用了命令模式封装了一个操作。可以让若干个菜单项或是工具栏按钮等用户控件与相应的Action对象绑定,这样当用户点击这个菜单或是按钮是就触发了Action对象的执行事件(OnExecute),很轻松地实现了上文所说的“多个用户调用接口指向同一处理过程”的设计。Action对象还有一个很不错的OnUpdate事件,我们可以利用这个事件来控件Action对象的状态与可视性(当我们设置Action对象的Enabled和Visible属性时与其关系的相关控件的对应属性也会被设置),这样就不用在多处编写状态控制代码了,实现集中管理。
假设我们有一组与数据集相关的Action对象(Delphi其实已经将这些做为标准Action提供给我们了,此处仅是为了说明如何使用)对应着数据集的导航、编辑、保存、取消、删除和新增操作。我们只需要在菜单中增加一些菜单项,并与这些Action对象绑定,如果需要也可以在工具栏上增加一些按钮并Action对象绑定,这样我们就提供了两处调用接口:菜单项与工具栏按钮。但我们的代码仅有一处,就是Action的OnExecute事件。我们需要根据数据集的状态动设的设置这些功能的能用与否,只要在ActionList控件的OnUpdate事件中编写状态控制代码即可控件与这些Action对象相绑定的菜单项与按钮的状态。
varHandled:Boolean);
begin
actFirst.Enabled:=notDataSet.Bof;
actPrior.Enabled:=notDataSet.Bof;
actNext.Enabled:=notDataSet.Eof;
actLast.Enabled:=notDataSet.Eof;
actInsert.Enabled:=DataSet.Statein[dsBrowse];
actPost.Enabled:=DataSetindsEditModes;
actCancel.Enabled:=DataSetindsEditModes;
actDelete.Enabled:=(DataSet.Statein[dsBrowse])and(DataSet.RecordCount>0);
end;
版权声明:本文为博主原创文章,未经博主允许不得转载。
上一篇: 取余,真的那么简单吗?