主頁:
郵件:
通過開發這個組件可以學會:
* 捕獲Windows消息
* 開發自定義的BCB組件
* 學習更多VCL的知識
前段時間在做畢業是為了實現一個類似的功能,同時為更深入學習組件的編寫技術,所以就自己動手進行開發。其間發現了一些問題,后來通過閱讀VCL的源碼解決了。這篇文章向大家有針對性地進行介紹在BCB中的組件開發,希望可以對大家的有所啟發?,F在這個稱為THistoryEdit的組件已經被加入到我的Maxspace Studio Component Library(MSSCL)的界面分類中,這是我免費提供的一個BCB組件包,同時提供所有源碼。要了解該組件庫的詳細信息請訪問我主頁的C/C++欄目:
至于如何在C++Builder中創建組件,請看另一篇文章“”
因為這個組件主要的作用還是數據輸入,只是附加了一個可以記錄輸入歷史的功能,所以我就直接從TCustomEdit類里繼承一個新的類,我在這里稱它為THistoryEdit,另外還要有一個用于保存輸入歷史的列表對象,我把它分成兩個對象,一個是用來存儲輸入歷史,另一個是用于顯示輸入歷史并與用戶進行交互。所以,我選擇使用TStringList來存儲輸入歷史,用TListBox來顯示輸入歷史并與用戶進行交互,使用對象組合的設計思想把它作為THistoryEdit的成員變量。
然后就要為它定義特有的屬性、方法及事件了。雖然輸入歷史只作為內部使用的數據就行,但為了使該組件可以提供更實用的功能,我就設計了一個TStringsList類型的屬性History,通過它可以讀取所有的輸入歷史內容??紤]到輸入歷史可能有存儲與重現的需求,因此我就設計了兩個方法,分別是LoadFromFile(FileName)和SaveToFile(FileName),這兩個方法以INI的文件格式實現對輸入歷史的保存與重現。另外增加一個OnHistoryListBoxShow的事件,當輸入歷史框出現時就會觸發這個事件,這樣THistoryEdit在設計上已經擁有了比較完善和靈活的功能。
然后就是一些細節的處理問題了。如組合對象的創建、消息處理和內部程序邏輯等。
要在從TControl繼承的組件中創建組合對象,如THistoryEdit中用于顯示輸入歷史并與用戶進行交互的TListBox時,必須重載TControl::SetParent(TWinControl* AParent),如果不重載該函數的就會在創建THistoryEdit對象時發生找不到Parent等的錯誤。
在THistoryEdit獲得焦點并編輯框的內容為空時顯示輸入歷史框(如果輸入歷史條數大于0),或失去焦點的時候輸入歷史列表應該要消失(如果已顯示),所以捕獲這些相關的Windows消息(WM_SETFOCUS, WM_KILLFOCUS...)后進行處理。
這篇文章就先寫到這里吧,大家看著源碼并對照著上面的設計來了解THistoryEdit的實現吧。
原文轉自:http://www.anti-gravitydesign.com