U8开发之工具栏控件

U8开发之工具栏控件

2023年7月13日发(作者:)

U8工具栏控件

摘要

工具栏是U8应用程序常用的界面元素.把菜单中常用的命令做成按钮安排在工具条中,配上适当的图标符号和文本提示,能够极大地方便用户.

U8产品开发尤其是前台UI开发中,工具栏控件和窗体一样是系统展现不可缺少的一部分.在早期U8产品开发过程中大量使用了微软的MSToolbar,但是随着U8ERP产品开发的精细化、专业化,微软的MSToolbar在界面设计和程序开发中暴露出了诸如界面图标配置不灵活、不支持多级菜单、不适应复杂应用场景、对多语的支持不够完善等开发问题.为了弥补这些不足,并且兼容之前的产品,U8平台提供了工具栏控件.在V11版本中,又对工具栏在UE效果上做了进一步改进,采用Ribbon工具栏风格,形成了现在U8产品的工具栏效果.

什么是工具栏?

Ribbon风格:Ribbon是一种以皮肤与标签页为架构的用户界面 ,原先出现在 Microsoft Office 2007 与 2010 的Word、Excel和Powerpoint 等组件中,后来也被运用到 Windows 7 的一些附加组件等其它软件中,如画图和写字板,以与 Windows 8 中的资源管理器.它是一个收藏了命令按钮和图标的皮肤.它把命令组织成一组"标签",每一组包含了相关的命令.每一个应用程序都有一个不同的标签组,展示了程序所提供的功能.在每个标签里,各种的相关的选项被组在一起.设计Ribbon的目的是为了使应用程序的功能更加易于发现和使用,减少了点击鼠标的次数.

门户Toolbar:从门户树形菜单或全景式菜单打开的选项卡式窗体〔即嵌入门户的窗体〕中包含的工具栏称为门户Toolbar.如下图所示:

图门户Toolbar示意图

由于门户工具栏是U8各产品较常见且核心的内容,所以有必要介绍门户工具栏内部的一些概念,包括排版组、分组、按钮样式等.以下分别介绍:

按钮分组:在门户Toolbar上,两个分割线之间的区域即为一个按钮分组.

图按钮分组示意图

排版组:每个纵向排列的按钮集合即为一个排版组,排版组形式可能表现为一个大按钮、或者两个小按钮、三个小按钮.如下图:

〔一个大按钮〕〔两个小按钮〕〔三个小按钮〕

按钮样式主要表现为普通按钮、下拉菜单〔带设置默认功能〕、下拉菜单〔不带设置默认功能、Toggle按钮、Combobox类型按钮.

〔Toggle按钮〕

1 / 20 〔普通按钮〕

〔下拉菜单〔不带设置默认功能〕〕

〔下拉菜单〔带设置默认功能〕〕

〔显示模板信息的按钮为Combobox类型按钮〕

由于单据是U8产品常见且核心的功能,所以单据上除了有门户Toolbar以外,也包含自己的Toolbar,方便用户能够快速定位功能.单据的Toolbar包括表头Toolbar和表体Toolbar.

表头Toolbar:表头工具栏并不是一个完整的工具栏,表头工具栏只是包含刷新、翻页〔首页、前页、后页、末页〕、高级等按钮.其他的是单据表头的一部分,是单据控件的内部功能.如下图所示:

图表头Toolbar示意图

表体Toolbar:表体工具栏是指单据表体顶部的工具栏,主要是针对表体的一些便捷操作的功能集合,方便用户浏览、操作表体数据时进行本单据的个性化操作.如下图所示:

图表体Toolbar示意图

模态窗体Toolbar:非嵌入门户的窗体上的Toolbar工具栏.这种窗体上的按钮样式相对门户Toolbar要少,没有Combobox类型、没有排版组和大小按钮的概念.U890、U810.0、U810.1版本的按钮样式和U811.0模态窗体Toolbar的按钮样式相同.

图模态窗体Toolbar

目标

本文主要介绍工具栏控件的基础知识,应用过程与相关注意事项,方便各类U8产品开发人员更好的使用工具栏控件,更高效的开发产品.

工具栏可以做什么?

工具栏是U8应用程序开发中必不可少的组件,工具栏支持多语、支持键盘快捷键、支持多级菜单的展示和运用、支持设置图标和文字、集成MSToolbar方便业务组快速开发同时保持程序的向后兼容性.

2 / 20 1. V10.1与之前版本工具栏特性

由于V11.0版本只是在界面UE效果和工具栏构建方式上做了修改,其他内容均和之前版本相似,所以这里不做重点的讲解,这些版本的样式和ssss相同.使用方式将在[如何使用工具栏组件]中介绍.

2. V11特性

a) 支持流式布局

➢ 没有权限的按钮不显示,相同排版组内其余按钮自动重新排版.排版组可以定义小按钮最大行数.当出现空白列时,后面的按钮自动向前平移.

