程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Builder 使用動作

C++ Builder 使用動作

編輯:C++入門知識

  4.9.2 使用動作
  
  可以從組件面板的Standard頁將動作列表加入窗體或數據模塊。雙擊動作列表可顯示ActionList編輯器,在其中可增加、刪除或重排動作。每個動作的屬性(Name除外)值都將應用於其客戶控件。可在對象觀察器中設置每個動作的屬性。Name定義動作,而其他屬性與事件(Caption、Checked、Enabled、HelpContext、Hint、ImageIndex、ShortCut、Visible和Execute)則對應於客戶控件的屬性。它們通常(不一定全是)和客戶屬性同名。例如動作的Checked屬性對應於TToolButton的Down屬性。
  
  1.集中處理程序代碼
  所有控件都包括一個公共的屬性Action,它使控件可作為動作對象的客戶使用。一般用做動作對象的客戶的控件,如TToolButton、TSpeedButton、TMenuItem和TButton會發布Action屬性以便可在設計時建立客戶/動作的關系。當為動作列表的某個動作設置Action屬性時,動作的對應屬性值將復制到客戶控件中。動作對象的所有公共屬性與事件(除Name和Tag之外)都動態地鏈接到客戶控件。例如,當需要禁用按鈕和菜單項時,可將相應的程序代碼集中在動作對象內,而不必去為按鈕和菜單項重復編制程序代碼;這樣,當動作被禁用時,所有對應的按鈕和菜單項都會被禁用。
  
  注重 假如使用工具按鈕或菜單項,必須用手工方式將對應的工具欄或菜單組件的Images屬性設置為動作列表的Images屬性。即使ImageIndex屬性已動態地鏈接到客戶,也必須如此。
  
  2.鏈接屬性
  當設置了客戶的Action屬性後,建立了客戶控件和動作之間的鏈接。這種鏈接由客戶的動作鏈接治理,它可將客戶的屬性與動作的屬性關聯起來。當動作改變時,動作鏈接更新客戶屬性。
  可有選擇地重載客戶的某一屬性與相關動作對應屬性的鏈接。在設計時設置客戶的某值,只影響該屬性的鏈接,客戶的屬性改變,而相關動作對應的屬性值不變,客戶與相關動作其他的鏈接也不受影響。應用程序並不需要顯式處理動作鏈接來使用動作。動作鏈接自動治理客戶與動作相應屬性的鏈接。
  每個獨立的客戶控件都使用不同的動作鏈接類,每個類中都有一組可用於與動作鏈接的屬性。
  
  注重可通過查閱VCL參考的動作鏈接類部分來決定要與動作鏈接的客戶控件的屬性。
  
  3.執行動作
  當客戶組件或控件被按下之後,其相關動作的OnExecute事件將會發生。下列程序代碼介紹的
  OnExecute事件處理程序,可在動作執行時顯示或隱藏工具欄:
  
  當用戶點擊客戶控件時,客戶會為其相關動作生成OnExecute事件。若該事件存在事件處理程序,用戶點擊動作將直接被處理。除非需要與其他事件處理程序共享代碼或編寫定制的、可重用的動作,否則只需加入動作到動作列表,設置其屬性,編寫OnExecute事件處理程序代碼,並通過設置Action屬性將其與所有相關控件鏈接。
  若要編寫一個事件處理程序包含對多個動作的響應,可編寫一個響應動作列表甚或應用程序層的事件處理程序。C++Builder遵循一個分發流程以搜索響應用戶動作的方法。
  考慮一個例子,組件顯示在圖4-11中。客戶Speedbutton1鏈接Cut1動作(Speedbutton1的Action屬性為Cut1)。圖4-11顯示當用戶單擊Speedbutton1後的發送(dispatching)流程。
   單擊Speedbutton1將啟動下列的執行流程:
  1) 因為Speedbutton1的Action屬性為Cut1,Cut1接收到OnExecute事件,若Cut1存在OnExecute事件處理程序,進程在此終止。若Cut1不存在OnExecute事件處理程序,則進程繼續。
  2) 因為Cut1不存在OnExecute事件處理程序,流程順延由其動作列表(ActionList1)處理事件。ActionList1接收到OnExecute事件(動作列表的OnExecute事件,在其中任一動作沒有OnExecute事件處理程序用以處理事件時發生),動作列表的OnExecute事件處理程序有一參數Handled,其缺省返回值為false,若處理程序存在並處理了事件,返回true,且進程在此終止。
  
  例如:
  
  若動作列表的OnExecute事件未被處理,則進程繼續。
  
  3)全局對象Application接收到OnActionExecute事件(該事件在應用程序中所有的動作列表都無法處理事件時發生),與動作列表的OnExecute事件處理程序相同,OnActionExecute事件處理程序也有一參數Handled,其缺省返回值為false。若處理程序存在並處理了事件,返回true,且進程在此終止。例如:
  
  
  4)對於可用事件處理程序響應的動作,進程到此終止。但對於預定義的動作類,如Cut1,則進程並未結束。你可使用內置的動作類或自行生成知道如何確定目標的動作類(如編輯控件)。當所有層次都未發現事件處理程序時,應用程序將試圖搜索動作執行的目標,當應用程序找到哪個動作知道如何定位的目標時,將激活動作。參見4.9.4節的“動作如何搜索其目標”可獲得關於應用程序如何找到那些預定義的動作類的目標的更多內容。
  
  4.更新動作
  當應用程序空閒時,所有與當前正顯示的控件或菜單鏈接的動作的OnUpdate事件發生。這給應用程序代碼集中處理提供了可用與禁用或復選與否等等的時機。例如,下列代碼舉例說明當菜單欄可見時OnUpdate處理動作的“復選”的事件處理程序。
  
  
  更新動作的分發流程與本節中討論的“執行動作”中的分發流程相同。
  警告 不要把費時的代碼加到OnUpdate事件處理程序中。OnUpdate事件處理程序在應用程序空閒時執行。若事件處理程序需要太多時間,會影響整個應用程序的執行。
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved