9.事件

Supcan FreeForm的OnEvent( id, Event, p1, p2, p3, p4 )事件含义及参数分别如下：

分组 | Event | 含义 | p1 | p2 | p3 | p4
--- | --- | --- | --- | --- | --- | ---
输入 | EditChanged | 某输入框内容已修改 | id |  |  |
备注：包括Checkbox、RadioButton
文件上传控件的上传文件有变动 | id |  |  |
备注：通常在关闭对话框后
EditKeydown | 输入框的键盘动作 | id | 键的ASCII码，例如回车是13、空格是32 | 见备注2 |
备注1：EditKeydown 和 EditChar 事件均为在输入框中的键盘事件，EditKeydown 能捕获几乎所有键盘动作，包括非字符的回车、Tab等；而 EditChar 事件则以输入的字符为主，包括中文;
备注2：p3的含义为: 1-Ctrl键也按下了； 2-Shift键也按下了； 3-二者一起按下了
备注3：您可以执行全局函数 CancelEvent( ) 去阻止继续执行，就如事件没有发生过那样，但不同的ASCII码，您需要在这两个事件中挑选一个执行CancelEvent( )，具体请在演示页“12.事件”中去测试
EditChar | 输入框的键盘字符 | id | 字符的ASCII码 |  |
备注：EditKeydown 和 EditChar 事件均为在输入框中的键盘事件，EditKeydown 能捕获几乎所有键盘动作，包括非字符的回车、Tab等；而 EditChar 事件则以输入的字符为主，包括中文;
LooseFocus | 某输入框已失去焦点 | id | 下一个焦点的id (仅和键盘动作有关) |  |
BeforeDropdown | 某输入框的下拉 List 或下拉 Treelist 正准备下拉 | id |  |  |
备注：可执行全局函数CalcelEvent( )阻止继续执行, 但仅对下拉Treelist有效, 对下拉List无效
DropdownSelChanged | 某下拉的下拉行被鼠标选择了 | id | 1 - 数据有变化 0 - 数据无变化 |  |
按钮 | ButtonClicked | 情形1: 某按钮已Clicked | id |  |  |
备注：支持 CancelEvent 全局函数阻止继续执行
情形2: 鼠标点到下拉 DropTreelist 弹出窗的自定义按钮上 | id |  | DropdownButton | 自定义按钮的 id
Text | HyperLink | 鼠标点击了超链接的Text | id号 |  |  |
分页器 | BeforePager | 分页触发前 | id号 | 开始行 | 每页行数 |
备注：支持 CancelEvent 全局函数取消分页
Pager | 分页触发后 | id号 | 开始行 | 每页行数 |
选项卡 | BeforeSelChanged | 选项卡(Tab)切换前 | 老的页签的序号 | 新的页签的序号 | 新的页签的ID | 见备注1
备注1：p4参数含义为: 0表示第一次展现, 1表示已经被展现过
备注2：支持 CancelEvent 全局函数阻止继续执行
SelChanged | 选项卡(Tab)切换后 | 老的页签的序号 | 新的页签的序号 | 新的页签的ID | 见备注
备注：p4参数含义为: 0表示第一次展现, 1表示已经被展现过
BeforeClosed | 选项卡某页签被手工关闭前 | 页签的序号 |  | 页签的ID |
备注：支持 CancelEvent 全局函数取消关闭
Closed | 选项卡某页签已经被手工关闭 | 页签的序号 |  | 页签的ID |
BeforeExchanged | 选项卡被拖拽交换位置前 | 被拖拽的页签id | 交换前的各个页签id排列顺序,逗号分隔 | 交换后的各个页签id排列顺序,逗号分隔 |
备注：支持 CancelEvent 全局函数取消该动作
Exchanged | 选项卡被拖拽交换位置 | 被拖拽的页签id | 交换前的各个页签id排列顺序,逗号分隔 | 交换后的各个页签id排列顺序,逗号分隔 |
ImageFlow | ImageClicked | 鼠标点到某图 | id号 | text | url |
ImageDblClicked | 鼠标双击某图 | id号 | text | url |
MouseMoveIn | 鼠标移入某图 (仅style=horz) | id号 | text | url |
MouseMoveOut | 鼠标移出某图 (仅style=horz) | id号 | text | url |
Freeform- Tree | FreeformTreeClicked | 鼠标单击树的某节点 | FreeformTree的id | 数据的id |  |
FreeformTreeDblClicked | 鼠标双击树的某节点 | FreeformTree的id | 数据的id |  |
Toolbar | MenuClicked | 工具条对应的菜单项已选中 | 菜单item的id |  |  |
菜单按钮 | MenuBeforePopup | 鼠标点击某动态菜单按钮之后、在将要弹出菜单之前 | 按钮控件的id | 该控件的menuID |  |
鼠标点击在 enableDefaultMenu="true" 的某动态菜单按钮的左侧 | 按钮控件的id | 该控件的menuID | Left |
鼠标点击在 enableDefaultMenu="true" 的某动态菜单按钮的右侧 | 按钮控件的id | 该控件的menuID | Right |
MenuClicked | 菜单按钮的菜单项已选中 | 菜单item的id |  |  |
文件上传 | Upload | 有文件上传成功 | 文件顺序号 | 文件总数 | 见备注 |
备注：如果是分块上传, p3参数是类似这样的串: "FileParts=33;CurrentFilePart=2;PassTime=00:02:33;RemainTime=00:01:30;Speed=50", 其含义如下： FileParts - 总块数; CurrentFilePart - 刚上传的块序号; PassTime - 已耗用的时间(时:分:秒); RemainTime - 估计还需要时间(时:分:秒); Speed - 测算到的网速，单位为 千字节/秒; 此外，如果是将一个目录压缩成zip包上传，那么第一个Upload消息肯定是“Compressed=true”
文件上传过程中有异常 |  |  |  | 异常信息
异步方式调用全局函数 httpPostLocalFile 触发的 | 本地文件名 | 服务器返回的串 | 硕正插件捕捉到的异常错误串 |
文件下载 | Download | 文件异步下载成功 | 任务ID号 | 文件名 (若toString=true则为纯数字串形式的内存块句柄, 可用全局函数 GetDataString访问) |  |
文件异步下载失败 | 任务ID号 | 文件名 | 错误信息 |
文件异步下载中 | 任务ID号 |  |  | 见备注
备注1：异步方式调用全局函数 Download 将触发本事件
备注2：p4是类似这样的串: "FileSize=1002034;CurrentSize=200030;PassTime=00:02:33;RemainTime=00:01:30;Speed=50", 其含义如下: FileSize - 文件总长度(字节); CurrentSize - 已下载的长度(字节); PassTime - 已耗用的时间(时:分:秒); RemainTime - 估计还需要时间(时:分:秒); Speed - 测算到的网速，单位为 千字节/秒
| RButtonClicked | 鼠标右键点击 | 右键点中 Object 的 ID 号 (也可能为空串), 若有多个ID, 则相互以逗号分隔 |  |  |
备注：可以在本事件中调用全局函数 Menu 自行弹出菜单
DataReach | 已经访问了 dataURL(包括 Load 函数访问) 并得到了数据，但尚未应用该数据 | 内存块的句柄(为一纯数字串) | URL |  |
备注1：可以用全局函数 GetDataString / SetDataString 取得或更改内存块中的数据
备注2：可以用上述2个函数存取数据，但不宜过多调用其它函数，否则会造成不稳定
DropDownDataReach | 某个异步加载数据的下拉已经获得了数据并已完成加载 | 某个下拉资源的 id - 表示此下拉数据已经到达 Complete! - 所有异步下拉的数据已全部到达 |  |  |
备注1：异步访问http的下拉列表、下拉树列表在初始加载数据时触发
备注2：同步加载数据的下拉不会触发本事件
备注3：当全部异步下拉都完成加载后，本事件会再次被触发，p1是固定的串 "Complete!"
HotKey | 触发了快捷键 | 快捷键 | id号,如果正在输入的话 |  |
Device | 设备事件(如扫描仪) | Twain - 表示是扫描仪的事件 | 1 - 扫描成功 2 - 用户取消了操作 3 - 文件写入失败 4 - 未发现可用扫描仪 | 扫描仪扫描成功的文件名, 多个文件间以回车符分隔 |
UserEvent | 全局函数 PostMessage 发出的自定义事件 | 自定义 | 自定义 | 自定义 | 自定义
CacheSaved | 全局事件，请参见全局函数 ListenEvent | 缓存的ID |  |  |
组件id.事件名 | 内部的大粒度组件的事件 | 和组件有关 | 和组件有关 | 和组件有关 | 和组件有关

事件的js用法可参见“事件、按钮、菜单、工具条”Demo页。