程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Delphi中菜單與工具欄按鈕的狀態控制

Delphi中菜單與工具欄按鈕的狀態控制

編輯:.NET實例教程
 在好多的桌面應用程序中,會使用到菜單和工具欄按鈕,不同的用戶登錄到應用系統中會依據其權限顯示相應的菜單與工具欄按鈕,在顯示出來的菜單與按鈕中又會根據程序的狀態來設置其有效性。舉個簡單的例子,通常保存按鈕是在編輯內容發生變化後才可以使用,數據集的保存需要在編輯狀態下才可以使用。

     剛開始編寫程序時,代碼中到處都是這些狀態控制代碼,如在數據集的“編輯”按鈕、菜單的單擊事件中啟用“保存”和“取消”按鈕、菜單,同時要禁止“編輯”按鈕、菜單,以防止用戶在編輯狀態下再次點擊編輯按鈕、菜單;同時還要在“保存”和“取消”按鈕、菜單的單擊事件中作相反的設置,禁用“保存”和“取消”按鈕、菜單。

    其實完全沒有必要如此麻煩,首先我們將菜單的單擊事件和工具欄按鈕單擊事件指向同一個事件過程上,這樣代碼量就可以減少一倍。如果還為客戶提供其他調用方式,如上下文菜單,同樣也可以將其單擊事件指向這個事件過程。讓多個用戶調用接口都指向一處是一個很明智的做法,不僅降低了代碼編寫量,同時也規范了執行動作。

    我們只要善加使用Delphi提供的VCL控件,就會發現有一個很好用的ActionList控件。它是若干Action的群集,每個Action對象都使用了命令模式封裝了一個操作。可以讓若干個菜單項或是工具欄按鈕等用戶控件與相應的Action對象綁定,這樣當用戶點擊這個菜單或是按鈕是就觸發了Action對象的執行事件(OnExecute),很輕松地實現了上文所說的“多個用戶調用接口指向同一處理過程”的設計。Action對象還有一個很不錯的OnUpdate事件,我們可以利用這個事件來控件Action對象的狀態與可視性(當我們設置Action對象的Enabled和Visible屬性時與其關系的相關控件的對應屬性也會被設置),這樣就不用在多處編寫狀態控制代碼了,實現集中管理。

    假設我們有一組與數據集相關的Action對象(Delphi其實已經將這些做為標准Action提供給我們了,此處僅是為了說明如何使用)對應著數據集的導航、編輯、保存、取消、刪除和新增操作。我們只需要在菜單中增加一些菜單項,並與這些Action對象綁定,如果需要也可以在工具欄上增加一些按鈕並Action對象綁定,這樣我們就提供了兩處調用接口:菜單項與工具欄按鈕。但我們的代碼僅有一處,就是Action的OnExecute事件。我們需要根據數據集的狀態動設的設置這些功能的能用與否,只要在ActionList控件的OnUpdate事件中編寫狀態控制代碼即可控件與這些Action對象相綁定的菜單項與按鈕的狀態。



procedure TForm1ActionList1Update(Action: TBasicAction;
  var Handled: Boolean);
begin
  actFirst.Enabled := not DataSet.Bof;
  actPrior.Enabled := not DataSet.Bof;
  actNext.Enabled := not DataSet.Eof;
  actLast.Enabled := not DataSet.Eof;
  actInsert.Enabled := DataSet.State in [dsBrowse];
  actPost.Enabled := DataSet in dsEditModes;
  actCancel.Enabled := DataSet in dsEditModes;
  actDelete.Enabled := (DataSet.State in [dsBrowse]) and (DataSet.RecordCount > 0);
end;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved