国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++ Builder創建組件探密

2019-11-17 05:23:21
字體:
來源:轉載
供稿:網友
1.創建組件的類聲明
class PACKAGE 新類名 : public 祖先類名
{
  • PRivate:私有數據:
    (1)內部私有用
    (2)發布屬性的真正數據保存
    (3)發布事件的數據保存
    (1,2,3)私有數據初始化一般在構造函數中,(3)的初始化一般與祖先該事件相連。
    通常為方便直接調用祖先方法常加保存祖先類型的變量:typedef 祖先類名 Inherit;
    私有方法:僅在類定義內部使用,不希望被繼續使用,不希望公開使用。(盡量寫成通用函數)
  • protected:保護數據:一般很少用。
    保護方法:一般是虛函數。在類定義時內部使用,對象不能直接調用,并把公開與否控制權給其派生類其派生類可以用重定義該方法,并可將其公開。
  • public:公有數據:一般屬性,但不屬于發布(即設計期不能操作)屬性并不是真正的數據需要私有數據來保存屬性,操作屬性通過方法。常用的定義如:
    方式1:
    __property AnsiString ItemData={read=FItemData,write=FItemData,default="A"};
    方式2:
    __property AnsiString ItemData={read=GetItemData,write=SetItemData,default="A"};
    FItemData是其數據私有保存處GetItemData(),SetItemData()是實現讀寫函數,其內部除了設置數據外還可以加相應的處理代碼,這部份處理就是屬性的最大優點。即通過直接修改屬性既實現了數據的讀寫又可實現的代碼處理,然而用戶的感覺似乎是只作了數據的改,正是這點“副作用”所帶來的。
    另外假如對屬性的修改不需要響應處理則只用定義方式1就行了。
    公有方法:實現類的封裝,改變數據成員都通過公有函數。(Method)重定義函數通常的先調用祖先類的該方法Inherit::XXX();(Inherit已說明,XXX表函數名), 然后再寫自身要作的處理代碼。
    __published:發布屬性:同公有部分的屬性,區別在于發布屬性在設計期可直接通過對象觀察器修改。祖先類已發布的屬性,最好在此作確認。
    順便指出方法不宜寫在發布聲明處,屬性同樣可寫成公有或私有,但是它們是無法在設計期訪問的,私有屬性僅在內部使用不向用戶提供。
} 寫組件應盡量多用屬性,而少用方法。只有屬性無法完成的工作才由方法來完成。
發布事件: 1.普通事件: 參數唯一僅有TObject *Sender,一般用TNotifyEvent(指針類型) 如:__property TNotifyEvent OnExit={read=FOnExit,write=FOnExit} ; 同屬性一樣需要私有數據來保存事件指針。 TNotifyEvent FOnExit;另外是事件處理代碼。 void __fastcall MyOnExit(System::TObject *Sender)其實現代碼中由 FOnExit(Sender)語句觸發事件;(注重事件處理函數返值void) 2.非凡事件:
首先:需定義事件類型指針(類似于函數指針的定義) typedef void __fastcall (__closure *TKeyDownEvent)(System::TObject* Sender, Word &Key,TShiftState Shift); 其次:要有數據保存處。在private處聲明:如 TKeyDownEvent FOnKeyDown ;
再次:有相應事件處理函數一般在protected處聲明。如 protected:virtual void __fastcall MyOnKeyDown(System::TObject *Sender, WORD &Key,TShiftState Shift); 代碼中常有 FOnKeyDown(Sender,Key,Shift) 最后:設定連接(需要提供前三者:事件指針類型,數據存放處變量,事件處理函數)。 __property TKeyDownEvent OnKeyDown={read=FOnKeyDown,write=FOnKeyDown}; }; 組件檢驗及注冊static inline void ValidCtrCheck(新類名 *){new 新類名(NULL);} 確保該控件聲明中沒有純虛函數,因為虛基類是不能生成實例的。 namespace 名稱空間 { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(新類名)}; } RegisterComponents("所屬包名", classes, 0);
還可加屬性編輯器說明 RegisterPropertyEditor(...)}}名稱空間是個C++特性,利用此Register()函數才可以區分其它控件。此命名必須符合規范,跟控件所在的文件名有關。如 TMyButton在 mybutton.cpp中則此命名空間為Mybutton.用New Component對話框生成新組件,不用考慮該問題。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 谢通门县| 南投县| 女性| 霞浦县| 天津市| 沛县| 射洪县| 隆化县| 鹤壁市| 永川市| 三门县| 康保县| 台南县| 武定县| 吐鲁番市| 宜君县| 将乐县| 盐边县| 柘城县| 青田县| 江永县| 盐山县| 尉氏县| 基隆市| 泉州市| 乐平市| 桐柏县| 桃江县| 马关县| 龙岩市| 黎川县| 三明市| 河西区| 巫山县| 吴江市| 岳池县| 麦盖提县| 阜阳市| 永川市| 南乐县| 宜宾县|