全局函数

所谓全局函数是一组公共的函数，硕正的所有组件都拥有几乎完全一样的函数形式. 全局函数分如下几类：
1.对话框函数
1.1.非模式对话框函数
1.2.模式对话框函数
2.消息框函数
3.下拉List管理函数
4.Validations管理函数
5.对表达式和计算函数的封装
6.DOM函数
7.其它函数

1.对话框函数

全局函数中有二组对话框函数。通过调用对话框函数，您能够打开一个对话框。对话框是以 一个FreeForm 作为显示样式的，其内容完全自定义.
硕正的对话框分为 模式对话框 和 非模式对话框 二种，模式对话框是Windows的标准对话框，当对话框出现时, 主线程是阻塞的，直到对话框关闭；而非模式对话框则是在控件的内部浮现出一个freeform，主线程不会阻塞.
非模式对话框的好处，是在打开对话框时不影响其它Tab选项卡 - 用户仍能正常切换选项卡. 此外，由于线程不阻塞，对话框中的 freeform 的子控件的事件能触发到页面的OnEvent( )中，能实现与页面的交互，这一点非常有用.

1.1.非模式对话框函数 |

非模式对话框是悬浮在组件中央的一个FreeForm，同时组件本身呈半透明、非活动状态.
并不是所有组件都支持内嵌的非模式对话框的，如下组件是支持的(即支持本组函数)：
Treelist / Freeform / Freeform设计器 / Report / Tree / Chart.
非模式对话框 和 它的容器(即组件本身)都会触发页面的OnEvent( )事件，为了相互区分，您应该在事件中调用 IsInnerDialogOpen( ) 这个函数来判断，这一点非常重要，具体请参见自有表头的演示页：“13.基于Freeform的对话框”、“15.辅助Treelist输入(2)”。

分类 | 函数名 | 用途
--- | --- | ---
非模式对话框函数 | SetDialogFreeForm | 指定对话框的Freeform
SetDialogPara | 指定对话框的参数
OpenInnerDialog | 打开非模式对话框
CloseInnerDialog | 关闭非模式对话框
IsInnerDialogOpen | 非模式对话框是否正打开着

函数详解:

SetDialogFreeForm | 指定对话框的Freeform |
参数 | FreeForm的URL(相对或绝对)，或者直接就是XML大串
返回值 | (无)

SetDialogPara | 指定对话框的参数 |
参数 | 可选，可以是如下属性值(多个属性间以分号(;)分隔)： width / height - 宽度和高度，可以是百分比(如"80%"，相对于组件的宽/高)、整数(绝对像素数)，默认都是80%; ExtWidth / ExtHeight - 扩展宽度/高度, 默认分别是20/14; 备注：扩展宽度/高度表示对话框右、下方预留的空白边界. IdFocus(或FocusId) - 指定定位焦点，如果为空，则按freeform的TabOrder自动定位; bgColor(或backColor) - 组件被遮罩的底色，默认是#C8C8C8; alpha - 遮罩时组件画面的透明度, 0-255, 默认是70;
返回值 | (无)

OpenInnerDialog | 打开非模式对话框 |
参数 | 加载的数据的URL, 或直接就是XML/JSON大串，用于为FreeForm赋初值
返回值 | 成功 - 返回对话框的freeform的句柄(一个整数串); 失败 - 空串, 原因通常为：freeform的XML模版不存在、或对话框已经打开着
备注 | 由于函数返回了freeform的句柄，所以您可以以扩展函数的方式调用freeform的所有函数
备注 | 关闭后，Freeform并未被销毁，您仍然可以使用这个返回的句柄，通过扩展函数存取freeform中的内容
示例 | //打开 freeform 弹窗, 并取得句柄 var h = AF.func("OpenInnerDialog", ""); //弹出的 freeform 中有选项卡、树列表, 要对其执行函数, 必须是如下这种扩展函数的形式 AF.func(h + "tab1.T.Load", "treelistdata/data60.tsv-ex.txt");

CloseInnerDialog | 关闭非模式对话框 |
参数 | (无)
返回值 | 成功 - 返回对话框的freeform的句柄(一个整数串); 失败 - 空串, 对话框本来就没有打开

IsInnerDialogOpen | 或"IsInnerDialogOpened"，非模式对话框是否正打开着 |
参数 | (无)
返回值 | 1 / 0
备注 | 该函数很重要，常用于在OnEvent( )事件中判断当前的消息发送者.

1.2.模式对话框函数 |

模式对话框的FreeForm至少要有1个Button，但不支持菜单、下拉菜单按钮、分页器.
模式对话框弹出后，如果用户按下其中的Button，对话框随即关闭，并返回Button按钮的ID。
由于模式对话框是线程阻塞的，对话框中的控件的事件是无法被页面拦截的。模式对话框的函数分类说明如下:

分类 | 函数名 | 用途
--- | --- | ---
模式对话框函数 | SetDialogFreeForm | 指定对话框的Freeform
SetDialogPara | 指定对话框的标题等参数
OpenDialog | 打开模式对话框
GetDialogValues | 取得刚关闭的对话框中的FreeForm的所有input的输入内容
GetDialogValue | 取得刚关闭的对话框中的FreeForm的某个input的输入内容
GetDialogIDs | 取得刚关闭的对话框中的FreeForm中的所有ID

函数详解:

SetDialogFreeForm | 指定对话框的Freeform |
参数 | FreeForm的URL(相对或绝对)，或者直接就是XML大串
返回值 | (无)
备注 | 该Freeform中必须要有一个按钮控件，否则不起作用

SetDialogPara | 指定对话框的标题等参数 |
参数 | 可选，可以是如下属性值(多个属性间以分号(;)分隔)： title - 对话框窗口的标题 IdOk(或OkId) - 相当于“确认”的按钮的id, 点击后能自动执行Freeform的 Validate( ) 验证函数; IdFocus(或FocusId) - 指定定位焦点，如果为空，则按freeform的TabOrder自动定位; ExtWidth / ExtHeight - 扩展宽度/高度, 默认分别是20/14; 备注：扩展宽度/高度表示对话框右、下方预留的空白边界.
返回值 | (无)
示例 | AF.func("SetDialogPara", "title=警告; ExtWidth=20; ExtHeight=20");

OpenDialog | 打开模式对话框 |
参数 | 可选，加载的数据的URL, 或直接就是XML/JSON大串，用于为FreeForm赋初值
返回值 | 鼠标点击Freeform中的Button按钮的ID
备注 | 1.如果未弹出对话框，可能是Freeform的URL不正确、或Freeform中没有Button导致; 2.本函数执行时，线程进入阻塞状态，直到对话框关闭，本函数才返回.
示例 | AF.func("OpenDialog", "{price:20, date1:2010.12.20, checked:true}");

GetDialogValues | 取得刚关闭的对话框中的FreeForm的所有input的输入内容 |
参数 | 可选，可以为 XML / JSON, 默认是XML
返回值 | XML或JSON串
备注 | 如果返回JSON串，可能是类似这样的：{"price":"20", "date1":"2010.12.20", "checked":"1"}

GetDialogValue | 取得刚关闭的对话框中的FreeForm的某个input的输入内容 |
参数 | Input的ID 如果是串 @freeform, 表示取得该freeform的ID(在freeform的XML的 <Properties> 中定义的ID)
返回值 | 该input的输入内容

GetDialogIDs | 取得刚关闭的对话框中的FreeForm中的所有ID |
参数 | (无)
返回值 | 以逗号分隔的所有ID

2.消息框函数 |