➢ 一个排版组内按钮因授权问题导致只有一个小按钮时自动升级为大按钮.

➢ 相关系统没有启用而导致的不可用功能按钮不显示,如工作流没有启用,提交按钮不显示.

➢ 有权限但当前单据状态或者操作状态下不可用按钮置灰.

b) 支持多行显示

图多行显示示意图

➢ 工具栏高度为三行横向排版小按钮高度.

➢ 大按钮图标和标签采用上下排版,按钮占整个工具栏可用高度〔三行小按钮〕.

➢ 小按钮图标和标签左右排版,当一列有三个小按钮时工具栏可用高度三等分、纵向中对齐,当一列有两个小按钮时工具栏可用高度二等分、纵向中对齐,当一列只有一个小按钮时工具栏可用高度二等分,纵向中对齐,按钮放在第一行.

➢ 当相邻有多个小按钮时,可以把它们划分为一个或者多个排版组,每个排版组可以指定排版行数.

c) 支持分组

➢ 按钮支持按分组排列、排版组信息

d) 多按钮样式

➢ 普通小按钮、下拉菜单小按钮、有默认功能的下拉菜单小按钮

➢ 普通大按钮、下拉菜单大按钮、有默认功能的下拉菜单大按钮

3. 数据字典

a) V11.0数据字典

窗体按钮基本表〔AA_FormButtons_base〕

字段名

ctoolbarPosIndex

FunctionKey

cAuthid

cSetGroup

ProcessObjectName

字段类型

nvarchar<5>

nvarchar<100>

说明

标识窗体上该按钮所处位置信息.P<门户Toolbar>,T<表头Toolbar>,B<表体Toolbar> ,其中T、B只对单据窗体有用.

该按钮的功能Key

Nvarchar<255>

无用字段,方便抽取,不要赋值

Nvarchar<120>

排版组名称

Nvarchar<400>

组件名信息〔系统内部公共组件名,外部无需预置,无意义〕

3 / 20 iToolBarStyle tinyint

按钮类型.0代表普通按钮,1代表Check,2代表ButtonGroup,3代表分隔符,4代表PlaceHolder,5代表普通DropDown,55代表Combobox,56代表DropDown,57代表ToggleButton,128代表下拉但是不需要设置默认

cSubID

cResID

iOrder

cTipResID

cForegroundColor

cGroup

cButtonKey

cProjectNO

cHotKey

cToolBarType

iVoucherCtlIndex

cFormCode

Nvarchar<50>

int

子产品ID

位置信息〔决定按钮在排版组的位置〕

Nvarchar<100>

资源号

Nvarchar<100>

提示信息多语资源号

Nvarchar<120>

前景色

Nvarchar<60>

Nvarchar<40>

Nvarchar<50>

Nvarchar<20>

Tinyint

Nvarchar<40>

分组信息

按钮Key

项目号

暂不使用

针对单据才有用,单据窗体上该按钮对应的单据控件ID

窗体的唯一标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

Nvarchar<200>

热键

cBackgroundColor

iSetGroupRow

cPic

iheightRow

Nvarchar<120>

背景色

Int

Nvarchar<60>

Int

排版组:3/2/1.3代表一组里面有3个按钮,2代表一组有两个按钮,1代表一组里面有一个按钮

图片名〔无路径、无后缀名〕

行高.3代表大按钮,1代表小按钮

窗体按钮多语资源表〔AA_FormButtons_lang〕

字段名

Autoid

cCaption

cProjectNO

cFormCode

字段类型

Int

Nvarchar<50>

Nvarchar<40>

说明

自增id,唯一标识

项目号

窗体标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

Localeid

cSubID

cToolTip

cButtonKey

Nvarchar<10>

Nvarchar<50>

Nvarchar<40>

语种信息

子产品iD

按钮Key

Nvarchar<200>

按钮标题

Nvarchar<600>

按钮的Tip信息

窗体按钮子菜单信息表〔AA_FormButtonMenus_base〕

字段名 字段类型 说明

4 / 20 cParentKey

cButtonKey

FunctionKey

cFormCode

Nvarchar<40>

Nvarchar<40>

按钮的上级菜单或菜单Key

菜单对应按钮Key

配合使用

Nvarchar<100>

公共按钮执行的公共组件函数key,和ProcessObjectNameNvarchar<40>

所在窗体的唯一标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

iMenuType

cMenuKey

cSubID

cForegroundColor

cProjectNO

cAuthid

cBackgroundColor

Igrade

iOrder

ProcessObjectName

cResID

Int

Nvarchar<40>

Nvarchar<50>

Nvarchar<50>

菜单类型:1代表CheckBox类型,0代表普通类型

菜单Key

子产品ID

项目号

Nvarchar<120>

前景色

Nvarchar<255>

无用,仅为抽取工具抽取信息使用

Nvarchar<120>

背景色

Int

Int

暂时无用

代表按钮下菜单的位置先后顺序

Nvarchar<100>

资源号信息〔多语资源表关联时使用〕

Nvarchar<400>

公共处理组件名,仅为系统内部使用,和FunctionKey配合使窗体按钮菜单对应多语资源表〔AA_FormButtonMenus_lang〕

字段名

Autoid

cCaption

cProjectNO

cFormCode

字段类型

Int

Nvarchar<50>

Nvarchar<40>

说明

自增id,唯一标识

项目号

窗体标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

Localeid

cSubID

cToolTip

cButtonKey

cMenuKey

Nvarchar<10>

Nvarchar<50>

Nvarchar<40>

Nvarchar<40>

语种信息

子产品iD

按钮Key

菜单Key

Nvarchar<200>

按钮标题

Nvarchar<600>

按钮的Tip信息

窗体按钮菜单设置默认功能表〔AA_FormButtonsMenus_Default〕

注意这个是Data库的数据,其他的表都是Meta库的,这个表不是要预置的,是门户设置默认功能保存数据所用的表

字段名

cDefaultMenuKey

字段类型

Nvarchar<40>

说明

按钮要执行的功能对应的MenuKey

5 / 20 iType

Ufts

cValue

cUserID

cFormCode

Smallint

Timestamp

执行类型

时间戳

Nvarchar<100>

默认值

Nvarchar<100>

设置默认值的用户ID

Nvarchar<200>

按钮所在窗体的唯一标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

cButtonKey Nvarchar<40>

对应按钮的Key

窗体信息基本表〔AA_Forms_base〕

字段名

cMemo

Pubufts

cProjectNO

iFormType

cSubID

bSmallbutton

cFormCode

字段类型 说明

Nvarchar<200>

窗体信息描述

Timestamp

Nvarchar<50>

Tinyint

Nvarchar<10>

Tinyint

Nvarchar<40>

时间戳

项目号

标识窗体时模态弹窗还是嵌入门户

子产品ID

该窗体上是否是一排小按钮

按钮所在窗体的唯一标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

窗体信息多语资源表〔AA_Forms_lang〕

字段名

cSubID

cFormDesc

Localeid

cProjectNO

cFormCaption

cFormCode

字段类型

Nvarchar<50>

Nvarchar<10>

Nvarchar<50>

Nvarchar<40>

说明

子产品ID

语种

项目号

按钮所在窗体的唯一标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

Nvarchar<200>

窗体信息描述

Nvarchar<200>

窗体标题信息

窗体按钮、菜单权限信息表〔AA_FormButtonAuths〕

字段名

cSubID

cButtonKey

字段类型

Nvarchar<50>

Nvarchar<40>

说明

子产品ID

按钮Key

6 / 20 cAuthid

cProjectNO

cMenuKey

cFormCode

Nvarchar<255>

权限号

Nvarchar<50>

Nvarchar<40>

Nvarchar<40>

项目号

菜单Key

按钮所在窗体的唯一标识,建议按照如下格式预置:子产品号+前缀+单据/列表+窗体描述+CardNumber,例如frms_<前缀>_Voucher〔单据〕_PU<子产品号>_88

以保持唯一性为主,类似如下的命名:PU_frms_Voucher_Test_88

PU_Frms_VoucherList_Test_88

b) 二次开发数据字典

窗体二次开发按钮、菜单信息表〔AA_CustomerButton〕〔U890/U10.0/U10.1〕

字段名

bInneralCommand

cToolTip

iOrder

cLocaleID

cVisibleAsKey

cButtonType

cImage

cSubID

DependenceSubIdList

cButtonKey

cCustomerObjectName

cButtonID

cKeyBefore

字段类型

Int

Nvarchar<200>

Nvarchar<50>

Nvarchar<50>

Nvarchar<100>

Nvarchar<50>

Nvarchar<100>

Nvarchar<50>

Nvarchar<200>

Nvarchar<50>

Nvarchar<100>

Nvarchar<50>

说明

是否内部命令,是则为1,否则为0

按钮或菜单的提示信息

按钮或菜单的位置信息

多语类型

设置显示状态和系统的哪个按钮键值一致

default:一般按钮,menu:菜单,system替换系统按钮的功能,执行自己的方法,dropdown:下拉类型

图标的文件名〔不带扩展名〕

子产品号

依赖子产品列表

按钮Key

该按钮要执行的功能的组件名

如果cButtonType是default则此键值表示自定义按钮前的按钮Key,如果cButtonType是menu则表示菜单所在的按钮,如果cButtonType是system则表示需要替换的按钮key

cHotKey

cFormKey

cGroup

cProjectNO

cEnableAsKey

cCaption

cVoucherKey

cVariant

Nvarchar<50>

Nvarchar<50>

Nvarchar<50>

Nvarchar<50>

Nvarchar<100>

Nvarchar<100>

Nvarchar<50>

Nvarchar<400>

热键信息

暂时无用,可以和cVoucherKey相同

分组信息

不允许使用U870项目号,客户化项目用U8CustDef

设置Enable状态和系统的哪个按钮键值一致

按钮或菜单的标题

单据的CardNum信息

自定义内容,里面的值会传给自己设置的处理的组件

Uniqueidentifier

按钮ID<唯一标识GUID>

窗体二次开发按钮、菜单信息表〔AA_CustomerButton〕〔V11.0版本〕

字段名

bInneralCommand

cToolTip

iOrder

cLocaleID

字段类型

Int

Nvarchar<200>

Nvarchar<50>

Nvarchar<50>

说明

是否内部命令,是则为1,否则为0

按钮或菜单的提示信息

按钮或菜单的位置信息

多语类型

7 / 20 cBackgroundColor

cVisibleAsKey

cButtonType

cImage

cSubID

DependenceSubIdList

cButtonKey

iVoucherCtlIndex

cToolbarPosIndex

cCustomerObjectName

cButtonID

cKeyBefore

Nvarchar<120>

Nvarchar<100>

Nvarchar<50>

Nvarchar<100>

Nvarchar<50>

Nvarchar<200>

Nvarchar<50>

Tinyint

Nvarchar<5>

Nvarchar<100>

Nvarchar<50>

按钮或菜单的背景色

设置显示状态和系统的哪个按钮键值一致

default:一般按钮,menu:菜单,system替换系统按钮的功能,执行自己的方法,dropdown:下拉类型

图标的文件名〔不带扩展名〕

子产品号

依赖子产品列表

按钮Key

仅对单据上的按钮或菜单才有效.该按钮所在的单据控件的Key

该按钮的位置信息,P代表门户Toolbar,T代表表头Toolbar,B代表表体Toolbar.T/B仅对单据上的工具栏有效

该按钮要执行的功能的组件名

如果cButtonType是default则此键值表示自定义按钮前的按钮Key,如果cButtonType是menu则表示菜单所在的按钮,如果cButtonType是system则表示需要替换的按钮key

Uniqueidentifier

按钮ID<唯一标识GUID>

cHotKey

cSetGroup

cFormKey

cGroup

cForegroundColor

cProjectNO

cEnableAsKey

iheightRow

iSetGroupRow

cCaption

cVoucherKey

cVariant

Nvarchar<50>

Nvarchar<120>

Nvarchar<50>

Nvarchar<50>

Nvarchar<120>

Nvarchar<50>

Nvarchar<100>

Tinyint

Int

Nvarchar<100>

Nvarchar<50>

Nvarchar<400>

热键信息

排版组信息

暂时无用,可以和cVoucherKey相同

分组信息

按钮前景色

不允许使用U870项目号,客户化项目用U8CustDef

设置Enable状态和系统的哪个按钮键值一致

行高,3代表大按钮,1代表小按钮

排版组:3/2/1.3代表一组里面有3个按钮,2代表一组有两个按钮,1代表一组里面有一个按钮.

按钮或菜单的标题

单据的CardNum信息

自定义内容,里面的值会传给自己设置的处理的组件

如何使用工具栏控件?

1. 老版本应用工具栏控件〔890/10.0/10.1〕

首先引用MSToolbar、UFToolbar组件

一定要注意,引用MSToolbar要引用Microsoft Windows Common Controls 6.0也就是,不要引用

然后在窗体上增加MSToolbar、UFToolbar、ImageList

设计MSToolbar

设计MSToolbar完成后执行如下代码:

将MSToolbar加载到UFToolbar上

8 / 20 = 300 * erPixelY

lor = &HF9F8F6

lbar Toolbar1‘将设计好的MSToolbar加载到UFToolbar上

playStyle PictureText

's<"Print">.ButtonMenus<"mnuPrint">.Enabled = False

's<"PU88_01">.Visible = True

's<"Skip2">.Visible = True

's<"Skip2">.Enabled = True

's<"Print">.Caption = "aaaa"

hVisible

hEnable

‘注释掉的代码是为了说明直接改变MSToolbar上对应按钮的状态或者按钮信息,调用UFToolbar的RefreshVisible和RefreshEnable之后即可应用MSToolbar的按钮状态到UFToolbar上,即保持了兼容性,也方便了业务开发人员快速开发.

得到的效果如下:

2. V11.0版本应用工具栏控件

在V11.0版本中,工具栏组件为了能够规范业务组的编程并配合整体UE设计效果,做了两个大的调整:Ribbon风格、UE效果和支持数据库预置按钮的方式.对于UE和Ribbon风格已经在[什么是工具栏]中做了介绍,在此不再赘述.下面讲解如何通过数据库预置的方式设计U8的工具栏.

a) 预置数据

数据表结构和字段说明详见[工具栏可以做什么]中的V11.0数据字典.

如果想结合数据字典了解工具栏的具体预置方法,可以执行下面的脚本,参考采购订单的预置内容.

查询采购订单的工具栏预置数据

select*fromAA_FormButtons_basewherecFormCode=N'pu_frms_voucher_88'

select*fromAA_FormButtons_langwherecFormCode=N'pu_frms_voucher_88'

select*fromAA_FormButtonMenus_basewherecFormCode=N'pu_frms_voucher_88'

select*fromAA_FormButtonMenus_langwherecFormCode=N'pu_frms_voucher_88'

select*fromAA_FormButtonAuthswherecFormCode=N'pu_frms_voucher_88'

select*fromAA_Forms_basewherecFormCode=N'pu_frms_voucher_88'

select*fromAA_Forms_langwherecFormCode=N'pu_frms_voucher_88'

‘cFormCode=’PU_Frms_Voucher_88’代表采购订单

下面是预置数据示例

查询采购订单的工具栏预置数据

‘预置数据的cFormCode仅为测试用,建议按照数据字典中的规范定义cFormCode字段

deletefromAA_Forms_basewherecformcode=N'frm_test_test'

9 / 20 deletefromAA_Forms_langwherecformcode=N'frm_test_test'

deletefromAA_FormButtons_basewherecformcode=N'frm_test_test'

deletefromAA_FormButtons_langwherecformcode=N'frm_test_test'

deletefromAA_FormButtonMenus_basewherecformcode=N'frm_test_test'

deletefromAA_FormButtonMenus_langwherecformcode=N'frm_test_test'

deletefromAA_FormButtonAuthswherecformcode=N'frm_test_test'

InsertIntoAA_Forms_base

Values

InsertIntoAA_Forms_lang

Values

InsertIntoAA_Forms_lang

Values

InsertIntoAA_Forms_lang

Values

InsertIntoAA_FormButtons_base

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_base

Values

row',N'PortalToolbar',0,10,3,N'',N'',0,N'B',N'r.0003410 / 20 ',N'r.00034',N'black',N'',N'frm_test__B_1_1',1,Null,Null>

InsertIntoAA_FormButtons_lang

Values

rows'>

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_base

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtonAuths

Values

deleteAA_FormButtonMenus_basewherecFormCodeLIKEN'frm_test_%'andcbuttonkey=N'Print'andcMenuKey=N'mnuPreview'

InsertIntoAA_FormButtonMenus_base

SELECTcFormCode,N'Print',N'mnuPreview',16,N'',0,N'',N''FROMAA_FormButtons_baseWHEREcFormCodeLIKEN'frm_test_%'ANDcButtonKey=N'Print'

deleteAA_FormButtonMenus_langwherecFormCodeLIKEN'frm_test_%'andcbuttonkey=N'Pring'andcMenuKey=N'mnuPreview'

InsertIntoAA_FormButtonMenus_lang

SELECTcFormCode,N'en-US',N'Pring',N'mnuPreview',N'Preview',N''FROMaa_formbuttons_langWHEREcFormCodeLIKEN'frm_test_%'ANDcButtonKey=N'Print'ANDlocaleid=N'en-US'

InsertIntoAA_FormButtonMenus_lang

SELECTcFormCode,N'zh-',N'Print',N'mnuPreview',N'预览',N''FROMaa_formbuttons_langWHEREcFormCodeLIKEN'frm_test_%'ANDcButtonKey=N'Print'ANDlocaleid=N'zh-'

InsertIntoAA_FormButtonMenus_lang

SELECTcFormCode,N'zh-TW',N'Print',N'mnuPreview',N'預覽',N''FROMaa_formbuttons_langWHEREcFormCodeLIKEN'frm_test_%'ANDcButtonKey=N'Print'ANDlocaleid=N'zh-TW'

InsertIntoAA_FormButtons_lang

Values

rows',N'Insert rows'>

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_base

Values

Page',N'PortalToolbar',0,50,3,N'',N'',0,N'T',N'r.00050',N'r.00050',N'black',N'',N'frm_test__T_1_5',1,Null,Null>

InsertIntoAA_FormButtons_lang

Values

sheet',N'Previous sheet'>

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_base

Values

page',N'PortalToolbar',0,60,3,N'',N'',0,N'T',N'r.00051',N'r.00051',N'black',N'',N'frm_test__T_1_6',1,Null,Null>

InsertIntoAA_FormButtons_lang

Values

sheet'>

InsertIntoAA_FormButtons_lang

Values

InsertIntoAA_FormButtons_lang

Values

GO

b) 在所在窗体上引用相关组件

此过程和老版本应用工具栏控件执行窗体上引用相关组件相同,可参考上一节,再此不再赘述.

c) 执行如下代码即可加载工具栏组件

将MSToolbar加载到UFToolbar上

lbarFromData

= 300 * erPixelY

lor = &HF9F8F6

lbar Toolbar1‘将设计好的MSToolbar加载到UFToolbar上

playStyle PictureText

's<"Print">.ButtonMenus<"mnuPrint">.Enabled = False

's<"PU88_01">.Visible = True

's<"Skip2">.Visible = True

's<"Skip2">.Enabled = True

's<"Print">.Caption = "aaaa"

hVisible

hEnable

