本文介紹 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