WPS JSA 宏编程(JS):7.用户窗体
一、与 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
控件,用来协助布局控件,有了它们你可以更方便地拖控件了
二、吐槽
- 相较于 VBA 的用户窗体,JSA 的用户窗体太死板了,主要体现在:
- 不能对控件集合,动态增删新控件,动态性太差,想要玩儿点花活儿,比如按需求动态生成界面,是不可能的。当然,就这一点而言,因为这只是初版,也许以后升级可以支持这个,这本身也不会破坏现有的规则。只需要在不给
Controls(Name)
传递参数时,返回整个控件集合就好,这样就可以在这个集合上进行动态增删控件了。也即只需要增量改进即可,其它容器控件添加上Controls(Name)
方法,也不是难事儿。 - 修改控件元素的
Name
是无效的,简单的界面还好,控件多了,分组多了,很容易乱套
- 创建的窗体界面,它不是一个类型,而是一个实例,不允许new 出新实例,这一点都不面向对象
- 连
ZOrder
或者BringToFront()/SendToBack()
,都不支持,控件堆叠是不可能的了 CommandButton
的类型实际上是PushButton
,连官方文档上都是CommandButton
,这叫用户如何是从啊。而且直接访问这个PushButton
也是不存在的,而且CommandButton
也不存在
三、总结
基于以上了解,JSA 的用户窗体,还非常初级,死板而孱弱,功能也不健全。直接用基于网页的 HTA 都要比它强。
还不如直接在文档中使用代码绘制控件,用这种方式封装出一个库,也比现在这个要强,要好用。
渣渣渣。。。也就将将满足可用,远远谈不上强大,更没有任何灵活性。
希望官方推倒重来,这套界面,无论是类型系统,还是窗体模块的组织形式,事件的订阅机制,整个都太差劲了,远古 UI 也比这个健全、强大吧。
.NET WinForm 风格的 UI 就很不错,既灵活,又强大。建议用这套风格实现一套 UI。