消息框是指在组件中心位置呈现出的时尚的提示框、数据加载中的小对话，有了这批函数，您可以自己操控这些提示信息了. 函数主要有２个: MessageBoxFloat、MessagaePoint, 也可以简写为 MsgFloat、MsgPoint.
消息框显示的文字，支持部分类似HTML的元素，使得文字内容可以较为灵活地呈现，例如代码:

    var text = "<br>   今晚<font color=red>21:00</font>整，请第二工组到二号库房集合，一起将发往<b>通州、<br>宁波</b>的货物清点";
    text += "完毕，第三工组请打扫货车，并检查核对货柜.<br>";
    text += "                  <image>res/capu.png</image>  <i>谢谢!</i>";
    AF.func("msgFloat", text + "\r\n hold=0;pos=browser;buttonText1=我请事假;buttonWidth1=120;buttonId1=1112;buttonText2=收到;buttonId2=1000;buttonWidth2=120");
    //注: buttonId是给事件消息用的，因为消息框不是模式对话框，不阻塞主线程，点击按钮将触发 UserEvent 事件

呈现的效果是:
如下是树列表的 "12.事件" 示例，在 MouseMoveIn 事件中执行了 MessageBoxPoint函数:
文字仅支持如下类似HTML的元素:

元素名 | 规则 | 元素名 | 规则
--- | --- | --- | ---
b | 文字加粗 | i | 文字倾斜
br | 换行,也可以用\\r\\n代替 | center | 文字(或图片)居中显示
font | 文字颜色和字体，例如<font face="Consolas,Courier New" color="#ff0000">21:00</font> 支持的属性: 仅 color、face 属性 | image | 嵌入图片,如 <image>res/capu.png</image>, 也可以是一个 Base64 串 支持的属性: height, width, 用以指定显示尺寸

分类 | 函数名 | 用途
--- | --- | ---
消息框函数 | MessageBoxFloat(语法1) | 弹出Supcan风格的能自动关闭的浮动提示框
MessageBoxFloat(语法2) | 弹出Supcan风格的能自动关闭的浮动提示框
MessageBoxPoint(用途1) | 弹出Supcan风格的指向某单元格的提示框(for Treelist、Report)
MessageBoxPoint(用途2) | 弹出Supcan风格的指向某输入框的提示框(for Freeform)
MessageBoxPoint(用途3) | 弹出Supcan风格的指向当前控件的提示框(for Edit、Upload等)
MessageBoxPoint(用途4) | 弹出Supcan风格的指向当前光标处的提示框
CloseMessageBox | 强制关闭提示框
OpenLoadMask | 显示含义为“加载中”的小动画
CloseLoadMask | 关闭含义为“加载中”的小动画

函数详解:

MessageBoxFloat(语法1) | 弹出Supcan风格的能自动关闭的浮动提示框，也可简写为MsgFloat |
参数1 | 具体的文字串
参数2 | 标题，可选，可含如下文字之一：Warn、Success、Fail、Error、Prompt(可以更长，包含即可，例如Successful、Warning均合法)，默认是Prompt
参数3 | 左侧小图标，可选，可含如下文字之一：Stop、Success、Question、Info(可以更长，包含即可，例如Successful、Information均合法)，默认是Info
返回值 | (无)
备注 | 参数2 和 参数3 次序可以颠倒
示例 | xml = xml.replace(/\r\n/g, "\\r\\n"); //把串中原有的回车符全部转换成\\r\\n AF.func("MessageBoxFloat", xml + "\r\n Warning \r\n Information");

MessageBoxFloat(语法2) | 弹出Supcan风格的能自动关闭的浮动提示框，也可简写为MsgFloat |
参数1 | 具体的文字串
参数2 | 属性串，以分号(;)分隔，可以有如下"属性=值"对： title - 标题，可含如下文字之一：Warn、Success、Fail、Error、Prompt(可以更长，包含即可，例如Successful、Warning均合法)，默认是Prompt; icon - 左侧小图标，可含如下文字之一：Stop、Success、Question、Info(可以更长，包含即可，例如Successful、Information均合法)，默认是Info; hold - 保留的时间(单位：秒)，0表示永远显示，点击它才关闭. 它的默认值和icon有关(不是很精确): Success - 2.5秒; Info - 3.5秒; Question - 4.5秒; Stop - 永远显示; pos - 位置, 如果是串"cursor"，表示当前鼠标位置；否则, 可以是如下子串的组合(逗号分隔): supcan(相对于硕正控件), browser(相对于浏览器), screen(相对于显示器), center(中心对齐), left(左对齐), right(右对齐), top(上对齐), bottom(下对齐). 默认是"supcan, center"; 以及如下的位于底部的自定义按钮: ButtonText - 按钮的文字; ButtonWidth - 按钮的宽度，单位是像素，如果不定义宽度，系统将自动算出一个合适的. ButtonId - 按钮的Id, 须为大于0的数字, 相当于功能号，用于消息通知。由于该消息框不是阻塞线程的对话框，所以点击按钮将触发名为 UserEvent 的事件，事件的 P1 参数就是该 Id 号。注：如果不定义Id, 将不触发 UserEvent 事件; 此外，也支持同时安置多个按钮，写法是在上述属性后面加1、2..序号，请参考下面的例子。
返回值 | (无)
示例 | xml = xml.replace(/\r\n/g, "\\r\\n"); //把串中原有的回车符全部转换成\\r\\n AF.func("MessageBoxFloat", xml + "\r\n title=Warning; icon=Information; hold=0; pos=screen,bottom,right"); //安置多个按钮 AF.func("MessageBoxFloat", "您确认要保存吗?\r\n title=Warning; ButtonText1=确认;ButtonText2=取消;ButtonId1=123");

MessageBoxPoint(用途1) | 用于Treelist、Report，弹出Supcan风格的能自动关闭的指向某单元格的浮动提示框，也可简写为MsgPoint |
参数1 | 行号
参数2 | 列号，或列名(for Treelist)
参数3 | 接下去的参数接续了和MessageBoxFloat一样的语法(除了不支持 "center")，请参考MessageBoxFloat
返回值 | (无)

MessageBoxPoint(用途2) | 用于Freeform，弹出Supcan风格的能自动关闭的指向某输入框的浮动提示框，也可简写为MsgPoint |
参数1 | Freeform中的输入控件的ID号
参数2 | 接下去的参数接续了和MessageBoxFloat一样的语法(除了不支持 "center")，请参考MessageBoxFloat
返回值 | (无)

MessageBoxPoint(用途3) | 用于Edit、Upload，弹出Supcan风格的能自动关闭的指向当前控件的浮动提示框，也可简写为MsgPoint |
参数 | 参数和MessageBoxFloat一样(除了不支持 "center")，请参考MessageBoxFloat
返回值 | (无)

MessageBoxPoint(用途4) | 用于Treelist、Freeform、Report、Edit、Upload，弹出Supcan风格的能自动关闭的指向当前光标的浮动提示框，也可简写为MsgPoint |
参数 | 固定的串 "Cursor"
参数 | 参数和MessageBoxFloat一样(除了不支持 pos 属性)，请参考MessageBoxFloat
返回值 | (无)
示例 | xml = xml.replace(/\r\n/g, "\\r\\n"); //把串中原有的回车符全部转换成\\r\\n AF.func("MsgPoint", "Cursor \r\n" + xml + "\r\n title=Warning; icon=Information; hold=0");

CloseMessageBox | 强制关闭提示框, 也可以简写为CloseMsg |
参数 | (无)
返回值 | (无)

OpenLoadMask | 显示含义为“加载中”的小动画()。用于js发送独立的Ajax请求时，让控件呈现"正在加载中"的动画效果 |
参数 | 延迟的毫秒数，默认500，表示500毫秒后才显示这个动画.
返回值 | (无)
备注 | 随后必需关闭动画，否则永远在动画中。关闭动画有2种途径： 1.调用下面的 CloseLoadMask 立即关闭； 2.调用Treelist、Freeform的Load( )函数后，动画会自动关闭的;

CloseLoadMask | 关闭含义为“加载中”的小动画 |
参数 | (无)
返回值 | (无)

3.下拉List管理函数 |

全局函数中还有一组用于操控下拉List的函数，能单独存取List的内容。下拉List的句柄是通过GetHandle( )函数获取的.

