一、与 VBA 窗体的差异
WPS JSA 也提供了用户窗体,用户也可以通过拖控件的方式,制作自己的对话框,以完成宏编程中的交互任务。
但它与 VBA 中的用户窗体有很大的不同:
- 界面与事件逻辑分离,界面元素的绘制是一个模块,事件逻辑放在之外的模块,不是嵌入到窗体界面模块的。
- 界面元素的
Name
属性不可修改,属性编辑器中也不提供这个属性。虽然在官方文档上说的是支持修改,但从 JSA 事件订阅入口,即可知道,Name
属性可能在以后的升级版本中也无法修改,因为它的名称不变,才能方便事件订阅,也就是事件订阅机制锁死了这方面的改进的可能性。 - 界面对象绘制完成后,它是一个实例,不是一个类型,不允许使用 new 语句,来构造它的新实例
- 只有顶级容器,也就是窗体本身有
Controls
成员,且它是一个方法,不是集合,它只接受字符串的Name
参数,不接受 Index 参数,且 Name 参数不可省,无法直接得到整个子控件集合 - 因为无法得到整个子控件集合,也就无法对它进行动态的添加控件
- 控件元素都有
Move(Left, Top, Width, Height)
方法,窃以为拆分成Move(Left, Top)
和Resize(Width, Height)
,更符合逻辑 - 再没有
Load/Unload
了,都是Show()/Hide()
方法,这很好,这是面向对象的。 - 新增了
HLayout/VLayout/HSpacer/VSpacer
控件,用来协助布局控件,有了它们你可以更方便地拖控件了 - 导出的界面模块,可以使用文本编程器查看,因为它是使用 xml 来组织描述界面元素的。
二、一些技巧
- 虽然无法直接修改界面元素的名称,但是界面是基于 XML 的,你可以通过这个 XML 文件修改控件元素的名称,无论是窗体本身,还是控件元素,都可以。
- 通过动态的生成界面模块的 xml 元素,来生成动态的界面。
三、吐槽
- 相较于 VBA 的用户窗体,JSA 的用户窗体太死板了,主要体现在:
- 不能对控件集合,动态增删新控件,动态性太差,想要玩儿点花活儿,比如按需求动态生成界面,是不可能的。当然,就这一点而言,因为这只是初版,也许以后升级可以支持这个,这本身也不会破坏现有的规则。只需要在不给
Controls(Name)
传递参数时,返回整个控件集合就好,这样就可以在这个集合上进行动态增删控件了。也即只需要增量改进即可,其它容器控件添加上Controls(Name)
方法,也不是难事儿。 - 修改控件元素的
Name
是无效的,简单的界面还好,控件多了,分组多了,很容易乱套 - 创建的窗体界面,它不是一个类型,而是一个实例,不允许new 出新实例,这一点都不面向对象
- 不能对控件集合,动态增删新控件,动态性太差,想要玩儿点花活儿,比如按需求动态生成界面,是不可能的。当然,就这一点而言,因为这只是初版,也许以后升级可以支持这个,这本身也不会破坏现有的规则。只需要在不给
- 连
ZOrder
或者BringToFront()/SendToBack()
,都不支持,控件堆叠是不可能的了 CommandButton
的类型实际上是PushButton
,连官方文档上都是CommandButton
,这叫用户如何是从啊。而且直接访问这个PushButton
也是不存在的,而且CommandButton
也不存在