本文介紹 Genero 2.20 引入的 INFIELD 子句,說明如何根據欄位焦點來控制動作(Action)的啟用狀態,以簡化查詢窗口等常見場景的實作。
問題背景
在多欄位表單中,開發者常需要根據游標所在的欄位來決定某個動作是否可用。例如,不同欄位各有對應的查詢(Zoom)視窗,動作的可用性需隨焦點變化而切換。
在 INFIELD 出現之前,必須透過繁瑣的方式手動管理動作狀態:
BEFORE INPUT
CALL DIALOG.setActionActive("action-name", FALSE)
BEFORE FIELD field-name
CALL DIALOG.setActionActive("action-name", TRUE)
AFTER FIELD field-name
CALL DIALOG.setActionActive("action-name", FALSE)
ON ACTION action-name
...
或是在 ON ACTION 內部使用 FGL_DIALOG_GETFIELDNAME() 判斷目前欄位,再執行對應的邏輯。這些做法都增加了程式碼複雜度與維護難度。
INFIELD 子句的語法
Genero 2.20 引入的 INFIELD 子句,讓動作只在游標位於指定欄位時才會啟用:
ON ACTION action-name INFIELD field-name
...
這個簡潔的語法,取代了上述所有手動管理動作狀態的程式碼。
多欄位查詢視窗的典型用法
每個欄位對應各自的查詢邏輯,使用 INFIELD 可以清楚地分開定義:
ON ACTION zoom INFIELD field1-name
LET field1-name = zoom_field1()
ON ACTION zoom INFIELD field2-name
LET field2-name = zoom_field2()
這讓程式碼的意圖更清晰,也更易於維護。
Genero 3.10 的改進:BUTTONEDIT 支援
在 3.10 版本中,INFIELD 功能進一步完善,BUTTONEDIT 元素不再需要使用帶欄位前置名稱的動作名稱。
舊版寫法(需要欄位限定名稱):
BUTTONEDIT f01 = formonly.field-name, ACTION=field-name.action-name, ...;
新版寫法(可直接使用動作名稱):
BUTTONEDIT f01 = formonly.field-name, ACTION=action-name, ...;
這讓按鈕行為更直覺,程式碼也更簡潔。
實際效益
- 省去手動在 BEFORE/AFTER FIELD 中呼叫
DIALOG.setActionActive()。 - 不再需要用
FGL_DIALOG_GETFIELDNAME()判斷目前焦點所在。 - 多欄位查詢視窗的實作更簡潔明瞭。
- 程式碼的可讀性與可維護性大幅提升。
建議
作者鼓勵開發者定期回顧現有程式碼,主動採用語言的新功能加以簡化,並積極參與 Genero 的早期體驗計畫(Early Access Program),提供對新語法的回饋意見。
相關文件參考:
原文:https://4js.com/ask-reuben/ig-91/
· 有任何 Genero 技術問題或翻譯疑問,歡迎來信
support@t100.app