分类 | 函数名 | 用途
--- | --- | ---
下拉List函数 | DropList_Add | 往下拉List中添加 Key-Value 对
DropList_Insert | 往下拉List中插入一个Key-value对
DropList_Delete | 删除下拉List中某个Key
DropList_DeleteAll | 清除下拉List的全部内容
DropList_GetItems | 取得下拉List的记录总条数
DropList_Find | 根据Key从下拉List中查找Value
DropList_GetKey | 从下拉List中顺序取得Key
DropList_GetValue | 从下拉List中顺序取得value
DropList_SetValue | 更改下拉List中某个Key对应的value

函数详解:

DropList_Add | 往下拉List中添加 Key-Value 对 |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 键(key)
参数3 | 值(value)
返回值 | 1 - 成功，空串 - 失败，失败的原因通常为Key已经存在

DropList_Insert | 往下拉List中插入一个Key-value对 |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 位置的键(key)，表示位于这个key插入
参数3 | 键(key)
参数4 | 值(value)
返回值 | 1 - 成功，空串 - 失败，失败的原因通常为位置的键(Key)不存在、或新的Key已经存在

DropList_Delete | 删除下拉List中某个Key |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 键(key)
返回值 | 1 - 成功，空串 - 失败，失败的原因通常为Key不存在

DropList_DeleteAll | 清除下拉List的全部内容 |
参数 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
返回值 | (无)

DropList_GetItems | 取得下拉List的记录总条数 |
参数 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
返回值 | 数量

DropList_Find | 根据Key从下拉List中查找Value |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 键(key)
返回值 | 值(Value)

DropList_GetKey | 从下拉List中顺序取得Key |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 顺序号，从0开始
参数3 | 可选，true/false, 表示是否按照下拉中的显示顺序，默认false, 仅用于isSortByKey="true"的情形
返回值 | 键(key)的内容

DropList_GetValue | 从下拉List中顺序取得value |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 顺序号，从0开始
参数3 | 可选，true/false, 表示是否按照下拉中的显示顺序，默认false, 仅用于isSortByKey="true"的情形
返回值 | 值(value)的内容

DropList_SetValue | 更改下拉List中某个Key对应的value |
参数1 | 下拉List的句柄 (注: 通过GetHandle( )函数获取)
参数2 | 键(key)
参数3 | 值(value)
返回值 | 1 - 成功，空串 - 失败，失败的原因通常为键(Key)不存在

4.Validations管理函数 |

本函数集用于单独管理 Treelist 或 Report 中的<Validations>.

分类 | 函数名 | 用途
--- | --- | ---
Validation函数 | Validation_Get | 取得某id的Validation的内容
Validation_GetIds | 取得所有Validation的ID
Validation_Set | 更改或添加Validation
Validation_Add | 添加Validation
Validation_Delete | 删除某id的Validation
Validation_DeleteAll | 删除所有Validation

函数详解:

Validation_Get | 取得某id的Validation的内容 |
参数1 | Validation的句柄
参数2 | Validation的id
返回值 | 该Validation的JSon串

Validation_GetIds | 取得所有Validation的ID |
参数 | Validation的句柄
返回值 | ID, 多个ID间以逗号分隔

Validation_Set | 更改或添加Validation |
参数1 | Validation的句柄
参数2 | Validation的id，如果该id不存在，就添加
参数3 | 该Validation的JSon串，或以分号分隔的"key=value"格式串
返回值 | (无)
示例 | var h = AF.func("GetHandle", "Validation"); //取得句柄 AF.func("Validation_Set", h+"DJ1 \r\n {'errorText':'价格不对', 'validation':'price>0'}");

Validation_Add | 添加Validation |
参数1 | Validation的句柄
参数2 | Validation的JSon串，或以分号分隔的"key=value"格式串
返回值 | (无)

Validation_Delete | 删除某id的Validation |
参数1 | Validation的句柄
参数2 | Validation的id
返回值 | (无)

Validation_DeleteAll | 删除所有Validation |
参数 | Validation的句柄
返回值 | (无)

5.对表达式和计算函数的封装 |

#### 5.1.对表达式的封装

硕正内部有一表达式解析引擎，它能高效地处理报表、树列表组件的公式表达式，表达式的书写规则在“开发者指南 \ 公共内容” 中的 “表达式” 有专门的介绍，通过如下2个API函数，您也可以单独调用该功能.

分类 | 函数名 | 用途
--- | --- | ---
表达式函数 | RunExp | 执行表达式
ParseExp | 解析表达式

函数详解:

RunExp | 执行表达式 |
参数 | 表达式串
返回值 | 结果，如果执行有误，返回的是"[Err!]"
备注 | 如果控件 (即 AF ) 是硕正报表，表达式功能更强大，支持和单元格的公式几乎一样的表达式(仅企业版)
示例 | var result = AF.func("runExp", "=15+3"); //返回18 //假如 AF 是硕正报表, 支持如下的表达式计算(仅企业版)： var ret = AF.func("runExp", "=A4 + if(D3==1, K4, K6) + myFunc(A1)"); //注： myFunc 是报表的自定义函数

ParseExp | 解析表达式 |
参数 | 表达式串
返回值 | 空串表示表达式正确，否则返回错误信息

#### 5.2.对计算函数的封装

“开发者指南 \ 公共内容” 中的 “计算函数” 一般单独用于硕正组件自身的表达式，但也可以用 AF.func( ) 单独调用，例如.

     //返回串 "壹万零壹佰贰拾叁元贰角肆分"
     var s = AF.func("RMB", "10123.24");

     //返回串 "10,123.20"
     var s = AF.func("formatNum", "10123.2 \r\n #,##0.00");

Report报表中的数据源函数，象 "data"、"head"、"search" 这些取得单个数据的函数，可以通过本方法获取, 但是 "datarow"、"headrow" 这些函数就无法支持了。

执行 Report 报表的这些函数前, 通常还需要执行报表的 SetHoldDSData 函数.

6.DOM函数 |

DOM(文档对象模型)是XML/JSON在内存中的OO结构模型，通过以下的DOM函数集，您可以较方便地解析、修改或生成XML串. 为了能理解函数及参数的作用，我们先对某些术语作一个解释、约定：
1.DOM句柄
XML/JSON是一棵树，树的每一个节点(包括树杈、树叶)在内存中都是DOM类的对象实例，而每个对象实例都有一个唯一的指针地址的，我们就把这个指针地址称作“句柄”。
2.DOM父亲、子孙
由于XML/JSON可以是任意级别的复杂树，所以每个DOM对象中，都有父亲、子孙的存储位置的。没有父亲的DOM对象就是根节点，没有儿子的DOM对象就是树叶。
3.DOM元素名、属性
按常规的资料，都叫做元素，但我们这里稍加区分：
这样，每个DOM对象都有一个元素名，同时也可以有多个属性，以及属性对应的值.
4.内存泄漏
如果您创建了DOM对象，但没有销毁它，那么势必会造成该内存块始终被占用，这就是所谓的内存泄漏。除非如下文档中有特别的声明，否则您最终必须销毁该对象。
子孙DOM对象是不需要你去销毁的，因为父对象在销毁自己的同时，它自己会去逐个销毁子孙对象的。
5.实例
如下3个例子由浅入深，演示了部分DOM函数的功能，假如这是原始的XML:

    <root>
     <product id='001'>MB</product>
    </root>

例一.简单的转换

     var xml="<root><product id='001'>MB</product></root>";
     var hRoot = AF.func("dom_new", xml);  //创建DOM对象
     alert(AF.func("dom_export", hRoot));  //export为 XML 串
     AF.func("dom_delete", hRoot);  //最后必须销毁

