剛開始編寫程序時,代碼中到處都是這些狀態控制代碼,如在數據集的“編輯”按鈕、菜單的單擊事件中啟用“保存”和“取消”按鈕、菜單,同時要禁止“編輯”按鈕、菜單,以防止用戶在編輯狀態下再次點擊編輯按鈕、菜單;同時還要在“保存”和“取消”按鈕、菜單的單擊事件中作相反的設置,禁用“保存”和“取消”按鈕、菜單。
其實完全沒有必要如此麻煩,首先我們將菜單的單擊事件和工具欄按鈕單擊事件指向同一個事件過程上,這樣代碼量就可以減少一倍。如果還為客戶提供其他調用方式,如上下文菜單,同樣也可以將其單擊事件指向這個事件過程。讓多個用戶調用接口都指向一處是一個很明智的做法,不僅降低了代碼編寫量,同時也規范了執行動作。
我們只要善加使用Delphi提供的VCL控件,就會發現有一個很好用的ActionList控件。它是若干Action的群集,每個Action對象都使用了命令模式封裝了一個操作。可以讓若干個菜單項或是工具欄按鈕等用戶控件與相應的Action對象綁定,這樣當用戶點擊這個菜單或是按鈕是就觸發了Action對象的執行事件(OnExecute),很輕松地實現了上文所說的“多個用戶調用接口指向同一處理過程”的設計。Action對象還有一個很不錯的OnUpdate事件,我們可以利用這個事件來控件Action對象的狀態與可視性(當我們設置Action對象的Enabled和Visible屬性時與其關系的相關控件的對應屬性也會被設置),這樣就不用在多處編寫狀態控制代碼了,實現集中管理。
假設我們有一組與數據集相關的Action對象(Delphi其實已經將這些做為標准Action提供給我們了,此處僅是為了說明如何使用)對應著數據集的導航、編輯、保存、取消、刪除和新增操作。我們只需要在菜單中增加一些菜單項,並與這些Action對象綁定,如果需要也可以在工具欄上增加一些按鈕並Action對象綁定,這樣我們就提供了兩處調用接口:菜單項與工具欄按鈕。但我們的代碼僅有一處,就是Action的OnExecute事件。我們需要根據數據集的狀態動設的設置這些功能的能用與否,只要在ActionList控件的OnUpdate事件中編寫狀態控制代碼即可控件與這些Action對象相綁定的菜單項與按鈕的狀態。