FGL程式運行時可用的畫面已經可做出來了,但總不能只是拿來 DISPLAY TO 資料,應該要拿來做一些操作吧?
FGL 自然不是只拿畫面來輸出資料的。直接歸納給各位看,編排一個常用的劇情如下:
上述劇情中的 4 場景,可對應到FGL的『4類』6種交談指令,分類分別為:
- 功能選單:直接進行選擇MENU/ 搭配表格資料呈現的功能選擇 DISPLAY ARRAY
- 資料輸入:一般表單資料輸入 INPUT/ 搭配表格資料輸入的 INPUT ARRAY
- 查詢條件輸入:查詢條件輸入的 CONSTRUCT
- 問題答詢:PROMPT
交談指令語法
語法: 指令名稱 ATTRIBUTES(屬性)
控制區塊
END 指令
不同的交談指令具備不同的屬性與控制區塊,如果不存在控制區塊,則可以不用END指令。接下來探究個別的交談指令用法。
MENU選單指令
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 ARRAY
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之外還有
- DOUBLECLICK = action-id 指定雙擊的事件要觸發哪一個 action-id,通常會設定為『維護』功能
- ACCEPT =TRUE / FALSE 與 CANCEL = TRUE / FASE 這兩組是設定 ACCEPT/CANCEL 兩顆按鈕是否呈現/消失
DISPLAY ARRAY 可以維護TABLE/SCROLLGIRD甚至是 TREE containar,因此還可支援下述區塊,提供不同的畫面使用:
就地維護控制區塊 (TABLE/SCROLLGRID/TREE適用)
理論上已經啟用了交談指令A,若不是同樣處在同一個DIALOG時,是不能再調起另一個交談指令的。但是在Genero 2.50後,開始支持簡易版的就地維護模式,因此在DISPLAY ARRY中創造下列的豁免區塊,可以在下列區塊中啟動INPUT指令進行單行的維護。
- ON APPEND [ ATTRIBUTES (…) ] #跳到行尾空白行進行維護
- ON INSERT [ ATTRIBUTES (…) ] #插入一個空白行維護
- ON UPDATE [ ATTRIBUTES (…) ] #進入指定行進行維護
- ON DELETE [ ATTRIBUTES (…) ] #觸發刪除所在行,但陣列與database需自行處理
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) 的工作。
另外,在範例中,要特別注意:
- ARR_CURR( ) 指的是取用現在畫面對應在變數中的哪一筆
- SCR_LINE( ) 指的是取用現在停留在畫面的哪一個位置
兩者意義上還是有差異的,請小心不要混用。
拖拉功能控制區塊 (TABLE/TREE適用)
- ON DRAG_START ( dnd-object )
- ON DRAG_FINISH ( dnd-object )
- ON DRAG_ENTER ( dnd-object )
- ON DRAG_OVER ( dnd-object )
樹狀伸展控制區塊 (TREE適用)
- ON EXPAND ( row-index )
- ON COLLAPSE ( row-index )
上面提到的 ** 『拖拉(drag and drop)』與『樹狀(TREE)開啟(expand)/關閉(collapse)』** 將會由特殊形態的程式開發方法來做介紹說明。
熟悉這些控制區塊,才能夠對應到不同用戶的需求,設計出符合規格的應用程式。其他的交談指令項目待下回分解。