1. 程式人生 > >如何運用Cell的自定義函式功能

如何運用Cell的自定義函式功能

為幫助軟體開發商縮短開發週期和終端使用者的方便使用,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