WPS JSA 宏编程(JS):7.用户窗体

一、与 VBA 窗体的差异

WPS JSA 也提供了用户窗体,用户也可以通过拖控件的方式,制作自己的对话框,以完成宏编程中的交互任务。

但它与 VBA 中的用户窗体有很大的不同:

  1. 界面与事件逻辑分离,界面元素的绘制是一个模块,事件逻辑放在之外的模块,不是嵌入到窗体界面模块的。
  2. 界面元素的 Name 属性不可修改,属性编辑器中也不提供这个属性。虽然在官方文档上说的是支持修改,但从 JSA 事件订阅入口,即可知道,Name 属性可能在以后的升级版本中也无法修改,因为它的名称不变,才能方便事件订阅,也就是事件订阅机制锁死了这方面的改进的可能性。
  1. 界面对象绘制完成后,它是一个实例,不是一个类型,不允许使用 new 语句,来构造它的新实例
  2. 只有顶级容器,也就是窗体本身有 Controls 成员,且它是一个方法,不是集合,它只接受字符串的 Name 参数,不接受 Index 参数,且 Name 参数不可省,无法直接得到整个子控件集合
  1. 因为无法得到整个子控件集合,也就无法对它进行动态的添加控件
  2. 控件元素都有 Move(Left, Top, Width, Height) 方法,窃以为拆分成 Move(Left, Top)Resize(Width, Height),更符合逻辑
  1. 再没有 Load/Unload 了,都是 Show()/Hide() 方法,这很好,这是面向对象的。
  2. 新增了 HLayout/VLayout/HSpacer/VSpacer 控件,用来协助布局控件,有了它们你可以更方便地拖控件了

 

二、吐槽

  1. 相较于 VBA 的用户窗体,JSA 的用户窗体太死板了,主要体现在:
    1. 不能对控件集合,动态增删新控件,动态性太差,想要玩儿点花活儿,比如按需求动态生成界面,是不可能的。当然,就这一点而言,因为这只是初版,也许以后升级可以支持这个,这本身也不会破坏现有的规则。只需要在不给 Controls(Name) 传递参数时,返回整个控件集合就好,这样就可以在这个集合上进行动态增删控件了。也即只需要增量改进即可,其它容器控件添加上 Controls(Name) 方法,也不是难事儿。
    2. 修改控件元素的 Name 是无效的,简单的界面还好,控件多了,分组多了,很容易乱套
    1. 创建的窗体界面,它不是一个类型,而是一个实例,不允许new 出新实例,这一点都不面向对象
  1. ZOrder 或者BringToFront()/SendToBack(),都不支持,控件堆叠是不可能的了
  2. CommandButton 的类型实际上是 PushButton,连官方文档上都是 CommandButton,这叫用户如何是从啊。而且直接访问这个 PushButton 也是不存在的,而且 CommandButton 也不存在

 

三、总结

基于以上了解,JSA 的用户窗体,还非常初级,死板而孱弱,功能也不健全。直接用基于网页的 HTA 都要比它强。

还不如直接在文档中使用代码绘制控件,用这种方式封装出一个库,也比现在这个要强,要好用。

渣渣渣。。。也就将将满足可用,远远谈不上强大,更没有任何灵活性。

希望官方推倒重来,这套界面,无论是类型系统,还是窗体模块的组织形式,事件的订阅机制,整个都太差劲了,远古 UI 也比这个健全、强大吧。

.NET WinForm 风格的 UI 就很不错,既灵活,又强大。建议用这套风格实现一套 UI。

posted @ 2021-09-05 21:21  nutix  阅读(5614)  评论(0编辑  收藏  举报