‘这里需要强调UFToolbar的SetToolbarFromData方法,该方法的功能是从数据库加载数据到MSToolbar上.相应描述如下:

Public Sub Settoolbarfromdata

13 / 20 oLogin As Object, sFormKey As String, sSubKey As String, Optional oVouchers As Object>

‘oMsToolbar代表MSToolbar对象

‘代表Connection连接对象

‘oLogin代表VB的Login对象

‘sFormKey代表预置的窗体cFormCode字段,本实例中为frm_test_test

‘sSubKey代表子产品ID

‘oVouchers暂时不用,不用设置

End Sub

d) 按钮图片名遵循的约定

V11.0中有一点和老版本应用工具栏控件不同,老版本应用工具栏控件,如果希望按钮是带图标的,则必须有ImageList控件,该控件加载按钮的相应图标.在数据库中通过AA_FormButtons_Base和AA_FormButtonMenus_Base表的cPic字段体现,具体可以参考数据字典.只需要预置文件名即可,不要带路径和扩展名.

门户Toolbar区域的按钮分大按钮和小按钮,图片分别存在于U8softiconsBigIcon和U8softiconsSmallIcon目录下,要预置数据可去相关文件夹寻找对应的图片名.

表头Toolbar区域的图片名是固定的,分别如下

高级按钮无图片,可不预置

定位结果与历史按钮图片是固定的,系统默认的,无需预置该按钮

刷新按钮图片名:Refresh

首页按钮图片名:first page

上一页按钮图片名:Previous Page

下一页按钮图片名:Next page

末页按钮图片名:Last page

表体Toolbar区域均不包含图片,无需图片名

特别要说明的是工具栏组件不仅支持数据库预置按钮的方式,为了保持向后的兼容性,仍然支持该章节第一部分老版本应用工具栏控件的方式,详见1、老版本应用工具栏控件.

3. 二次开发应用工具栏控件

a) 检查所在窗体是否支持二次开发

工具栏组件原则上都可以支持二次开发行为,但由于某些界面没有这方面的需求,所以并没有支持二次开发功能

在一个界面上同时按住Ctrl+Shift并点击任何一个按钮,这样你所需要的信息将被Copy到写字板<附件中的写字板>上,〔注意不是记事本notepad〕.

b) 数据预置

相关数据结构在二次开发数据字典的AA_CustomerButton表中,可查阅相关内容.

c) 脚本预置示例

在采购订单上预置二次开发按钮数据

InsertintoAA_CustomerButtonvalues,'TestBtn','default','U870','88','88','Save',0,'PU_FrmS_Voucher_P_2','class','测试按钮','zh-','Add','测试按钮','Ctrl+N',1,'测试按钮','Save','Save','PU','PU',Null,null,'PU_FrmS_Voucher_P_2_5','1',3,'P',0>

‘需要注意的是预置的按钮如果cKeyBefore是什么,如果该按钮还想和系统的按钮〔cKeyBefore对应按钮〕在一个组里面,那么cGroup,cSetGroup最好和该按钮保持一致,如果想另外建一个组,可另外起名,不和系统的上述两字段重名即可.

d) 对外接口

工具栏外部接口

新建一个VB类,命名为class并写入以下方法即可

Public Function Init

Object, msbar As Object>

‘初始化功能,在窗体Toolbar初始化时执行一次

‘objLogin代表UFToolbar上取得的Login信息

‘objForm代表该Toolbar所在的窗体信息

‘objVoucher代表Toolbar所在窗体上的单据控件对象或者单据列表对象

‘msbar代表窗体上的MsToolbar对象

End Function

Public Function InitEx< uftoolbar As Object,other as variant>

‘初始化功能,在窗体Toolbar初始化时执行一次

‘uftoolbar代表窗体上的UFToolbar对象

End Function

Public Function BeforeRunCommand

ByVal objVoucher As Object, ByVal sKey As String, ByVal VarentValue As Variant, ByVal other

As String>

‘执行按钮前执行该方法,objVoucher为单据或列表对象

‘VarentValue为在表中预置的cVariant的值.

‘objLogin代表UFToolbar上取得的Login信息

‘objForm代表该Toolbar所在的窗体信息

‘objVoucher代表Toolbar所在窗体上的单据控件对象或者单据列表对象

‘sKey代表该按钮的ButtonKey

‘VarentValue代表数据库预置的Varent值

End Function

Public Function BeforeRunSysCommand

ByVal objVoucher As Object, ByVal sKey As String, ByVal VarentValue As Variant, ByRef

15 / 20 Cancel As Boolean, ByVal other As String>

‘在执行系统按钮之前调用,Cancel=true后会不再执行系统方法.

Cancel = False则会继续执行系统方法.

‘VarentValue为在表中预置的cVariant的值.

‘objLogin代表UFToolbar上取得的Login信息

‘objForm代表该Toolbar所在的窗体信息

‘objVoucher代表Toolbar所在窗体上的单据控件对象或者单据列表对象

‘sKey代表该按钮的ButtonKey

‘VarentValue代表数据库预置的Varent值

End Function

‘执行按钮,objVoucher为单据或列表对象

‘VarentValue为在表中预置的cVariant的值.

Public Function RunCommand

objVoucher As Object, ByVal sKey As String, ByVal VarentValue As Variant, ByVal other As

String>

‘执行按钮时执行该方法,objVoucher为单据或列表对象

‘VarentValue为在表中预置的cVariant的值.

‘objLogin代表UFToolbar上取得的Login信息

‘objForm代表该Toolbar所在的窗体信息

‘objVoucher代表Toolbar所在窗体上的单据控件对象或者单据列表对象

‘sKey代表该按钮的ButtonKey

‘VarentValue代表数据库预置的Varent值

End Function

4. 复杂场景应用工具栏控件

a) 老版本升级到V11

具体方式和V11.0版本应用工具栏控件相同.可以参考[如何使用工具栏控件]中V11.0版本应用工具栏控件章节.下面主要说明老版本升级到V11需要注意的几个方面:

i. Combobox类型按钮〔显示模板、打印模板按钮〕

显示模板、打印模板按钮是Combobox类型的,预置数据时iToolbarStyle字段要预置成55.

Combobox类型按钮需要在窗体上增加一个Combobox的VB控件,然后初始化时需要将该控件直接作为Tag对象赋值给Toolbar按钮的Tag

代码示例:

Combobox类型按钮代码示例

‘在Form_Load执行完SetToolbar过程后需要对Combobox类型按钮执行初始化操作

If IsObject.TAg> Then

Set s<"PrintTemplate">. = Me TemplatePRN

End If

If IsObject.TAg> Then

16 / 20 Set s<"ShowTemplate">. = Me TemplateShow

End If

‘其中Me TemplatePRN和Me TemplateShow均为Combobox控件

Private Sub CTBCtrl1_OnSelectedIndexChanged

_MENU_OR_BUTTON, ByVal cButtonId As String, ByVal cMenuId As

String, ByVal iSelectedIndex As Integer>

‘要实现该事件来实现界面上的模板切换功能

End Sub

‘先从数据库取数据库赋值给窗体上的MSToolbar

Call lbarfromdata

m_FormCode, "PU", oDicTmp>

‘注意最后一个参数可以不赋值,是无用参数

Set ss = g_business

‘给Toolbar赋Bussiness,注意模态窗体不能赋Bussiness,非模态窗体〔嵌入门户窗体〕必须赋Bussiness

‘然后和以前版本的方式一样给MSToolbar赋值

Call lbar

lor = &HF9F8F6

playStyle PictureText

‘中间可以变换按钮或者菜单的状态,直接变Mstoolbar的状态,类似如下代码

s.ButtonMenus<"CopySCDD">.visible

= False

s.ButtonMenus<"CopySCDD">.enable = False

‘最后应用变换后的结果到UFToolbar上

hVisible

hEnable

Set ar=UFToolbar

mInfo

ii. 注意事项

不要再给MSToolbar设计按钮,按钮直接从数据库加载,不要再给MSToolbar赋ImageList,按钮图片都从数据库加载,不再从ImageList中取

如果是单据界面,需要给单据控件赋Otoolbar对象

Set ar=UFToolbar

无论是单据界面还是列表界面都要给UFToolbar调用SetFormInfo

b) 老版本不升级仍然在V11中使用

对于这种情况.之前开发的按钮应该是自己在窗体上加MSToolbar和UFToolbar,然后直接在MSToolbar上〔设计时〕增加按钮,调用lbar MSToolbar来把MSToolbar上按钮加载到界面上显示的UFToolbar上.之后可以改变MSToolbar上对应按钮的状态,Enable或Visible.然后调用hEnable或hVisible来改变UFToolbar上对17 / 20 应按钮状态.

如果不想迁移到新的方案〔即把按钮或菜单的数据预置到对应数据库表中的方案〕.可能在按钮状态变换的时候会有一些问题,这时候需要调用resh〔即在原来调用RefreshVisible和RefreshEnable的地方调用EndRefresh〕

i. Tag对象约定

MsToolbar的Tag对象在V11中不再被二次开发和业务组开发使用,请不用随意给按钮或者Menu的Tag赋字符串值,如果要赋值,请构造Tag对象赋值〔不建议使用〕

对象结构如下

Tag对象结构

Public Property Get id<> As String//按钮的标识

Public Property Get Image<> As String //按钮的图片名〔不带后缀〕

Public Property Get actionSet<> As String //排版组信息〔对应数据库中的cGroup字段〕Public Property Get toolbarType<> As String //对应数据库的cToolbarType字段,无用

Public Property Get ButtonHeight<> As String //对应数据库的iheightrow字段

Public Property Get ToolbarPos<> As String //对应数据库的ctoolbarPosIndex

Public Property Get VoucherCtlIndex<> As String //对应数据库的iVoucherCtlIndex字段Public Property Get HaveAuth<> As Boolean //标识该按钮是否有权限

Public Property Get ParentKey<> As String //标识该按钮或菜单的父级按钮

Public Property Get BaseTag<> As Variant //未使用

Public Property Get ExtendStyle<> As Integer //对应数据库的iToolBarStyle字段

Public Property Get HotKey<> As String //对应数据库的字段cHotKey

Public Property Get Tag<> As Object //为Combobox按钮而准备的对象,通常直接将Combobox对象赋给该对象即可

Public Property Get ForegroundColor<> As String //对应数据库的cForegroundColor字段

Public Property Get BackgroundColor<> As String //对应数据库的cBackgroundColor字段Public Property Get SetGroup<> As String //对应数据库的cSetGroup字段

Public Property Get SetGroupRow<> As Integer //对应数据库的iSetGroupRow字段

Public Property Let CustomProjectName //对应AA_Formbuttons_base和AA_FormbuttonMenus_base表的ProcessObjectName和FunctionKey ,具体组合方式ProcessObjectName## FunctionKey

老版本不升级到11.0还想在11.0中使用,一般按钮不会出现问题,但是按钮的下拉菜单可能会有问题〔可能会出现菜单点不出来的情况〕.对于这种情况就需要在构造完MSToolbar之后,lbar之前构造每个菜单的Tag属性.代码示例如下

给MSToolbar的Menu构造Tag对象

‘Tag对象的各个属性含义在上面Tag对象约定中已经定义,具体含义可以在上面找

Dim btn As

For Each btn In s

Dim menu As Menu

For Each menu In Menus

Dim objTag As Object

Set objTag = CreateObject<"TagInfo">

= ""

= -1

18 / 20 Set = ""

rType = "PortalToolbar"

Height = 0

rPos = "P"

rCtlIndex

ValidStr>

oundColor = "black"

oundColor = ""

up = ""

upRow = ""

th = True

Style = "" '按钮的扩展样式,详见数据字典的AA_Formbuttons_base表的iToolBarStyle字段

= ""

ProjectName = ""

Key=

= ng<>

Next

Next

=

但是这种情况下可能UE效果不能达到11.0的效果要求,其他的没有影响.

c) 多单据控件界面Toolbar方案

这种情况可参考出厂设置的工序委外模块的设备管理单据.

参考工序委外的设备管理单据预置数据

select*fromAA_FormButtons_baseainnerjoinAA_FormButtonMenus_ode=nKey=ode=N'EQ_Vouchers_02'

查询结果如下图所示:

比如这个设备管理的单子,我们拿一个按钮来说这是设备管理的定位按钮,设备管理上有三个单据控件

表头是一个单据控件〔只有表头项〕,表体是两个单据控件,分别记录文档和设备参数.

因为表头没有排序定位的按钮,所以可以看到上面预置的数据里面字段iVoucherCtrlIndex分别是1和2,没有0的.〔单据控件上有个属性叫Key.如果一个窗体只有一个单据控件,则Key取默认值0即可.不用额外给单据控件赋Key属性.如果界面有多个单据控件,则必须给每个单据控件赋Key属性.这个界面上表头的单据控件的Key=0,表体文档的那个单据控件的Key=1,设备参数那个单据控件的Key=2〕

数据库里面的iVoucherCtrlIndex对应着各个单据控件的Key.将来单据控件上的按钮就靠这个key和cToolbarPosIndex

这两个参数来区分.

预置完成数据之后在界面上可以填充数据库数据到窗体的UFToolbar上

调用UFToolbar的Settoolbarfromdata方法.可参考[如何使用工具栏控件]中V11.0版本应用工具栏控件的相关说明.

代码示例

19 / 20 lbarFromData

= 300 * erPixelY

lor = &HF9F8F6

lbar Toolbar1‘将设计好的MSToolbar加载到UFToolbar上

playStyle PictureText

's<"Print">.ButtonMenus<"mnuPrint">.Enabled = False

's<"PU88_01">.Visible = True

's<"Skip2">.Visible = True

's<"Skip2">.Enabled = True

's<"Print">.Caption = "aaaa"

hVisible

hEnable

然后给Voucher赋Key属性

=0

=1

=2

需要强调的是UFTOolbar的

Public Function SetFormInfo

如果窗体只有一个单据控件,则oVoucher直接赋为那个单据控件即可.

然后给每个Voucher赋Toolbar

Set ar = bar

Set ar = bar

Set ar = bar

如果类似上面的那个窗体,界面上有多个单据控件.为了实现一些公共按钮,第一个参数就有特殊的要求,需要传一个字典类型的数据,把所有的单据控件都传过去.

Dim oDicTmp As Object

If oDicTmp Is Nothing Then Set oDicTmp = CreateObject<"nary">

, voucher1

, voucher2

, voucher3

这时的oVoucher是oDicTmp

mInfo

20 / 20

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689246598a225625.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信