一、与 VBA 窗体的差异

WPS JSA 也提供了用户窗体,用户也可以通过拖控件的方式,制作自己的对话框,以完成宏编程中的交互任务。
但它与 VBA 中的用户窗体有很大的不同:

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

二、一些技巧

  1. 虽然无法直接修改界面元素的名称,但是界面是基于 XML 的,你可以通过这个 XML 文件修改控件元素的名称,无论是窗体本身,还是控件元素,都可以。
  2. 通过动态的生成界面模块的 xml 元素,来生成动态的界面。

三、吐槽

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