用C++Builder開發具有歷史記錄功能的編輯控件


主頁:http://www.maxss.net
郵件:[email protected]


通過開發這個組件可以學會:
  * 捕獲Windows消息
  * 開發自定義的BCB組件
  * 學習更多VCL的知識

  前段時間在做畢業是爲了實現一個類似的功能,同時爲更深入學習組件的編寫技術,所以就自己動手進行開發。其間發現了一些問題,後來通過閱讀VCL的源碼解決了。這篇文章向大家有針對性地進行介紹在BCB中的組件開發,希望可以對大家的有所啓發。現在這個稱爲THistoryEdit的組件已經被加入到我的Maxspace Studio Component Library(MSSCL)的界面分類中,這是我免費提供的一個BCB組件包,同時提供所有源碼。要了解該組件庫的詳細信息請訪問我主頁的C/C++欄目:http://www.maxss.net/cc

  至於如何在C++Builder中創建組件,請看另一篇文章“使用C++Builder創建自定義VCL組件時的一些問題

  因爲這個組件主要的作用還是數據輸入,只是附加了一個可以記錄輸入歷史的功能,所以我就直接從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的實現吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章