例二.更改元素的内容

     var hRoot = AF.func("dom_new", xml);  //创建DOM对象
     var hProd = AF.func("dom_find", hRoot + "\r\n product");  //定位到 product 元素
     AF.func("dom_setProp", hProd + "\r\n id \r\n100000");  //修改属性
     AF.func("dom_setProp", hProd + "\r\n #text \r\nUser");  //修改text
     alert(AF.func("dom_export", hRoot));
     AF.func("dom_delete", hRoot);  //最后必须销毁

例三.添加节点、删除节点:

     var hRoot = AF.func("dom_new", xml);  //创建DOM对象

     //插入一个新的对象
     var hNew = AF.func("dom_new", "");  //创建一个空的DOM元素
     AF.func("dom_setName", hNew + "\r\n customer");  //设定元素名
     AF.func("dom_setProp", hNew + "\r\n #text \r\nUser");  //设定text
     AF.func("dom_insertChild", hRoot + "\r\n -1 \r\n" + hNew);

     //删除 product 节点
     var hProd = AF.func("dom_find", hRoot + "\r\n product");
     AF.func("dom_Delete", hProd);

     //查看结果
     alert(AF.func("dom_export", hRoot));
     AF.func("dom_delete", hRoot);  //最后必须销毁根节点

分类 | 函数名 | 用途
--- | --- | ---
DOM函数 | DOM_new | 创建新的DOM对象
DOM_Delete | 销毁某个DOM对象
DOM_Clone | 克隆(即复制)DOM对象
DOM_IsValid | 判断某个句柄是否是DOM对象
DOM_Export | 取得DOM对象的完整的XML内容串(包含子孙)
DOM_GetName | 取得本DOM节点的名称
DOM_SetName | 更改本DOM节点的名称
DOM_GetProp | 取得DOM节点中某属性的值
DOM_SetProp | 更改本DOM节点某属性的值 (包括了增删改功能)
DOM_GetPropNames | 取得本DOM节点全部的属性名
DOM_GetParent | 取得某节点的父节点句柄
DOM_GetChildCount | 取得儿子的个数
DOM_GetChild | 取得n个儿子的句柄
DOM_IsLeaf | 判断某节点是否树叶
DOM_GetLeafArray | 取得子孙中所有树叶的句柄
DOM_Find | 从子孙中查找某个元素名的节点句柄
DOM_InsertChild(用法1) | 插入一个儿子
DOM_InsertChild(用法2) | 插入一个儿子

函数详解:

DOM_new | 创建新的DOM对象 |
参数 | XML/JSON大串，或者是URL(相对或绝对)，也可以是空串
返回值 | DOM对象的句柄，空串表示创建失败。失败原因有：不是有效的XML/JSON串，或者参数作为URL时，无法从该URL读取.
备注 | 您最终必须通过 DOM_Delete 函数销毁这个句柄的，否则会导致内存泄漏.

DOM_Delete | 销毁某个DOM对象 |
参数 | DOM对象的句柄
返回值 | 1/0 - 成功/失败，失败原因通常是参数不是有效的DOM对象句柄
备注 | 1.DOM对象句柄通常是根节点句柄，但也支持是某个子节点的对象句柄; 2.如果该对象是某个子节点，那么它的父节点将会把它从子孙集合中移除，换句话说，利用本函数，您可以单独删除DOM树中的某一个节点; 3.销毁时，该DOM对象的所有子孙节点DOM对象也将随之销毁；

DOM_Clone | 克隆(即复制)DOM对象 |
参数 | DOM对象句柄
返回值 | 新的DOM对象的句柄，空串表示参数无效
备注 | 1.返回的DOM对象内容上和原对象一模一样，但是它没有父节点; 2.一般情况下，该句柄也是必须要销毁的，否则也会造成内存泄漏;

DOM_IsValid | 判断某个句柄是否是DOM对象 |
参数 | 句柄
返回值 | 1/0 - 是/否
备注 | 如果DOM对象被销毁了，那么该句柄就无效了

DOM_Export | 取得DOM对象的完整的XML内容串(包含子孙) |
参数 | DOM对象句柄
返回值 | XML串， 空串表示句柄无效

DOM_GetName | 取得本DOM节点的名称 |
参数 | DOM句柄
返回值 | 串
备注 | 名称是指元素名，比如 <Properties height="3" ...> 这样的DOM对象，返回的是串"Properties"

DOM_SetName | 更改本DOM节点的名称 |
参数1 | DOM句柄
参数2 | 名称
返回值 | 1/0 - 成功/失败, 失败的原因通常为: DOM句柄不正确、或名称不符合规范

DOM_GetProp | 取得DOM节点中某属性的值 |
参数1 | DOM句柄
参数2 | 属性名
返回值 | 串
备注 | XML元素自身的内容用 “#text”表示(请参考示例)
示例 | 例如 <Properties height="3" >ABC</Properties> 这样的DOM对象： AF.func("DOM_GetProp", handle + "\r\n height") 返回 3 AF.func("DOM_GetProp", handle + "\r\n #text") 返回 ABC

DOM_SetProp | 更改本DOM节点某属性的值 (包括了增删改功能) |
参数1 | DOM句柄
参数2 | 属性名
参数3 | 值串
返回值 | 1/0 - 成功/失败。 失败的原因通常为: DOM句柄不正确、或属性名不符合规范
备注 | 1.XML元素自身的内容用 “#text”表示; 2.如果属性不存在，则自动增加这个属性; 3.如果值为空，表示删除这个属性; 4.请参考 DOM_GetProp 中的示例

DOM_GetPropNames | 取得本DOM节点全部的属性名 |
参数 | DOM句柄
返回值 | 以逗号分隔的属性名
示例 | 例如 <Properties height="3" width="4" /> 这样的DOM对象： AF.func("DOM_GetPropNames", handle) 返回串 "height,width"

DOM_GetParent | 取得某节点的父节点句柄 |
参数 | DOM句柄
返回值 | 父亲的DOM句柄，空串表示参数句柄无效

DOM_GetChildCount | 取得儿子的个数 |
参数 | DOM句柄
返回值 | 数字

DOM_GetChild | 取得n个儿子的句柄 |
参数1 | DOM句柄
参数2 | 数字，顺序号(从0开始计数)
返回值 | 该儿子的DOM句柄，空串表示顺序号已经超出

DOM_IsLeaf | 判断某节点是否树叶 |
参数 | DOM句柄
返回值 | 1/0/空串 - 是/否/无效的DOM句柄

DOM_GetLeafArray | 取得子孙中所有树叶的句柄 |
参数1 | DOM句柄
参数2 | 可选，为 true/false，true - 从儿子、孙子、重孙辈...中查找； false - 仅在儿子辈中查找， 默认是 true
返回值 | 以逗号分隔的句柄

DOM_Find | 从子孙中查找某个元素名的节点句柄 |
参数1 | DOM句柄
参数2 | 要查找的元素名
参数3 | 可选，为 true/false，true - 从儿子、孙子、重孙辈...中查找； false - 仅在儿子辈中查找， 默认是 true
返回值 | 以逗号分隔的句柄

DOM_InsertChild(用法1) | 插入一个儿子 |
参数1 | DOM句柄
参数2 | 位置，-1表示从末尾添加
参数3 | 新加入的DOM句柄
返回值 | DOM的句柄，即和参数3完全一样的串，空串表示失败
备注 | 1.如果新加入的DOM句柄是通过 DOM_New 函数生成的，那么你不必用DOM_Delete销毁它，因为它的生命周期已经被它的父亲控制了; 2.新加入的DOM句柄允许是现有的某个子孙的句柄(包括来自同一个祖先或其它祖先)，相当于是该DOM对象转移位置(或者说是改变父亲)而已.

