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

C++ Builder 編寫動作組件

編輯:C++入門知識

  4.9.4 編寫動作組件
  
  一般使用的動作是通過在對象觀察器中設置其屬性為具體的應用程序創建的。要使用這樣的動作,必須編寫事件處理程序在本節的“執行動作”部分描述的分發流程中的某一點上響應動作。
  當使用C++Builder自帶的預定義動作時,不需要寫任何事件處理程序,因為目標組件知道如何響應該動作。也可以創建自己的預定義動作類。當編寫自己的動作類時,可內嵌能夠在某些特定目標對象類上執行的能力。然後,就可像使用預定義動作類一樣使用你的定制動作類。也就是說,當動作能自行識別並應用於目標類時,就可簡單地將動作分配給客戶控件,並且不需要編寫事件處理程序,它會自行作用於目標。
  
  1.動作如何搜索其目標
  本節的“執行動作”部分描述了用戶激活動作時發生的執行流程。若在動作、動作列表或應用程序層都沒有事件處理程序響應動作時,則應用程序試圖找到一個動作可自行作用的目標對象。圖4-12舉例說明了應用程序搜索這種目標對象的過程。預定義動作類和自行創建的動作類都遵循這一過程。
  
  1)應用程序收到一個CM_ACTIONEXECUTE消息,它指示動作未被任何事件處理程序處理。這種應用程序將它分發到屏幕的ActiveForm處。若沒有當前活躍的窗體,應用程序將消息分發到MainForm。
  2)Form1(在本例中為當前活躍的窗體)首先搜索當前活躍的控件(Memo1),將其作為潛在的目標。當前活躍的控件(Memo1)調用動作的HandlesTarget方法,確定自己是否是適當的動作目標。若Memo1不是適當的目標,HandlesTarget返回false,並且該控件通知應用程序它不是有效目標。
  3)在本例中,Memo1是Cut1的適當的目標,因此HandlesTarget返回true。然後Memo1調用Cut1:ExecuteTarget,並將自身作為一個參數傳入。
  4)因為Cut1是TEditCut動作的一個實例,該動作調用Memo1的CutToClipboard方法:
  
  
  若該活躍控件不是適當的目標,進程會繼續如下:
  · Form1檢查自身是否是適當的目標。若 Form1是適當的目標(例如,窗體可以作為這個TWindowCascade動作的目標),它調用Cut1的ExecuteTarget方法並將自身作為一個參數傳入。
  · 若Form1不是適當的目標,應用程序會在Form1的所有可見控件中循環,直到發現目標。注重 若該動作是TCustomAction的後裔,那麼當它不能被處理時將自動被禁用,同時其DisableIfNoHandler屬性為true。
  
  2.注冊動作
  當編寫自己的動作時,可通過使用ActnList單元中的全局例程在IDE中注冊動作或注銷其注冊:
  
點擊查看大圖

  
  當調用RegisterActions時,注冊的動作在動作列表編輯器中出現以供給用程序使用。可通過賦予分類名來組織動作,或通過Resource參數提供缺省的屬性。
  
  例如,下列代碼在IDE中將動作注冊入MyAction單元:
  
  
  當調用UnRegisterActions時,動作不再在動作列表編輯器上出現。
  
  3.編寫動作列表編輯器
  可為動作列表編寫自己的組件編輯器。假如要這樣做,需將自己的過程賦予ActnList單元中的四個全局過程變量:
  
點擊查看大圖

  
  若要用非缺省的方式治理注冊、注銷注冊、創建及枚舉過程的動作,只需重新給這些變量賦值即可。為此,編寫自己的處理程序,並在設計時單元初始化部分給這些變量賦值。
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved