前一篇IMPORT中,提到Genero Package中有提供一些預先製作的功能套件可用。
可是面對層出不窮的新功能,Genero勢必不可能面面俱到。一來得靠其他的 Genero用戶支援。或是靠其他語言的特性。因此IMPORT 指令額外還可支持:
不可否認的,雖然JAVA開發是較為複雜的,但是運用JAVA群體仍舊廣大。許多 lib 或功能包也都有提供 JAR 檔下載運用。因此 FGL 開放直接調用 JAR 中的變數、function 讓 FGL 可調用也是很正常的事。
Hello World再現,撰寫一個小型的 java 程式,命名為 Helloworld.java
public class Helloworld {
public String init(){
return "hello";
}
}
提供一個function init,被呼叫的時候回傳一個字串 "hello"
使用的環境利用 java -version 可得知為 openjdk version "1.8.0_232"
(建議在1.8以上即可,1.6版本過低,建議更新)
存檔後使用 ** javac Helloworld.java ** 編譯出 Helloworld.class檔案
使用 jar -cvfm Helloworld.jar MANIFEST.MF Helloworld.class 編譯出 jar 檔
最後使用 **export CLASSPATH=$PWD/Helloworld.jar:$CLASSPATH **指令,將此 jar 檔案加入 CLASSPATH 搜尋路徑中,以便編譯器搜尋並完成連結
如果要串接的 function 比較多,應該要用有結構化的方式進行有規則的 source調整與存放
STEP1 java package的目錄階層
STEP2 在路徑上開發Hellopkg.java
package com.dsc.svms.hello;
public class Hellopkg {
public String init(){
return "hi in pkg";
}
}
從上方的Hellopkg.java 範例中可以看到,初始時就要宣告現在存在哪個路徑,記得此處與外部的路徑要能夠勾稽。
上面的程式混和在同一支 4GL 進行呼叫,讓大家能清楚差異:
IMPORT JAVA Helloworld #使用單一程式路徑
IMPORT JAVA com.dsc.svms.hello.Hellopkg #使用Package路徑
MAIN
DEFINE str string
DEFINE abc Helloworld #引入後要使用,一定要用物件的方式宣告
DEFINE def Hellopkg #這裡是套件版的
LET abc = Helloworld.create() #注意:java沒有,但仍要這樣叫,FGL要求的
LET str = "CALL Direct:",abc.init() #這裡才是 java有的
DISPLAY str
LET def = Hellopkg.create() #PKG只是 IMPORT路徑不同,用法都相同
LET str = "CALL Package:",def.init()
DISPLAY str
END MAIN
執行後
對於 FGL的IMPORT,基本上是提供一個物件化的呼叫方式。且 IMPORT FGL時,被引入的42m檔案必須事先存在(註),因此當使用的 IMPORT 層級較複雜的時候,編譯系統要能夠跟上。
語法範例 IMPORT FGL lib_cl_dlg
不帶附檔名
註:Genero 2.50套件起,開放使用IMPORT FGL。編譯前必須自行確認需使用的 42m檔案是否已存在於當下路徑,或FGLLDPATH 環境變數中 (--JAVA是 CLASSPATH--)。
Genero 4.00套件後,開放可讓 FGL 相互 IMPORT,編譯時 fglcomp 可主動幫忙將 IMPORT FGL但不存在的部分進行編譯,並自動避免相互 IMPORT 造成的邏輯性報錯 (不再報錯)
因此,當需要使用 IMPORT FGL時,除了呼叫方式可用類似物件的呼叫方法,其餘與 link 功能均相同。
範例
調用端
IMPORT FGL module_01
IMPORT FGL module_02
一般函式 function: CALL module_01.create()
對話框
DIALOG
SUBDIALOG module_01.subinput
SUBDIALOG module_02.subinput
END DIALOG
被調用端 - module_01/module_02 兩隻
DIALOG subinput()
IMPORT FGL除了支援function呼叫外,也支援常用的對話框物件化。若大多數畫面要引入同一功能,過往都需要重複撰寫。從 Genero 2.50 開始支援 IMPORT FGL 後,此類重複性程式碼已可大幅減低,往 Low Code前進。