DOM_InsertChild(用法2) | 插入一个儿子 |
参数1 | DOM句柄
参数2 | 位置，-1表示从末尾添加
参数3 | 新插入的节点元素的元素名
参数4 | 可选，新插入的元素自己的内容(即所谓 #text)
返回值 | 新生儿的句柄，空串表示失败，失败原因通常为父句柄无效、元素名命名不符合规范

7.其它函数 |

分类 | 函数名 | 用途
--- | --- | ---
常用函数 | CancelEvent | 取消执行某些事件
toJson | 将XML串转换成JSon
SetMultiLineEnter | 设置多行编辑是否直接以回车换行
GetMultiLineEnter | 取得多行编辑是否直接以回车换行
Menu | 在当前鼠标位置直接弹出一个自定义菜单
PostMessage | Post一个自定义消息
PostMessageToChrome | 向外层Chrome页面Post一个自定义消息
DeclareAsynch | 声明异步执行下一个函数
Blur | 强制让当前焦点窗口(如输入框)失去焦点
遮罩函数 | GrayWindow | 使控件呈现被遮罩的半透明效果
缓存函数 | ClearImageCache | 清理某个Treelist/freeform的图片缓存
SaveCache | 将串存入本地缓存
ReadCache | 读取缓存内容
GetCacheIDs | 取得所有缓存内容的ID号
ListenEvent | 监听某些特殊事件
CacheDirUtility | 本地缓存目录实用程序
GetDataString | 取得某个内存块中的内容
SetDataString | 将串写入某个内存块
文件相关函数 | HttpPostLocalFile | 通过Post简单上传一个本地文件
Download | 文件下载
CancelDownload | 中断文件下载，仅用于异步下载
FileUtility | 本地文件操作
FileDialog | 打开文件或目录选择对话框
ShellExecute | 使用本地操作系统的关联的应用程序, 打开本地的某个文件
GetExcelSheetName | 取得本地 Excel 文件中各个工作表的名称
硬件和操作系统函数 | GetMac | 取得网卡Mac地址
GetIP | 取得本机IP地址
GetComputerName | 取得客户端的计算机名
GetNumberOfProcessors | 取得本机CPU核心数
GetPrinters | 取得本地已安装的所有打印机名
GetPrinterPapers | 取得某打印机所支持的所有打印纸号
GetPrinterPapersInfo | 取得某打印机所支持的所有打印纸的详细参数
GetLastPrintInfo | 取得上次硕正报表、树列表打印所用的打印机名和份数
Twain | 打开扫描仪, 开始扫描文件
GetFonts | 取得已使用的全部字体资源
AddFont | 添加一种字体, 如果字体已经存在，则返回该字体的顺序号(fontIndex)
OpenSysFontDialog | 打开操作系统的字体对话框
OpenSysColorDialog | 打开操作系统的颜色对话框
系统和实用函数 | GetLanguage | 取得当前语言
SetLanguage | 切换语言
GetCtlName | 取得组件名
IsComponentInstalled | 某组件是否已经下载
GetHandleType | 取得句柄的类型
GetCookie | 取得当前的Cookie
SetCookie | 设置Cookie串，用于当前插件对象后续的 http 请求
SetHttpHeadProp | 设置Http head的属性，用于当前插件对象后续的 http 请求
GetChar | 取得某个字符编码所对应的文字
ScreenShot | 取得当前屏幕截图
QR | 生成二维码图片(bmp格式)
Sleep | 阻塞当前线程(通常是主线程)，让其等待若干时间

函数详解:

CancelEvent | 阻止事件继续执行 |
参数 | 事件锁句柄, 仅 Chrome ppapi 需要，其它浏览器可以忽略该参数.
返回值 | (无)
备注 | 1.只能用在 OnEvent 事件中, 并且需要对照事件说明文档, 因为并不是所有事件都能被阻止的; 2.通常用于某些 "Before..." 事件中. 以分页为例，如果你在 BeforePager 事件中执行了本函数，下一真正步的分页处理将被取消、不再执行; 3.通常是书写在事件返回语句前，即紧挨在 return 前; 4.在Chrome ppapi 开发中，本函数仅对被声明为锁定的事件(EnableEventLock)有效; 当执行 CancelEvent 函数后, 事件锁同时被释放, 不再需要执行 EventUnLock
示例 | function OnReady(id) { AF.func("build", "../A/12.xml"); AF.func("EnableEventLock", "DblClicked");　　//声明鼠标双击事件需要加锁 } function OnEvent(id, Event, p1, p2, p3, p4) { if(Event == "DblClicked") { var handleEvent = AF.func("EventLock", Event);　//锁 if( ..条件, 略...) { AF.func("CancelEvent", handleEvent); return; } AF.func("EventUnlock", handleEvent); } }

toJson | 将XML串转换成JSon |
参数1 | XML串
参数2 | 可选，格式为 RecordSet=[?];JsonObj=[?];isWrapperName=[?];isKeepNodeName=[?], 其含义及可用值说明如下： RecordSet - true 或 false, 默认是false. 如果是 true, 表示待转换的XML是平面结果集数据，转换后的JSON串是类似这种更简洁的格式： {"id":"k203", "price":"2230.12", "dept":"fin01"} 如果XML是多条记录，则JSON是数组： [ {"id":"k203", "price":"2230.12", "dept":"fin01"}, {"id":"s508", "price":"33.00", "dept":"fin02"} ] isWrapperName - true 或 false, 表示是否以引号环绕对象名, 默认是 true. 如下是 true 时的样例: {"id":"k203", "price":"2230.12", "dept":"fin01"} 如下是 false 时的样例: {id:"k203", price:"2230.12", dept:"fin01"} isKeepNodeName - true 或 false, 表示是否保持在转换过程中, 某些临时生成的诸如 jsonobject、tempiteminarray 的对象名, 默认是 true; JsonObj - 逗号分隔的对象名, 表示指定对象名, 如果其值为空时, 输出是 "{ }", 而不是 "null";
返回值 | JSON串(注：如果参数1不是XML，则直接返回该参数)

SetMultiLineEnter | 在默认情况下，多行编辑(MultiLineEdit)是以Ctrl+Enter实现换行的。如果设为true，则直接回车就实现换行. |
参数 | true/false, 默认false
返回值 | (无)
备注 | 该函数是全局函数，一旦执行，进程内的多行编辑都将生效

GetMultiLineEnter | 取得多行编辑是否直接以回车换行 |
参数 | (无)
返回值 | 1/0

Menu | 在当前鼠标位置直接弹出一个自定义菜单 |
参数 | 菜单的XML/JSON/TXT串，其格式请参考Treelist的帮助文档“13.自定义菜单”.
返回值 | 对应id号，0表示未选择，空串表示参数有误
备注* | 该函数不一定能正常运行，原因未明
示例 | var s = "id=BZ-4001; text=男帽; icon=treelist/buttons.zip#301.ico; detail=夏季时装\r\n"; s += "id=K4002; text=时髦头巾; icon=treelist/buttons.zip#302.ico; detail=优惠直销"; alert( AF.func("menu", s));

PostMessage | 以Post方式发送一个消息，相当于在消息队列的末尾添加，在页面的OnEvent( )事件中将能收到一个名为 "UserEvent" 的消息。 |
参数 | 格式为 p1=?;p2=?;p3=?;p4=?, 也允许忽略
返回值 | (无)
示例 | function OnEvent(id, Event, p1, p2, p3, p4) { if(Event == 'LooseFocus') { if(p1=='0' && p2=='price') AF.func('PostMessage', 'p1=kk'); } else if(Event == "UserEvent" && p1=="kk") { AF.func("SelectCell", "0 \r\n price"); } }

PostMessageToChrome | 用于 ppapi 的内嵌 IE页面, 向外部的 Chrome 容器页面发送一个消息，Chrome页面的OnEvent( )事件中将能收到一个名为 "UserEvent" 的消息。 |
参数 | 格式为 p1=?;p2=?;p3=?;p4=?, 也允许忽略
返回值 | (无)

DeclareAsynch | 声明异步执行下一个函数(通常是会弹出模式对话框的函数、用于解决 Firefox 浏览器线程阻塞问题) |
参数 | 格式为 p1=?;p2=?;p3=?, 也允许忽略。如果忽略(即参数为空、不定义p1,p2,p3), 那么下一个函数执行后，将不触发 UserEvent 事件
返回值 | (无)
备注 | 1.函数使用详解请参考 使用指南 \ 10.不同浏览器的一些差别 \ 10.4 线程阻塞问题; 2.注意：参数只有 p1, p2, p3, 不包括 p4, 因为 p4 是异步函数的返回值; 3.本函数仅对下一个函数生效，即寿命是一次性的; 4.本函数的作用范围是整个进程、全局有效，“下一个函数” 不管是硕正哪个组件、哪个页面，都将被安置到新线程异步执行;

Blur | 强制让当前焦点窗口(如输入框)失去焦点 |
参数 | (无)
返回值 | (无)
备注 | 常用于非 IE 环境, 例如 Chrome 浏览器, 由于其输入框不是从 Windows 标准类继承, 所以它取得焦点后无法让硕正组件失去焦点, 只能执行本函数强制让硕正组件失去焦点

GrayWindow | 使控件呈现被遮罩的半透明效果，用于实现网页模式对话框，可参考Treelist的演示页 |
参数1 | 是否遮罩, true - 遮罩,控件被Disable并呈半透明的灰色; false - 解除遮罩
参数2 | 可选，有二种语法: 语法1: 数字, 灰度值, 0 到 255，默认200, 数值越大越明亮. 语法2: backColor=[?];alpha=[?];isGrayImage=[?] 的串, 原理是在某个底色的基础上, 把界面半透明地绘制上去. backColor是底色, 默认值是#C8C8C8; alpha是界面的透明度, 0 到 255, 默认值是 70; isGrayImage 表示是否把界面转成灰度, 默认值是 true
返回值 | (无)
示例 | AF.func("GrayWindow", "true \r\n 240"); //语法1 AF.func("GrayWindow", "true \r\n backColor=#440044;alpha=80"); //语法2 AF.func("GrayWindow", "true \r\n backColor=0;alpha=255;isGrayImage=false"); //让控件处于遮罩状态, 但外观看上去未改变 AF.func("GrayWindow", ""); //解除遮罩
备注 | Chrome 纯 ppapi 模式下, 遮罩时插件窗口将隐去, 很好地解决了插件遮挡页面其它元素的问题

ClearImageCache | 清理某个Treelist/freeform的图片缓存，以便在下次Build或Load时能及时刷新图片 |
参数 | Treelist或Freeform的句柄
返回值 | (无)
备注 | 1.句柄是通过GetHandle( )函数获取的; 2.Treelist 或 Freeform 有自己的图片缓存，独立于浏览器的缓存;

SaveCache | 将串存入本地缓存，缓存的内容在全局有效、且和页面无关(即所有页面均能访问到) |
参数1 | ID, 可以是任意串
参数2 | 内容串，如果是空串，则表示从缓存中移除该ID的内容
参数3 | 可选，格式为Persist=[?];TimeOut=[?D/H/M/S], 其中Persist用于指定保存到何处，格式如下： 1.Persist = Memory, 默认，表示将内容缓存于内存中，当浏览器进程关闭后内容将遗失. 2.Persist = File, 将内容保存在本地文件(在BC目录下的 cache.data 文件). TimeOut表示如果超过一段时间无访问，将自动删除该缓存，格式如下： TimeOut = ?D/?H/?M/?S - 时间间隔，n天/n小时/n分钟/n秒(D/H/M/S分别表示天数、小时、分钟、秒).
返回值 | (无)
备注 | 1.该缓存是硕正套件自己维护的缓存，与浏览器缓存无关; 2.如果是本地文件，它位于 BC 目录下;
示例 | AF.func("SaveCache", "My.Key1 \r\n MyContent1"); //保存到内存 AF.func("SaveCache", "My.Key1 \r\n MyContent1 \r\n Persist=File"); //保存到文件，永久有效 AF.func("SaveCache", "My.Key1 \r\n MyContent1 \r\n TimeOut=3M"); //保存到内存，有效期为3分钟 AF.func("SaveCache", "My.Key1"); //清除ID为 "My.Key1" 的缓存

ReadCache | 读取缓存内容 |
参数 | ID, 注：ID是大小写敏感的
返回值 | 内容串
备注 | 1.该缓存是硕正套件自己维护的缓存，与浏览器缓存无关; 2.通常和前面的 SaveCache 关联使用;

GetCacheIDs | 取得所有缓存内容的ID号 |
参数 | (无)
返回值 | ID串，以逗号分隔
备注 | 1.该缓存是硕正套件自己维护的缓存，与浏览器缓存无关; 2.通常和前面的 SaveCache、ReadCache 关联使用;

ListenEvent | 监听某些特殊事件 |
参数 | 必须为串“CacheSaved”
返回值 | (无)
备注 | 1.用于监听前面的 SaveCache 动作, 一旦 SaveCache 函数被执行，将触发 CacheSaved 事件，不管内容是否被更新; 2.可以是跨页面、跨选项卡触发
示例 | ... AF1.func("ListenEvent", "CacheSaved"); //AF监听 CacheSave 函数 ... AF2.func("SaveCache", "My.Key1 \r\n MyContent1"); //AF2 执行了 SaveCache 函数, 将触发事件 ... function OnEvent(id, Event, p1, p2, p3, p4) { if(id == "AF1" && Event == "CacheSaved") alert(p1); }

CacheDirUtility | 本地缓存目录实用程序 |
参数 | 格式为 Dir=[?]; isCreateTempFile=[?]; Ext=[?]; KeepMB=[?]; DeleteEarlierFile=[?]，含义如下: Dir - 本地用于缓存的目录名，如果为空，则表示 BC 目录下的 Temp 目录 (服务器版则指向后端的临时目录); isCreateTempFile - true/false, true 表示在目录中创建一个唯一的文件, 并返回文件名; Ext - 该文件的后缀, 默认是"tmp"; Pre - 该文件的前缀, 默认为空; DeleteEarlierFile - 删除该目录下 n 小时(或分)前的文件, h/m分别表示时/分, 例如 DeleteEarlierFile=3h 表示删除3个小时前的文件; 如果为空，表示不执行该功能; KeepMB - 数字，单位是兆比, 删除该目录下最早的文件, 使文件总尺寸不超过 n 兆比; 如果为空，表示不执行该功能;
返回值 | 如果 isCreateTempFile 为true, 则返回全文件名
备注 | "@"开头的文件是不会被删除的，也不计入KeepMB的尺寸

GetDataString | 取得某个内存块中的内容 |
参数 | 内存块的句柄
返回值 | 内容串
备注 | 1.通常用于 DataReach 事件; 2.在大多数情况下, 句柄的生命周期是十分短暂的, 访问无效句柄会导致异常

SetDataString | 将串写入某个内存块 |
参数1 | 内存块的句柄
参数2 | 要写入的串
返回值 | (无)
备注 | 1.通常用于 DataReach 事件; 2.在大多数情况下, 句柄的生命周期是十分短暂的, 访问无效句柄会导致异常

HttpPostLocalFile | 通过Post简单上传一个本地文件 |
参数1 | Http的URL， 可以是绝对或相对URL, 如果是相对URL，是相对于页面URL的
参数2 | 本地全文件名
参数3 | 可选参数，格式为 mode=[?];compress=[?];isEcho=[?],含义为： mode - synch/asynch, 同步/异步上传，默认是同步; compress - 是否对数据进行zip压缩, none/zip/autozip, 不压缩/压缩/根据压缩后数据包尺寸变化自动选择，默认是none, 即不压缩; isEcho - true/false, 是否提示上传成功或失败，默认是true;
返回值 | 0 - 表示有错误，例如本地文件不存在、http传输错误; 否则，在同步上传时返回服务器返回的串、异步上传时返回1
备注 | 1.发起的Request中, Http Body 将是该文件的二进制内容; 2.如果是异步上传，上传完成后能触发名为 “Upload”的事件; 3.本函数只能上传较小的文件，因为是一次性将文件读入内存的，所以文件尺寸受制于客户端内存的大小，上传大文件请用硕正的 upload 组件或 Freeform 中的 upload 控件；
示例 | AF.func("HttpPostLocalFile", "http://localhost/hlp.aspx?name=my.mp3 \r\n d:\\my.mp3 \r\n mode=asynch");

Download | 文件下载 |
参数1 | URL，支持Http、Ftp
参数2 | 可选，格式为 isOpenDialog=[true/false]; isEcho=[true/false]; toDir=[?]; toFile=[?]; toString=[?]; Ext=[?]; uid=[?]; pwd=[?], 含义为： isOpenDialog - 是否打开选择本地文件或目录的对话框，有如下可选项, 默认是true:; true(或file) - 打开文件选择对话框; dir - 打开目录选择对话框; false - 不打开对话框; 备注：如果选择“dir”，那么必须指定“toFile”文件名参数，文件名可以是不含路径的纯文件名; Ext - 在对话框中允许选择的文件后缀，若有多个后缀则以逗号分隔，仅用于 isOpenDialog=true 时; toDir - 指定本地目录(绝对路径)，如果路径不存在能自动创建，默认是空; toFile - 指定本地文件(如果isOpenDialog=dir, 可以是不含路径的文件名，否则必须是绝对路径)，如果路径不存在能自动创建，默认是空，如果设定了toFile，通常就不需要设定toDir; isAutoResume - 是否支持自动断点续传(仅支持 http), 默认是 true; uid - 登录的用户名; pwd - 用户口令; zip - Expand / ExpandAndDelete / 空串。Expand表示如果下载的文件是用Zip压缩的，则完成下载后自动解压; ExpandAndDelete表示解压后删除zip文件; 为空表示不做解压处理。默认是空串; toString 或 isToString - true/false，默认是false。当为 true 时，表示 http(或ftp) 返回的内容肯定是字符串，并将直接返回该串，而不再将内容保存到文件。此时不需要设定isOpenDialog、toDir、toFile等文件参数了。请参见下面的示例. toBufferObj 或 isToBufferObj - true/false，默认是false。当为 true 时，返回的内容二进制被包含在硕正的缓存对象中，函数返回该对象的地址的串。该函数不太常用，在硕正套件C/S版中有例子. isEcho - 下载后是否浮现一个提示，失败则浮现错误信息，默认是true; mode - synch/asynch, 同步/异步下载，默认是同步; isShowProgress - true/false, 是否显示进度条，仅用于异步，默认是false; cover - 当本地有同名文件时， overwrite/rename/nocover - 直接覆盖/文件自动改名/不覆盖, 仅用于isOpenDialog=false时, 默认是overwrite; offset - 数字，单位为字节，从 offset 字节开始下载、写入 (本参数用途不大);
返回值 | 返回的是本地全文件名，如果是空串则表示失败、或者对话框中选择了“取消”; 如果 isToString=true，则返回的是内容串; 如果是zip解压的，则返回zip包中第一个文件在该目录的全文件名; 如果 mode=asynch(异步下载)，返回的是一个纯数字的任务ID号，用于 Download 事件，如果是空串表示对话框中选择了“取消”。
备注 | 1.如果是异步下载，在下载结束时将触发 Download 事件，并且在下载过程中会以1秒左右的间隔不停地发送 Download 事件，报告当前的下载进度、网速，详细请参见组件的"Download"事件文档. 2.断点续传只能用于下载文件, 如果 toString = true 或 toBufferObj = true, 断点续传失效
示例 | //下载一个mp3文件，下载前会打开目的文件对话框 AF.func("download", "ftp://192.168.1.2:21/mymusic.mp3"); //下载到指定文件，但仍会打开目的文件对话框 AF.func("download", "http://localhost/hlp.htm \r\n toFile=d:\\my.htm; ext=htm,html,txt"); //直接取得文本串 var xml = AF.func("download", "http://localhost/text.xml \r\n toString=true");

CancelDownload | 中断文件下载，仅用于异步下载 |
参数1 | ID号，即 Download 函数的返回值
参数2 | 为 DeleteFile / KeepFile。DeleteFile - 删除已下载到本地的这个不完整的文件; KeepFile - 保留这个文件。默认是DeleteFile。
返回值 | 如果参数2为 DeleteFile , 则返回空串；如果参数2为 KeepFile，则返回本地文件名、文件总长度、已下载的文件长度，3者之间以回车符分隔

FileUtility | 本地文件操作 |
参数1 | 操作串，可以为: isExists - 文件是否存在, 返回1/0; GetByte 或 GetBytes - 返回文件长度(单位: 字节); GetKB - 返回文件长度(单位: KB); GetMB - 返回文件长度(单位: MB); GetCTime - 返回文件创建日期; GetMTime - 返回文件最后修改日期; delete - 删除文件, 返回1/0; GetFilenames / GetPathnames - 取得某个子目录下的某些文件名/含路径的全文件名; GetMD5 - 取得某个文件的 MD5 串, 32字长, 例如 e3b167a17d48c2eeb84cb1b1b98e233d, 空串表示文件不存在或无法访问;
参数2 | 如果参数1是GetFilenames / GetPathnames, 本参数是路径的通配符，比如 "d:\docs\*.jpg" ; 否则, 应该是全文件名
返回值 | 根据参数1而定， 如果参数1是GetFilenames / GetPathnames, 返回的是以回车分隔的文件名/全文件名
示例 | //返回回车分隔的文件名 var s = AF.func("FileUtility", "GetPathnames \r\n d:\\docs\\*.jpg");

FileDialog | 打开文件或目录选择对话框 |
参数 | 操作串，可以为: isOpen - 用途， true/false - 用于打开文件/用于保存文件, 默认是true; isDir - true/fale - 目录选择对话框 / 文件选择对话框，默认是 false; 如果 isDir = true, 还可以有如下选项 Title - 自定义对话框的标题; Dir - 初始选择、展开的目录; Root - 目录树的根节点, 可以是 "Desktop" 或 "Driver", 默认是 "Desktop" ; 如果 isDir = false, 则可以有如下选项: FileType - 能打开的文件类型(后缀)，多种类型之间以逗号分隔， 例如串 "jpg,bmp,*"， 默认是 "*"; FileName - 初始选择的文件名;
返回值 | 全文件名
示例 | var s = AF.func("FileDialog", "isDir=true; Title=请选择目录:");

ShellExecute | 使用本地操作系统的关联的应用程序, 打开本地的某个文件 |
参数 | 全文件名
返回值 | 1/0 - 成功/失败
备注 | 如下 5 种后缀的文件是无法打开的： exe、bat、com、msi、reg
示例 | AF.func("ShellExecute", "d:\\photo.jpg");

GetExcelSheetName | 取得本地 Excel 文件中各个工作表的名称 |
参数 | 本地 Excel 文件的全文件名
返回值 | 工作表名称, 多个名称之间以回车符分隔
备注 | 支持 xls, xlsx 文件格式

GetMac | 取得网卡Mac地址 |
参数 | (无)
返回值 | 串(如："1c-6f-65-d6-b8-d1")

GetIP | 取得本机IP地址 |
参数 | (无)
返回值 | 串(如："192.168.1.1")

GetComputerName | 取得客户端的计算机名 |
参数 | (无)
返回值 | 串

GetNumberOfProcessors | 取得本机CPU逻辑核心数 |
参数 | (无)
返回值 | 数字，假如您的电脑是双核四线程，则返回值是4

GetPrinters | 取得本地已安装的所有打印机名 |
参数 | (无)
返回值 | 以逗号分隔的打印机名，其中的第一个是默认打印机

GetPrinterPapers | 取得某打印机所支持的所有打印纸号 |
参数 | 打印机名
返回值 | 以逗号分隔的打印纸号，其中第一个为该打印机默认的打印纸。各种打印纸号所对应的打印纸名称及尺寸请参见“附录4:打印纸对照表”

GetPrinterPapersInfo | 取得某打印机所支持的所有打印纸的详细参数 |
参数 | 打印机名
返回值 | 返回类似如下的 json 数组, width 和 height分别表示纸张的宽度和高度, 单位是1/10毫米: [{ "name": "A4", "number": 9, "width": 2100, "height": 2970 }, { "name": "信纸", "number": 1, "width": 2159, "height": 2794 }, { "name": "Tabloid", "number": 3, "width": 2794, "height": 4318 }]

GetLastPrintInfo | 取得上次硕正报表、树列表实际打印所采用的打印机名和打印份数 |
参数 | (无)
返回值 | JSON串，例如: {"Printer":"HP LaserJet P1007", "Copies": 2}, 如果为空串，表示浏览器进程开启以来尚未打印过

Twain | 打开支持 Twain 接口的扫描仪, 用于执行文件扫描操作 |
参数 | 格式为 Type=[?];Dir=[?];precision=[?], 说明如下 Type - 指定扫描获取的图片文件的格式, 可以为 BMP、JPG、PNG、TIF、PDF、PDFBook, 默认是 BMP. 注: 并不是所有扫描仪都支持 JPG, PNG, 但 BMP 都支持; PDF 和 PDFBook 和扫描仪硬件无关, 是由硕正实现的, 所谓 "PDFBook" 是指将本次扫描的多个图片输出到一个 PDF 文件中. Dir - 指定扫描获取的文件存放目录, 默认在硕正临时目录下 (Users\UserName\BC\Temp); Precision - 指定 jpg 文件的精度, 1 到 100, 默认是 85. 注: PDF 和 PDFBook 也是封装了 jpg 的, 所以也适用;
返回值 | 数字, 含义如下: 1-扫描仪打开成功, 3-Dir参数不正确或目录无法创建, 4-未发现本机连接有扫描仪, 5-系统的扫描管理功能开启失败, 6-操作系统缺少Twain的程序文件
备注 | 在执行完扫描后, 将名为触发 "Device" 的事件, 请参考开发文档 “事件”

GetFonts | 取得已使用的全部字体资源 |
参数 | (无)
返回值 | XML串
备注 | 1.仅用于 Treelist、Freeform、Report; 2. 对于Report，每个工作表都有自己独立的字体资源，本函数仅针对当前工作表
示例 | var s=AF.func("getFonts", ""); s = AF.func("toJson", s + "\r\n RecordSet"); alert(s); /*返回的是类似如下这样的串: [ {'faceName':'Verdana', 'height':'-12', 'weight':'400', 'pitchAndFamily':'34', 'quality':'1', 'outPrecision':'3', 'clipPrecision':'2'}, {'faceName':'SimSun', 'charSet':'134', 'height':'-12', 'weight':'400'} ] */

AddFont | 添加一种字体, 如果字体已经存在，则返回该字体的顺序号(fontIndex) |
参数 | 该字体的xml或json串
返回值 | 字体顺序号，返回 -1 表示失败
备注 | 1.仅用于 Treelist、Freeform、Report; 2. 对于Report，每个工作表都有自己独立的字体资源，本函数仅针对当前工作表
示例 | var s=AF.func("addFont", "{'faceName':'宋体', 'height':'-12', 'weight':'400'}");

OpenSysFontDialog | 打开操作系统的字体对话框 |
参数 | 用于在对话框初始显示的字体, xml或json串, 如果参数为空, 对话框显示为操作系统默认字体
返回值 | 字体的XML串，空串表示点击了 "取消"
示例 |
    var s=AF.func("openSysFontDialog", "{'faceName':'宋体', 'height':'-12', 'weight':'400', 'Color':'red'}");
    if(s != '') alert( AF.func("tojson", s + "\r\n recordSet") );

OpenSysColorDialog | 打开操作系统的颜色对话框 |
参数 | 对话框的初始颜色, 可以是 "#FF0000" 或 "Red" 这种串, 参数为空则默认为黑色
返回值 | 字体串，空串表示点击了 "取消"

GetLanguage | 取得当前语言 |
参数 | (无)
返回值 | 936 - 中文简体，1252 - 英文，950 - 中文繁体

SetLanguage | 切换语言 |
参数 | 936 - 中文简体，1252 - 英文，950 - 中文繁体
返回值 | (无)

GetCtlName | 取得组件名 |
参数 | (无)
返回值 | 组件名，如treelist、freeform

IsComponentInstalled | 某组件是否已经下载 |
参数 | 组件bin包名，如BCV1、LuxForm
返回值 | true/false

GetHandleType | 取得句柄的类型 |
参数 | 句柄
返回值 | 串，可能为treelist、list、freeform、worksheet、validation、dom或空串
备注 | 句柄是通过GetHandle( )函数获取的

GetCookie | 取得当前的Cookie |
参数 | (无)
返回值 | Cookie串
备注 | 是指 dynaload.js 中创建控件时赋予的 Cookie 串，或通过 SetCookie 函数指定的 Cookie 串

SetCookie | 设置Cookie串，用于当前插件对象后续的 http 请求 |
参数 | 串
返回值 | (无)

SetHttpHeadProp | 设置Http head的属性，用于当前插件对象后续的 http 请求 |
参数1 | 属性名
参数2 | 内容串, 空串表示删除该属性
返回值 | (无)
备注 | 1.属性通常是指自定义属性，例如 tokenId; 2.本函数是全局(进程)有效的，一旦设置，今后所有 http 请求都将包含此属性; 3.如果要设置多个属性，须多次调用本函数

GetChar | 取得某个字符编码所对应的文字 |
参数 | 字符的ASC码，如果是中文，则为utf-16的编码
返回值 | (无)
示例 | var chr = AF.func("GetChar", "20013"); //返回“中” var chr = AF.func("GetChar", "97"); //返回“a”

ScreenShot | 取得当前屏幕截图 |
参数 | 可选的串，格式为return=[?]; range=[?]; type=[?];precision=[?];isgray=[?];blackwhit=[?];threshold=[?], 其含义如下： return - base64/filename, 返回 Base64大串/返回文件名，默认是Base64; range - browser/screen/control, 仅截取浏览器界面/截取整个屏幕/仅截取当前控件部分，默认是browser; type - jpg/gif/bmp/png/tif, 图片格式，默认是jpg; precision - 0到100的数值，仅用于jpg, 含义为jpg的清晰度，数字越大越清晰，默认是75; isGray - true/false, 灰度/彩色，默认是false; BlackWhite - true/false, 黑白/彩色，默认是false; threshold - 1到100之间, 仅用于黑白，数字越小图像越白，默认是70;
返回值 | 根据参数，返回文件名或Base64串
示例 | var chr = AF.func("screenshot", "return=base64;isgray=true;precision=60");

QR | 生成二维码图片(bmp格式) |
参数1 | 需要被编码的字符串
参数2 | 可选的串，格式为Level=[?]; maxSize=[?]; isBase64=[?];filename=[?], 其含义如下： Level - 纠错等级，0到3的整数， 分别表示 7%、15%、25%、35%的纠错率，纠错率越高，扫描过程越不易出现差错，默认是0; maxSize - 期望生成的图片的大小，单位是像素，通常是编码串越长，所需的尺寸也必须越大。最小值是25，默认是300; 如下2个参数决定如何返回结果(不能同时使用): filename - 本地文件名，用于保存 bmp 格式的图片; isBase64 - 将生成的 bmp 二进制转码成 BASE64 串，并返回该串;
返回值 | 根据参数返回, 如果指定了 filename，返回 1/0 - 成功/失败；如果 isBase64=true, 则返回 BASE64 串
示例 | var str = AF.func("QR", "http://www.supcan.cn \r\n isBase64=true");

Sleep | 阻塞当前线程(通常是主线程)，让其等待若干时间 |
参数 | 毫秒数
返回值 | (无)