注冊一個部件時為部件調用RegisterComponents過程RegisterComponents告訴Delphi兩件有關所注冊的部件的事
● 要注冊部件所在的Component Palette的頁名
● 要安裝的部件的名字
選擇板的頁名是個字符串如果你所給名字的頁不存在Delphi就用該名字創建新的頁
下面的Register過程注冊了一個名為TMyComponent的部件並將其放在名為Miscellaneous的Component Palette頁上
procedure Register;
begin
RegisterComponents(Miscellaneous [TFirst TSecond])
end;
也可以在相同的頁上或者在不同的頁上一次注冊多個部件
procedure Register;
begin
RegisterComponents(Miscellaneous [TFirst TSecond])
RegisterComponents(Assorted [TThird])
end;
增加Component Palette上的位圖
每個部件都需要一個位圖來在Component Palette上代表它如果安裝時沒有描述自己的位圖則Delphi會自動套用缺省位圖
因為選擇板位圖只有在設計時需要所以沒有必要將它們編譯進庫單元而是將它們提供在與庫單名相同的Windows資源文件中擴展名為DCR用Delphi的位圖編輯器來生成資源文件每個位圖邊長個象素
為每個要安裝的庫單元提供一個選擇板位圖文件在每個文件中為每個要注冊的部件提供一個位圖位圖圖象名與部件名相同將文件放在與庫單元相同的目錄中這樣在安裝部件時Dephi就能發現位圖
例如如果你在ToolBox單元中創建一個名為TMyControl的部件就需要建立名為TOOLBOXDCR的資源文件文件中包含名為TMyControl的位圖
提供有關屬性和事件的幫助
當在窗體中選擇一個部件或在Object Inspector中選擇事件或屬性時能夠按F得到有關這一項的幫助如果創建了相應的Help文件的話自定義部件的用戶能得到有關你的部件的相應的文檔
因為Delph使用了特殊的Help引擎支持跨多個Help文件處理主題搜索所以你能提供關於自定義部件的小的Help文件用戶不需要額外的步驟就能找到你的文檔你的Help成了Delphi Help系統的一部分
要給用戶提供幫助要理解下列兩方面
● Delphi怎樣處理HELP請求
● 將HELP插入Delphi
⑴ Delphi怎樣處理HELP請求
Delphi基於關鍵詞查詢HELP請求就是說當用戶在窗體設計窗口的已選部件上按F鍵時Delpdi將部件的名字轉換成一個關鍵詞然後調用Windows Help引擎查找那個關鍵詞的幫助主題關鍵詞是Windows Help系統的標准部分實際上 WinHelp使用Help中的關鍵詞產生Search對話框中的列表因為用於上下文敏感搜索中的關鍵詞不是實際供用戶讀的所以要輸入關鍵詞的替代詞
例如一個查找名為TSomething的部件的詳細信息的用戶可能打開WinHelp的Search對話框並輸入TSomething但不會使用用於窗體設計窗口的上下文查找的替代形式classTSomething因此這個特殊的關鍵詞ClassTSomething對用戶是不可見的以免弄亂了搜索列表
⑵ 將Help插入Delphi
Delphi提供了創建和插入Windows Help文件的工具包括Windows Help編譯器HCEXE為自定義部件建立Help文件的機制與建立任何Help文件沒什麼不同但需要遵循一些約定以與庫中其它Help兼容
保持兼容性的方法如下
● 建立Help文件
● 增加特殊的注腳
● 建立關鍵詞文件
● 插入Help索引
當你為自定義部件建立完Help有下列幾個文件
● 編譯過的Help(HLP)文件
● Help關鍵詞(KWF)文件
● 一個或多個Help源文件(RTF)
● Help工程文件(HLJ)
編譯過的Help文件和關鍵詞文件應當與庫單元在同一目錄
① 建立Help文件
你可以使用任何的工具創建Windows Help文件Delphi的多文件搜索引擎可以包含任何數目的Help文件的要素在編譯的Help文件之外你應當擁有RTF源文件這樣才能生成關鍵詞文件
為使自定義部件的Help同庫中其它部件一起工作要遵循下列約定
● 每個部件有占一頁的幫助
部件幫助頁應當給出部件目的的簡單描述然後列出最終用戶可用的屬性事件和方法的描述應用開發者通過在窗體上選擇部件並按F訪問這一頁
部件幫助頁應當有一個用於關鍵詞搜索的K腳注腳注中包含部件名例如TMemo的關鍵詞腳注讀作TMemo Component
● 部件增加和修改的每一個屬性事件和方法應當有一頁幫助
屬性事件或方法的幫助頁應當指出該項用於哪個部件顯示聲明語法和描述它的使用方法
屬性事件或方法的幫助頁應當有一個用於關鍵詞搜索的K腳注該腳注中包含該項的名字和種類例如屬性Top的關鍵詞腳注為Top property
Help文件的每一頁也需要用於多文件索引搜索的特殊腳注
② 增加特殊腳注
Delphi需要特殊的搜索關鍵詞以區別用於部件的幫助頁和其它項目你應當為每一項提供標准的關鍵詞搜索項但你也需要用於Delphi的特殊腳注
要為來自Object Inspector窗口或代碼編輯器F的搜索增加關鍵詞就得為Help文件幫助頁增加B腳注
B腳注與用於標准WinHelp關鍵詞搜索的K腳注很相象但它們只用於Delphi搜索引擎下表列出怎樣為每種部件幫助頁建立B腳注
表 部件幫助頁搜索注腳
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
幫助頁類型 B腳注內容 示 例
──────────────────────────────────
主部件頁 class_+部件類型名 class_TMemd
一般屬性或事件頁 prop_+屬性名 prop_WordWrap
event_+事件名 event_OnChange
部件特有的屬性 prop_+部件類型名 prop_TMemoWordWrap或事件頁 +屬性名
event_+部件類型名 event_TMemoOnChange+事件名
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
區別一般幫助頁和部件特有的幫助頁是很重要的一般幫助頁應用於所有部件上的特定屬性和事件例如Left屬性是所有部件中的標識因此它用字符串PropLeft進行搜索而Bordestyle依賴於所屬的部件因此BorderStyle屬性擁有自己的幫助頁例如TEdit有BorderStyle屬性的幫助頁搜索字符串為Prop_TEditBorderStyle
③ 建立關鍵詞文件
建立和編譯了Help文件並且增加了腳注之後還要生成獨立的關鍵詞文件這樣Delphi才能將它們插入主題搜索的索引
從Help資源文件RTF創建關鍵詞文件的方法如下
● 在DOS提示行下進入包含RTF文件的目錄
● 運行關鍵詞文件產生程序KWGENEXE後跟Help工程文件如KWGEN SPECIALHPJ當KWGEN運行完畢後就有了與Help工程文件相同的關鍵詞文件但以KWF為擴展名
● 將關鍵詞文件放在編譯完的庫單元和Help文件相同的目錄
當你在Component Palette上安裝部件時希望關鍵詞插入Delphi Help系統的搜索索引
④ 插入Help索引
以自定義部件建立關鍵詞文件後要將關鍵詞插入Delphi的Help索引
將關鍵詞文件插入Detphi Help索引的方法如下
● 將關鍵詞文件放在與編譯完的庫單元和Heph文件相同的目錄中
● 運行HELPINST程序
HELPINST運行完後Delphi的Help索引文件(HDX)包含自定義部件幫助頁的關鍵詞
⑶ 存儲和裝入屬性
Delphi將窗體及其擁有的部件存儲在窗體文件(DFM)中DFM文件用二進制表示窗體的屬性和它的部件當Delphi用戶將自定義部件加入窗體中時自定義部件應當具有存儲它們的屬性的能力同樣當被調入Delphi或應用程序時部件必須能從DFM文件中恢復它們
在大多數時候不需要做任何使部件讀寫DFM文件的事存儲和裝入都是繼承的祖先部件的行為的一部分然而在某些情況下你可能想改變部件存儲和裝入時初始化的方法因此應當理解下述的機制
● 存儲和裝入機制
● 描述缺省值
● 決定存儲什麼
● 裝入後的初始化
① 存儲和裝入機制
當應用開發者設計窗體時Delphi將窗體的描述存儲在DFM文件中當用戶運行程序時它讀取這些描述
窗體的描述包含了一系列的窗體屬性和窗體中部件的相似描述每一個部件包括窗體本身負責存儲和裝入自身的描述
在缺省情況下當存儲時部件將所有public和published屬性的不同於缺省值的值以聲明的順序寫入當裝入時部件首先構造自己並將所有屬性設為缺省值然後讀存儲的非缺省的屬性值
這種缺省機制滿足了大多數部件的需要而又不需部件編寫者的任何工作然而自己定義存儲和裝入過程以適合自定義部件需要的方法也有幾種
② 描述缺省值
Delphi部件只存儲那些屬性值不同於缺省值的屬性如果你不描述Delphi假設屬性沒有缺省值這意味著部件總是存儲屬性
一個屬性的值沒被構造函數設置則被假設為零值為了描述一個缺省值在屬性聲明後面加default指令和新的缺省值
你也能在重聲明屬性時描述缺省值實際上重聲明屬性的一個原因是指定不同的缺省值只描述缺省值那麼在對象創建時並不會自動地給屬性賦值還需要在部件的Create方法中賦所需的值
下面的代碼用Align屬性演示了描述缺省值的過程
type
TStatusBar=class(TPanel)
public
constructor Create(Aowner: TComponent) override; { 覆蓋以設置新值 }
published
property Align default alBottom; { 重新聲明缺省值 }
end;
constructor TStatusBarCreate(Aowner: TComponent)
begin
inherited Create(Aowner) { 執行繼承的初始化過程 }
Align := alBottom; { 為Align賦新的缺省值 }
end;
③ 決定存儲什麼
用戶也可以控制Delphi是否存儲部件的每一個屬性缺省情況下在對象的published部分聲明的所有屬性都被存儲然而可以選擇不存儲所給的屬性或者設計一個函數在運行時決定是否存儲屬性
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25114.html