为帮助软件开发商缩短开发周期和最终用户的方便使用,Cell组件/插件内置了很多函数,包括数学函数、统计函数、字符串函数,财务函数等,在单元格中设置函数具有减少数据重复计算、加快运算速度、增强与最终用户的交互性,减少程序员工作量,缩短软件开发周期等特点。但每个最终用户的需求都有所不同,仅使用Cell内置函数是远远不够的。为此Cell控件在函数功能上增加了自定义函数功能,以便让软件开发商开发出更灵活,更具有行业特性,更适合最终用户的软件。
自定义函数是指软件开发商根据自己的需要定义一些非Cell内置函数的函数,自定义函数需要定义的内容包括函数名,参数,返回值,并且要求软件开发商为函数编写相应的算法。最终用户在使用此自定义函数时,Cell控件会根据函数的相关设置计算出相应的结果。
Cell内置函数的使用十分简单,这里将不做说明,下面将主要介绍Cell中自定义函数的工作原理以及如何添加自定义函数和为其编写算法。
一、自定义函数工作原理
软件开发商先在程序中定义自定义函数,最终用户在使用此函数时,Cell触发自定义函数计算事件,软件开发商在Cell触发的事件中,根据事件传入相关信息,编写函数的功能,并将结果传给Cell控件,最后Cell将结果展现在控件上,这样Cell的整个自定义函数工作过程结束。
二、添加自定义函数
自定义函数的定义包括三部分,1。函数大类;2。函数体;3。帮助;
函数大类 表示函数的所属类别,用于最终用户在使用时快速方便查找到相应的函数;
函数体 是自定义函数最关键的部分,是用户编写函数功能和最终用户使用函数的前提,它分为三部分,返回值,函数名,参数;
返回值 Cell为自定义函数提供数值、字符串以及未定义类型两种类型的返值,用户根据需要设置;未定义类型是指返回值可能是字符串或数值类型,为了减少CELL的运算速度,华表不建议用户使用该类型;
函数名 即是自定义函数的名称,最多不能超过64个字符,函数名称可以使用中文表示;
参数 即供最终用户在调用自定义函数时的输入的各项数据,它包括字符串和数值两种类型;字符串类型参数又分三种类型,String类型,Cell类型(单元格类型),RNAGE类型(区域类型),String类型返回普通的字符串,Cell类型返回“col,row,sheet”形式的字符串,RNAGE类型返回“col1,row1,col2,row2,sheet”形式的字符串,后面两种用户需要自行解析才能得到相应的行、列、表页值;各个参数用“,”号分隔开,每个参数必须按照 “数据类型 参数名” 的格式定义,例如定义一字符串类型参数, String str,定义数值类型 Double num;一个自定义函数最多可使用16个参数;自定义函数参数允许用户设置缺省参数,缺省参数表示最终用户在使用函数时,可对此参数输入数据,也可不用输入数据,缺省参数用在普通参数前后加“[” 和“] ”号表示,例如,[String str]表示;
帮助 用户在公式输入栏选取公式时,显示公式的说明,用于帮助最终用户快速理解和使用公式;帮助的内容必有写在“BEGIN_HELP”和“END_HELP”之间;帮助内容建议用户书写有关函数的功能,返回值以及各个参数的说明,如果内容中有多行文本需要换行,则应在内容中加上回车换行符节;
现以实例讲解定义自定义函数(VB语法):
Private Sub Form_Load()
Dim strFun As String
strFun = """我的自定义函数"" double GetValueFromDB(String sFieldName1,[String sTableName],[String sFieldName2])"
strFun = strFun & vbCrLf & "BEGIN_HELP"
strFun = strFun & vbCrLf & "double GetValueFromDB(String sFieldName1,[String sTableName],[String sFieldName2])"
strFun = strFun & vbCrLf & "该函数返回数值类型,用于从数据库某个表中根据sFieldName1字段名,取得sFieldName2字段中的值;"
strFun = strFun & vbCrLf & "注:sFieldName1 为必填字段,sTableName 和 sFieldName2为可填字段,"
strFun = strFun & vbCrLf & "如果用户不填写则默认是sTableName=table1,sFieldName2=lValue;sFieldName1参数和sFieldName2参数所表示的字段必须是在同一数据库同一个表中的字段"
strFun = strFun & vbCrLf & "END_HELP"
Cell1.DefineFunctions strFun ‘将自定义函数添加至CELL中
End Sub
例子中添加“我的自定义函数”大类,并将GetValueFromDB归类至我的自定义函数中,GetValueFromDB中创建了三个参数,String sFieldName1是普通参数,[String sTableName]和[String sFieldName2] 是缺省参数,在帮助中对自定义数做了详细的说明,包括返回值,各参数的意义,缺省值,功能等等. DefineFunctions方法则将当前自定义函数的字符串添加至CELL中,在单元格中输入”=”号,会出现公式输入栏,点击问号,在函数大类列表中即能发现刚添加的”我的自定义函数”大类,如图1
图1
点击”我的自定义函数”大类,列出刚添加的函数”GetValueFromDB”,在其右边则列出帮助的内容,即对函数的注释,如下图
图2
至此,一个自定义函数的定义已经完成。但此时函数还没有完成,达不到预想的结果,还需要为其编写相应的算法。
三、编写相应算法(运算过程利用自定函数读取数据库数据(补充))
自定义函数定义完成后,用户在公式输入栏调用自定义,CELL将触发CalcFunc 事件或CalcFuncEx事件,这两个事件不能同时应用在同一个CELL实例中。用户添加CalcFunc事件,并在该事件中处理即可.CalcFunc包括三个参数,name(字符串类型),rettype(长整型),paranum(长整型);name表示当前最终用户在地址栏调用的自定义函数名称,rettype表示自定义函数返回值的类型,0表示数值类型,1表示字符串类型;paranum表示自定义函数所包含参数的个数(包括缺省参数);CalcFuncEx事件有五个参数,它比CalcFunc事件多两个参数,col参数和row参数,它们都是长整型,分别代表当前计算的自定义函数所在的列号和行号,其它三个参数与CalcFunc事件相同。下面的将以CalcFunc事件为例,为先前定义的自定义函数编写相应的功能:
'接收参数的变量
Dim strFieldName1 As String, strTableName As String, strFieldName2 As String
Dim nIsDef As Long '传递至取得参数值的方法中
Dim ret As Single '返回值
strFieldName1 = Cell1.GetFuncStringPara(0, nIsDef) '取得第一个参数值
strTableName = Cell1.GetFuncStringPara(1, nIsDef) '取得第二个参数值
strFieldName2 = Cell1.GetFuncStringPara(2, nIsDef) '取得第三个参数值
If strTableName = "" Then '如果用户没输入,则用缺省值 "table"
strTableName = "table1"
End If
If strFieldName2 = "" Then '如果用户没输入,则用缺省值 "lvalue"
strFieldName2 = "lvalue"
End If
'从数据库中取得数据
ret = GetDBValue(strFieldName1, strTableName, strFieldName2)
'将结果设回至CELL控件上
Cell1.SetFuncResult ret, "", rettype
Cell1.ReDraw '刷新CELL控件
GetFuncStringPara方法取得字符串类型参数的值,它包括两个参数,index和isDefault,它们都是地址类型的参数,index表示参数在函数的顺序,它从0开始表示,例如上述例子中,strTableName 的index就是1;isDefault表示指定参数是缺省参数还是普通参数,由GetFuncStringPara返回,0表示普通参数,1表示缺省参数;如果参数是数值类型则用GetFuncDoublePara 方法取得,它与GetFuncStringPara的用法一致,只是它的返回值不一样,GetFuncDoublePara返回数值型。
取得最终用户输入的参数值,程序根据参数值返回相应的结果,示例程序中通过GetDBValue函数取得计算结果.再用SetFuncResult方法将函数结果返回给CELL控件,SetFuncResult 方法包含floatvalue,strvalue,type三个参数,floatvalue参数是Double类型,用于指定自定义函数数值类型的返回值;strvalue参数是字符串类型,用于指定自义函数字符串类型的返回值;type参数是长整型,用于指定自定义函数的返回值类型;如果type值是0表示自定义函数返回值是数值类型,无论strvalue的值是多少,都将floatvalue的值传至CELL中;相反,type值是1表示返回值是字符串,CELL只将strvalue的值传至CELL中。
在Cell1.SetFuncResult 语句后加了Cell1.ReDraw方法,此语句用于在结束自定义函数计算后,刷新CELL控件,防止出现乱屏。
四、使用自定义函数
以示例程序为例,运行示例程序后,在任意一单元格键入“=”号,会出现公式输入栏;在公式栏中点击问号,如图3
图3
点击问号后,会列出所有已经存在至CELL中所有的函数大类,包括自定义函数,如图1;选取“我的自定义函数”一类后,即可看到它所包含的所有函数,如图2;将GetValueFromDB函数选进地址栏后,在括号中输入带括号的“001”,回车即可将数据库中的值取出。如果最终用户对自定义函数名,参数类型,参数个数等输入有误的话,CELL会自动校验,直到最终用户输入正确为止,CELL才自定义函数计算事件触发,所以用户在开发程序时不用担心非法的自定义函数。执行结果如图4.
如图4
点击下载示例代码:Sampl如何运用Cell的自定义函数功能es.rar
http://www.cellsoft.cc/Cell/News_Show.asp?id=649&lx=Cell%BC%BC%CA%F5%CE%C4%D5%C2