FGL程式運行時可用的畫面已經可做出來了,但總不能只是拿來 DISPLAY TO 資料,應該要拿來做一些操作吧?
FGL 自然不是只拿畫面來輸出資料的。直接歸納給各位看,編排一個常用的劇情如下:
上述劇情中的 4 場景,可對應到FGL的『4類』6種交談指令,分類分別為:
語法: 指令名稱 ATTRIBUTES(屬性)
控制區塊
END 指令
不同的交談指令具備不同的屬性與控制區塊,如果不存在控制區塊,則可以不用END指令。接下來探究個別的交談指令用法。
MENU "顯示MENU的操作說明"
COMMAND "A.按下說明" #MENU-COMMAND 是最簡單的結構,後方跟上的是要顯示給操作者看的 "字串"
#此處寫該功能的程式碼,例如 CALL function,可以做檢查、做功能
#第一個字元系統會自動轉換為快捷鍵,因此建議不要使用中文字元,而以英文字元並且勿重複,如"A"
ON ACTION action_id #MENU-COMMAND 有多語言問題,所以Genero另外推出 MENU-ON ACTION結構
# action_id 只是一個編號,正式呈現的以 .4ad(action default)檔案設定為準 ( [Resource檔案設定](https://ithelp.ithome.com.tw/articles/10260628) ),包含快捷鍵
#其餘功能與 COMMAND 控制區塊相同
COMMAND KEY(F1) #舊式的快捷鍵寫法,新式的使用 .4ad檔案設定
#此處寫功能的程式碼
ON IDLE 5 #若操作人進入此段落後不操做鍵盤、滑鼠 5秒鐘,則觸發此段落
#此處寫對應處理的程式碼,例如終止或退出程式
ON TIMER 10 #3.20後提供的新控制區塊,可指定一個定期需要檢是的指令段落
#此處寫循環檢查的品項,例如是不是已經滿足了『全部的連線都已經超過IDLE設定』之類的消息檢查
END MENU
主要功能如程式碼範例內描述的。另外控制區塊還可以有 BEFORE MENU / AFTER MENU。意思就是在進入MENU前與離開 MENU指令的時候個別要做哪些事情。
特殊形的控制區塊 (如BEFORE MENU/AFTER MENU/ON IDLE等),沒辦法指定多次。
DISPLAY 的語法將會較MENU更加複雜,畢竟MENU的存在只是單純提供功能的選擇;而** DISPLAY ARRAY的存在,除了次要的功能選擇外,最主要的是用來呈現陣列的資料 **。因此使用 DISPLAY 前要先將畫面處理好。也就是OPEN WINDOW中要含有 TABLE或SCROLLGRID 容器。並且欄位數要能對上 (包含phatom)。
當欄位數無法對上時,執行 DISPLAY ARRAY會出現錯誤訊息。(編譯時不會)
DISPLAY ARRAY中控制區塊,MENU有的DISPLAY ARRAY 都有,只是此處改為 BEFORE DISPLAY/AFTER DISPLAY來管理進入前與離開後。
DISPLAY ARRAY g_array TO s_array.* ATTRIBUTES(COUNT=total_rows) #顯示陣列變數到畫面陣列(s_array)
#此功能開始出現ATTRIBUTES,可預先指定此指令要表現的行為,COUNT為總顯示行數
BEFORE ROW #進入一行時要做的事
CALL DIALOG.setSelectionMode( "s_array", 1 ) #將此DISPLAY ARRAY設定為多選,0為單選
#此處寫功能的程式碼:例如重新確認資料庫刷新畫面 (多人共同編輯資料的時候要做的保護)
AFTER ROW #離開一行時要做的事
#此處寫功能的程式碼
以上是DISPLAY ARRAY初段落常出現的範例。在 ATTRIBUTES 部分,常見的除了 COUNT之外還有
DISPLAY ARRAY 可以維護TABLE/SCROLLGIRD甚至是 TREE containar,因此還可支援下述區塊,提供不同的畫面使用:
就地維護控制區塊 (TABLE/SCROLLGRID/TREE適用)
理論上已經啟用了交談指令A,若不是同樣處在同一個DIALOG時,是不能再調起另一個交談指令的。但是在Genero 2.50後,開始支持簡易版的就地維護模式,因此在DISPLAY ARRY中創造下列的豁免區塊,可以在下列區塊中啟動INPUT指令進行單行的維護。
ON INSERT
LET li_pos = ARR_CURR() #確定插入的位置
INPUT g_arr[li_pos].* FROM record1[scr_line()].*
AFTER INPUT
IF g_arr[li_pos].warehouse_no IS NOT NULL THEN
INSERT INTO d_tag(tenantsid,comp_no) VALUES(g_tenantsid,g_comp_no)
END IF
END INPUT
依據上面的範例,簡單的說就是觸發後,放入一個INPUT指令,輸入完成(AFTER INPUT)時,順便執行寫入資料庫(INSERT INTO) 的工作。
另外,在範例中,要特別注意:
拖拉功能控制區塊 (TABLE/TREE適用)
樹狀伸展控制區塊 (TREE適用)
上面提到的 ** 『拖拉(drag and drop)』與『樹狀(TREE)開啟(expand)/關閉(collapse)』** 將會由特殊形態的程式開發方法來做介紹說明。
熟悉這些控制區塊,才能夠對應到不同用戶的需求,設計出符合規格的應用程式。其他的交談指令項目待下回分解。