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

發表于:2007-07-01來源:作者:點擊數: 標簽:
主頁: 郵件: 通過開發這個組件可以學會: * 捕獲 Windows 消息 * 開發自定義的BCB組件 * 學習更多VCL的知識 前段時間在做畢業是為了實現一個類似的功能,同時為更深入學習組件的編寫技術,所以就自己動手進行開發。其間發現了一些問題,后來通過閱讀VCL的


主頁:
郵件:


通過開發這個組件可以學會:
  * 捕獲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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97