上一篇,介紹了元件開發的一般概述,以及元件類層次結構的各個類的大緻資訊!現在就開始通過執行個體進行來簡單的講述一下一般元件的開發過程!我這裡先采用最基本的方式來建立一個元件!也就是使用Delphi自己的元件開發向導來建立一個新的元件。在這裡,我以擴充TEdit為例進行講解。
那麼首先,要介紹的就是如何使用Delphi的元件開發向導了!這個向導在Delphi IDE的Component菜單下的NewComponent打開就是向導了,可以參照如下:
從圖上可以看到,我通過向導,我先選擇了從元件Tedit往下繼承,于是Delphi自動生成了新元件類TEdit1,然後我選擇了将本元件注冊到Standard這個控件面闆上去,然後儲存了單元檔案到C:\Test這個目錄下!然後點選下一步完成,delphi自動幫我們生成了一個Edit1.pas的單元檔案。這樣一個新的基本控件就完成了!此時,就可以在我們的工程中使用TEdit1.Create(nil)這樣的語句來建立剛剛建立的新Edit元件了,隻是現在的這個控件與TEdit沒有任何功能上的差別,唯一的卻别就是僅僅變了變元件的類名稱而已!是一個沒有任何意義的元件!下面,我要開始講解的便是擴充一下這個Edit,使得這個控件具備一些Delphi的TEdit所不具備的功能!
我想一想,擴充幾個啥功能呢!貌似Delphi自己的Tedit沒有Alignment這個屬性哈,那麼第一步,就來先為我們剛剛建立的那個新元件增加一個Alignment屬性,可以讓使用者來設定Edit中文字的對齊方式吧!怎麼能設定Edit編輯框的文字的對齊方式呢!這個網上有很多資料的,我們查查MSDN,可以發現Edit有幾種樣式ES_LEFT, ES_RIGHT, ES_CENTER分别用來設定文字的左對齊,右對齊和居中對齊!一般情況下,預設的是左對齊,如果要修改Edit的對齊方式為其他的對齊方式,那麼,我們就需要設定編輯框的樣式為新的樣式,Windows有一個API函數,專門用于設定其控件的樣式的函數為SetWindowLong,如果要在運作時直接對Delphi的Edit設定對齊方式,就可以用該函數來實作!比如
SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_Right);
這一句就能讓Edit1的對齊方式變成右對齊,于是,我們可以想象,我們可以在元件内部開放一個屬性,使用者一設定,就能調用這個代碼來執行!是以,我先在我們剛剛生成的那個單元類TEdit1的Published域中添加上一個新的屬性
published
{ Published declarations }
property Alignment: TAlignment;
然後按住Ctrl+Shift+C,Delphi就會自動幫你把屬性設定補全!變為
property Alignment: TAlignment read FAlignment write SetAlignment;
此時,有必要來介紹一下Delphi的屬性Property,delphi的屬性由property關鍵字定義,後面跟上一個屬性名稱,以及屬性的資料類型聲明,然後跟上屬性的讀寫來源,讀寫來源采用read和write關鍵字标記,那麼當我們調用屬性的資料的時候就會調用屬性的讀方法,如果向屬性中寫入值的時候,就會調用屬性對應的寫方法或者寫的對應變量值!
好,我們看一下Alignment這個屬性的聲明,read域指定的是FAlignment,這就表示當外部調用Alignment的時候,實際上就是直接調用的FAlignment的值了,而當我們外部向Alignment屬性寫入值的時候,那麼此時,就是調用的Write域所對應的SetAlignment方法了!我們現在最主要最關鍵的就是要實作SetAlignment這個方法。當使用者設定了這個屬性的時候,就會直接觸發改變編輯框的對齊方式!前面已經給出了代碼SetWindowLong可以實作修改Edit的編輯框樣式,那麼我們這裡也就用那個方法來實作一下這個改變對齊方式的屬性
這個代碼很簡單,我就直接給出來算了
代碼
我在裡面寫的代碼比前面給的代碼多了一個
style := style and (not ES_LEFT) and (not ES_CENTER) and (not ES_RIGHT);這樣的東西,可以試着思考一下為什麼要這樣寫!
然後在最後還添加了一個Invalidate;可以試着注釋掉這個函數,然後試着改變屬性,看看會有什麼樣的效果!為什麼會這樣?
最後,我再給一個不是用SetWindowLong這個API來實作改變這個屬性的效果的方法代碼,大家可以先參考參考,至于原理若何,後面再做介紹!
那便是改寫Edit控件的CreateParams方法,先在Protected域中聲明
protected
procedure CreateParams(var Params: TCreateParams); override;
之後實作如下
<a></a>
procedure TEdit1.CreateParams(var Params: TCreateParams);
const
Alignments: array[TAlignment] of DWORD = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
inherited CreateParams(Params);
with Params do
ExStyle := Exstyle and not WS_EX_Transparent;
Style := Style and not WS_BORDER or Alignments[FAlignment];
end;
然後SetAlignment修改為
procedure TEdit1.SetAlignment(const Value: TAlignment);
if FAlignment <> Value then
FAlignment := Value;
RecreateWnd;
注意兩者SetAlignment的實作方式!然後思考一下!
先看看效果
<a href="http://files.cnblogs.com/DxSoft/Test.rar">代碼下載下傳!</a>
本文轉自 不得閑 部落格園部落格,原文連結:http://www.cnblogs.com/DxSoft/archive/2010/04/27/1721711.html ,如需轉載請自行聯系原作者