11.1 Help文件的建立
Help文件是Micosoft Windows3.0以上的版本提供的超文本幫助文件。利用這種超文本,用戶可非常方便地使用幫助文件系統。幫助文件是以主題為主線進行編寫的,一個主題可以跳轉至相關的主題,也可按關鍵字進行主題查詢。幫助文件與軟件開發工具相結合,可實現應用程序的'上下文敏感',而且幫助系統自動裝入。“上下文敏感”是指根據程序當前執行代碼來顯示Help文件的相應部分。
Windows提供的很多應用程序都有幫助系統,讀者可以從這些系統中了解應用程序的許多信息。
11.1.1 建立Help文件所需的工具和文件程序員可為自己的應用程序建立幫助文件系統。但建立最基本的幫助系統, 必須有以下文件
1. WinHelp 應用程序 ( WinHelp.exe) 。運行幫助系統實際上是運行用幫助源文件的
WindHelp程序。幫助文件只有通過WinHelp文件才能運行。2. 能創建主題的字處理器。這種處理器能以RTF格式保存文件, 能創建$,#,K,+腳標。RTF(Rich Text Format)格式是一個能記錄各種文本特征的文件格式。這些特征包括字體大小、線型風格等。Microsoft Word 6.0處理器能滿足以上要求。
3. 一個能以ASCII格式保存文件的字處理器或編輯器,這是為了創建Help工程文件(.HPJ文件)。4. 幫助文件編譯器(HCP.EXE或HC31.EXE),兩種編譯器均能編譯在Windows3.1 環境中使用的幫助文件,但不能編譯Windows3.0環境下的幫助文件。HCP.EXE是保護模式的編譯器,能更好地使用內存空間。要在Windows的DOS窗口中使用HCP.EXE編譯器。
5. 幫助編譯器所需的錯誤信息源文件(HCP.ERR或HC31.ERR)。如果幫助文件在編譯過程中出現錯誤,WinHelp運行時將提示有關的錯誤信息,而這些信息保存在HCP.ERR或HC31.ERR文件中。以下工具能實現幫助系統的高級特征:
1. 熱點(Hotspot)編輯器(SHED.EXE);熱點編輯器能創建分段超圖像文件(.SHG)。這種文件包括一些分成多個熱點的圖像,當用戶單擊圖像,將彈出一個窗口或跳轉至另一主題。
2. 多分辨率位圖編譯器(MRBE.EXE);這種編譯器能將具備多種分辨率的位圖結合到一個文件中,以供WinHelp 使用。WinHelp檢查顯示器的分辨率, 然後以相應的分辨率加以顯示。
3. 圖像編輯器,它能以位圖形式保存圖像文件。 使用圖像編輯器創建說明和自定義按鈕。4. 繪圖軟件。用以創建除了位圖之外的元文件(WMF);
程序員可以直接把圖像插入文本中,也可以用Windows剪貼板把圖像粘貼至文本中。
11.1.2 Help文件的創建下面介紹最簡單、最直接的創建Help文件的方法,假設在Word中創建主題。 創建
Help文件分以下4個步驟:1. 建立組成幫助文件的主題,並以RTF格式保存;
2. 建立內容主題(Content Topic),並以RTF格式保存;3. 建立幫助工程文件(.HPJ)以文本格式保存;
4. 將工程文件編譯成幫助源文件(.HLP)。
11.1.2.1 建立主題一個簡單的幫助主題包括主題題目(Title),主題文本(Text),腳標,主題內容,全局查詢、打印。主題最好是帶有題目,題目寫在主題的第一行。用不同的字體大小、顏色以示區別
寫完題目後,可輸入主題的文本。輸入時不用擔心每行的寬度。 編譯好的幫助文件會根據窗口大小自動確定行寬。在主題的最後插入一個分頁符,WinHelp把每頁視為一個單獨主題。書寫主題文本時應注意盡可能地把文本寫成小段落列表,這樣能方便閱讀; 同時要控制主題長度,這樣用戶不需要使用滾動條來閱讀文本。
在主題中應加入一些腳標, WinHelp 使用這些腳標辨識主題並提供一些導向控制 (Novigation Control),四種典型腳標如表11.1所示。
表11.1 腳標以及用途
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━符號 適用於 用 途
──────────────────────────────────# 內容字符串 唯一辨識主題
$ 標題 在搜詢對話框和搜詢歷史列表框中顯示主題K 關鍵字(段) 出在搜詢對話框中
+ 浏覽順序 用戶使用時的浏覽順序
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━以下分別介紹四種腳標的插入方法:
1. 插入#腳標。把光標移至主題的最前端插入#腳標。這時主題文本下端也會出現#,在此後鍵入內容字符串。WinHelp使用內容字符串作為唯一的辨識主題。用戶永遠也看不見這些字符串,但設計人員用它們定義跳轉主題。2. 插入$腳標,把光標移至#腳標後,插入$腳標。在文本下端的$腳標處,輸入主題的標題,該標題與第一行出現的標題一致,標題將會出現在搜詢對話框和搜詢歷史對話框中
3. 插入K腳標。在主題第一行的腳標之後插入K腳標,在主題文本中的K 腳標後鍵入字段,這些字段將出現在搜詢列表框中,見11.3圖。 4.插入+腳標。在主題第一行的K腳標之後插入+腳標。在主題文本以下的+ 腳標處鍵入浏覽順序標識符。標識符可以是一個數(如005),或一組名字加上冒號和數(如 CAL C:005)一個主題只能有一個浏覽順序。熱點是用戶可以激發某種動作的文本或圖像。一個熱點可跳轉至另一個主題。在其它窗口中顯示主題或執行宏。多數情況下,重要字段被設計成熱點以實現主題跳轉。
以下是實現主題跳轉的步驟:
1. 輸入要跳轉的字段或插入圖像;2. 高亮度選擇字段,用雙下劃線格式化。在MicroSoft Word中,按ALT +T 鍵彈出字符格式對話框,在列表中選擇雙下劃線;
3. 在緊挨在這些字段或圖像之後,鍵入指定主題的字符串。 並對內容字符串進行隱藏格式化。這個內容字符串是跳轉主題的內容字符串;根據以上步驟能實現主題之間的跳轉。
最後要把編輯的文件以RTF格式保存下來,WinHelp只能編譯RTF文件。以下是典型的RTF文件:
#$+ Help Example Indexindex_info 1 of 2index_2
Commands
Edit Menumenu_editFile Menumenu_file GlossaryDefined Termsglossary Procedures
Copying Textproc_copying_text
Deleting Textproc_deleting_textExitingproc_exiting Available From Your ApplicationContext Sensitive Topics cs_topics
# main_index
$ Help Index
+ index:0005
內容主題列出了幫助系統的主要部分。用圖標啟動幫助系統或按Content按鈕均出現內容主題。內容主題的每個項目都可跳轉。
建立內容主題與建立一般主題類似,WinHelp默認第一個主題為內容主題。其建立步驟如下:1. 移至第一個源文件的開始處;
2. 鍵入希望出現的主題標題,這些標題處於不同的行;3. 將每個主題設置成熱點。
11.1.2.3 建立幫助工程文件幫助工程文件是一個文本文件。包含了有關幫助文件的許多信息。 編譯器對工程文件進行編譯。工程文件的擴展名必須是HPJ,編譯後的擴展名是HLP:
下面是一個簡單的幫助工程文件:
[OPTIONS]
CONTENTS=context_string
TITLE=title
COMPRESS=compress_level
ERRORLOG=log_filename
[CONFIG]
BrowseButtons()
[FILES]
RTF_filename_1
RTF_filename_2
RTF_filename_3
[OPTIONS]
Context_String是內容主題的內容字符串。這一行並不是必須有的。 如果沒有第一行,WinHelp把第一個幫助文件的第一個主題作為內容主題。TITLE = title
title是幫助窗口的標題。不要將標題用引號括住。這一行也不是必需要有的。如果沒有,缺省的標題是Windows Help.
CoMPRESS = Compress level
Compress_level決定工程文件在編譯時是否被壓縮, 壓縮後的文件編譯時要花較長的時間。表11.2 為Compress_level的取值:
表11.2 Compress_leve的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━取值 編譯時間 文件大小
─────────────────────────────
FALSE 快 大(無壓縮)
MEDIUM 中等 中等(高度壓縮)
HIGH 慢 小(無壓縮)
0 快 大(無壓縮)
1 慢 小(高度壓縮)
No 快 大(無壓縮)
TRUE 慢 小(高度壓縮)
YES 慢 小(高度壓縮)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ERROR(LOG = log_filename)
log_filename是WinHelp運行時的錯誤輸出文件。如果編譯時工程文件出錯,需要一個記錄錯誤的文件。如果工程文件有這一行,WinHelp在運行時自動創建的文件,如果沒有,錯誤將顯示在屏幕上,但不存入任何文件中。BrowseButton()
如果有這一行,幫助按鈕條中將出現>>和<<鍵,要實現順序浏覽, 還需在幫助文件中定義。詳見11.1.2.1節中的插入+腳標。[FILEs]
不同的行。
以下是工程文件的實例
; This help project requires hc 3.1
[OPTIONS]
errorlog = iconwrks.err
title = IconWorks Help
contents = CONTENTS
compress = false
oldkeyphrase = false
warning = 3
[FILES]
iconwrks.rtf
[MAP]
CONTENTS 1
EDITOR_KEYBOARD 2
EDITOR_COMMANDS 3
VIEWER_KEYBOARD 5
VIEWER_COMMANDS 6
DEFINING_COLORS 1000
EDITOR_FILE_MENU 1100
EDITOR_FILE_MENU 1101
EDITOR_FILE_MENU 1102
EDITOR_FILE_MENU 1103
EDITOR_FILE_MENU 1104
EDITOR_FILE_MENU 1105
EDITOR_EDIT_MENU 1200
EDITOR_EDIT_MENU 1201
EDITOR_EDIT_MENU 1202
EDITOR_EDIT_MENU 1203
EDITOR_EDIT_MENU 1210
EDITOR_EDIT_MENU 1211
EDITOR_EDIT_MENU 1212
EDITOR_VIEW_MENU 1108
EDITOR_VIEW_MENU 1109
EDITOR_VIEW_MENU 1110
EDITOR_VIEW_MENU 1111
EDITOR_VIEW_MENU 1112
EDITOR_VIEW_MENU 1111
EDITOR_TOOLS_MENU 1400
SELECT_TOOL 1401
PAINT_TOOL 1402
FILL_TOOL 1403
LINE_TOOL 1404
[Windows]
main = "IconWorks Help", (0,0,1023,1023 ),,, (192,192,192 )
glossary = "IconWorks Help", (222,206,725,486 ),,, (192,192,192 ), 1
[CONFIG]
CB("glossary", "&Glossary", "JI(`iconwrks.hlp>glossary', `GLOSSARY')")
BrowseButtons()
編譯前要注意兩個問題:
1. 所有源文件必須以RTF格式保存;
2. 下面的文件必須在同一個目錄下● 所有的.RTF文件
● 幫助編譯器(HCP.EXE,HC31.EXE)
● 編譯器錯誤信息源文件(HCD.ERR,HC1.ERR)● 幫助工程文件(.HPF)
● 任何引用位圖或SHED的文件(.BMP.SHG)
如果以上文件不在同一目錄中,必須在工程文件中定義相應的路徑。
編譯要在DOS環境中進行,命令格式:Help_Compiler_rootname project_File_rootname
Help_Compiler_rootname是不帶擴展名的編譯器名字。project_file_rootname是不帶擴展名的幫助工程文件名,如:
HCP MYHELP
11.2 Delphi應用程序的Help編程Delphi應用程序能夠方便地應用幫助系統。程序可以動態地運行幫助系統。 對話框可以與幫助系統相聯。
11.2.1 定義應用程序的幫助文件要在應用程序中使用幫助系統,必須有相應的幫助文件。程序可以編寫自己的幫助文件, 也可以使用已有的幫助文件。 另外,要為應用程序定義幫助文件以便在用戶需要幫助時應用程序能打開相應的幫助文件。
在 Delphi 集成開發環境中選擇“Options | Project” 菜單項, 系統彈出工程選擇對話框, 再選擇Application Options頁面,在輔助文件中輸入幫助文件名。
所有的應用程序都是TApplication的派生類。TApplication有三種方法調用在線幫助系統。 HelpContext方法可調用WinHelp(關於Winhelp的內容見上節)。它把HelpFile 中的文件名和一個文本代碼傳遞給WinHelp。HelpFile是TApplication的字符串類型的屬性,專門用來存放Help文件的。如果HelpFile屬性是空字符,HelpContext返回假值,其它情況均返回真值。下面的例子使用窗體上的一個按鈕,當用戶單擊按鈕,屏幕出現DATA.HLP文件中714號主題內容。
procedure TForm2.Bin1Click(Snder : TObject)
begin
Application.HelpFile := DATAHLP;Application.HelpContext(714); end;
下面的例子使用了窗體上的一個按鈕。當用戶單擊按鈕, 幫助系統調出了 DELPH2.HLP文件中的Default屬性。因為Default屬性的內容字符串是VclDefaultProperty。
procedure TForm1.Tbn|Click(Sender : TObject)
begin
Application.HelpFile := 'Delphi.HLP';
Application.HelpJump ('VclDefaultProperty');
end
BOOL WinHelp(hwd,LpszHelpFile,fuCommand,dwData)
表11.2 WinHelp的參數及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━參數 類型 描 述
───────────────────────────────hwnd HWND 請求幫助的窗口
LpszHelpFile LPSTK 待顯示的幫助文件的文件名fuCommand UNIT 請求的幫助類型
dwData DWord 幫助所需的描述表或關鍵字
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━HelpCOmmand向WinHelp傳遞fuCommand和dwData,fuCommand 是幫助類型可為表11.3中的列值之一。
表11.3 fuCommand的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
值 含 義
───────────────────────────────HELP_LONTEXT 顯示dwData指定描述長的幫助信息
HELP_CONTENTS 顯示幫助的內容主題HELP_SET_LONTENTS 如果dwData是Orol04則在一個彈出
式窗口中顯示Help主題HELP_HELP PONHELP 顯示Help應用程序的自身幫助,函
數忽略lpszHelpFile和dwData參數HELP_INDEX 顯示幫助文件的索引
HELP_KEY 顯示dwData指定的關鍵字的幫助HELP_MULTIKEY 顯示一個關鍵字的幫助,該關鍵字
在一個可變關鍵字表中HELP_QUIT 向Help應用程序報告文件不再使用
HELP_SETNDEX 把dwData指定的描述符作為幫助文件的當前索引
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ dwData參數的含義依賴於fuCommand的設置,如果fuCommand為HELP_CONTEXT,dwData為一個32 位的無符號整數,它包含一個描述表標識號:如果 fuCommand 為 HELP_KEY,dwData 則為一個指定長指針,所指的字符串是幫助的關鍵字。 如果 fuCommand 為HELPMULLTIKEY,dwData則指向一個MULTIKEYHELP數據結構的長指針。下面的例子使用了窗體中的按鈕。當用戶單擊按鈕幫助系統將顯示指定文件的幫助內容主題。
procedure TForm1.Bin1Click(Sender : TObject)
begin
Application.HelpFile := 'MyHlep.HLP'
Application.HelpCommand(HELP_CONTENTS,0);
end;
時,發生OnHelp事件。使用OnHelp事件可以在需要幫助時定義一些特殊過程。 以下的例子改變了應用程序的幫助文件,AppHelp函數用來處理OnCreate事件。
function TForm1.AppHelp(Command.Word;Data : lontint) : Boolean
begin
if OpenDialog1.Exeeute then
Application HelpFile := OpenDialog1.FileName;
end;
在通用對話框中使用幫助系統,要做到以下三點:
1. 把對話框的Option|SHOWHelp屬性設置成true,這樣在程序運行時將出現幫助按鈕。 ShowHelp 屬性與其部件的名字相關, 例如字體對話框的 ShowHelp 屬性稱為fdShowHelp。
2. 為對話框部件定義幫助文件。
3. 定義應用程序的文件名。
11.3 Delphi幫助提示(Hint)的應用使用Delphi集成開發環境時,用戶常把鼠標置於程序部件上,如加速按鈕,對齊按鈕等。鼠標在部件上停留超過一定時間後,Delphi將會顯示一個彈出窗口, 裡面有部件名稱和概述。
這就是Delphi的幫助提示。Delphi的應用程序可通過定義ShowHint 屬性實現幫助提示。
11.3.1 幫助提示的顯示ShowHint屬性可應用於所有的控件和應用程序部件,控件的ShowHint 屬性含義與程序的稍有不同。控件的ShowHint屬性決定某一控件是否顯示幫助提示,如果ShowHint 是真值,當用戶把鼠標置於控件之上超過一定時間後,控件將出現幫助提示。如果是假值,則不出現提示。控件是否顯示還決定於控件的ParentShowHind屬性。如果 ParentShowHint是真值,控件的父類的ShowHint屬性將決定控件是否顯示幫助提示。 假如有一個分組框和一個檢查框,分組框是檢查框的父件。表11.3說明了子件與父件的 ShowHint,ParentShowHint屬性設置對子件幫助提示的影響。
表11.3 Hint屬性設置對幫助提示的影響
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━分組框ShowHint 檢查框ParentShowHint 檢查框ShowHint 幫助提示
─────────────────────────────────────T或F F T 顯示
T T F 顯示
F T T 不顯示T或F F F 不顯示
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━T表示真值,F表示假值 把控件的
ShowHint屬性設置成真值,系統自動將ParentShowHint設置成假值。應用程序部件的ShowHint屬性可以決定整個程序的幫助提示是否有效。如果應用程序的ShowHint 屬性為真,程序中各部件的幫助提示才有效, 但是否顯示還要取決於部件的SHowHint, ParentShowHint及其父件的ShowHint屬性,如果應用程序的ShowHint屬性為假值,無論程序部件的屬性如何設置,程序中所有幫助提示都無效。Hint屬性是顯示在幫助提示框中的文本字符。Hint屬性應用於所有控件,包括應用程序部件菜單部件。因為應用程序部件不是可視部件,因此不能在Object Inspector 窗口中定義Hint屬性。但可以在定義部件的Hint屬性時同時定義應用程序部件的Hint 屬性,定義時只需用“|"字符會分開,例如:
Edit.Hint := 'Name |Enter Name in the edit box'
等價於
Edit.Hint := Name;
Application.Hint := Enter Name in the edit box
應用程序的Hint屬性可用在OnHint事件。如果只定義了一個值,Delphi把這個值同時賦給部件和應用程序部件的Hint屬性。 如果應用程序的ShowHint屬性為假值,所有的幫助提示將不顯示, 但可以利用程序部件的Hint屬性顯示其它提示,如狀態條等。
當某一部件的SHowHint屬性為真, 但又沒有定義Hint 屬性, 如果此時文件定義了Hint屬性,則此部件將使用文件的Hint值。
11.3.2 OnHint事件當用戶把鼠標放在某一部件,而該部件的Hint 值不為空值,此時發生OnHint事件。利用OnHint事件可以執行一些特殊的操作。 最常用是利用
OnHint事件顯示狀態條的標題,狀態條是用面板來實現的。下面舉例說明。這個例子使用了面板部件,菜單,一個編輯框。菜單可隨意設計, 但需記住每個菜單項的Hint 值。 另外, 定義編輯框的Hint 值, 把面板置於窗體底部( 將Align 屬性置於dBotton)把面板標題置於左端(將Alignment屬性置於taleftJustify)。
OnHint 事件是應用程序部件的事件,而應用程序部件是非可視部件,不能使用Object Inspector窗體定義事件,必須編寫自己的OnHint事件。首先,在TForm1對象中宣稱DisplayHint方法,並在單元的implementation部分編寫實現代碼。在DisplayHint方法中,把應用程序的Hint屬性賦給面板的標題。另一個重要問題是必須把DisplayHint方法作為處理OnHint事件的方法。窗體的OnCreate事件的代碼解決了這個問題。
下面列出了程序的完整代碼。當用戶運行程序, 把鼠標置於菜單或部件之上,在窗體的狀態條中將出現定義的提示。
TypeTForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure DisplayHint(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.FRM}
procedure TForm1.DisplayHint(Sender: TObject);
begin
Panel1.Caption := Application.Hint;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnHint := DisplayHint;
end;
11.4 自定義部件的幫助安裝
Delphi有一個功能強大的幫助搜詢引擎,叫做多層幫助,能為自定義的部件提供“上下文敏感”幫助。多層幫助允許把自定義部件的多個幫助文件安裝成Delphi 的幫助序列,以提供給用戶一種內層訪問幫助文件的方式,用戶有三種方法訪問幫助文件:
1. 設計狀態選中部件,然後按F1;2. 在自定義部件的Object Inspector窗口中按F1;
3. 在Delphi幫助系統選擇搜詢主題。 Delphi 在提供這種幫助機制時, 不需要編寫額外的代碼。 有些文件是自定義部件幫助系統所必須的, 以下介紹安裝的具體步驟。安裝所需的文件
STEREO.PAS 自定義部件的源代碼
STEREO.RES 自定義部件的資源文件
STEREO.DCR 工具調色板圖標0
STEREO.HRJ 幫助工程文件
STEREO.RTF 幫助源文件
STEREO.HLP 自定義部件的幫助文件
STEREO.KUF 關鍵字文件安裝步驟
11.4.1 安裝關鍵字文件
1. 退出Delphi集成開發環境
2. 備份\delphi\bin\Delphi.hdx
3. 運行HelpInst應用程序
4. 打開\delphi\bin\Delphi.hdx
5. 選擇keyWords |Add菜單項並選擇Sberee.buf
6. 選擇File|Source菜單項
7. 退出HelpInst
8. 因為WinHelp需要知道STEREO.HLP的位置所以要做以下其中之一:a. 把STEREO.Hlp復制到\Delphi:\bin\目錄下;
b. 在WinHELP.INI文件中加上stereo.hlp=\usehelp;
11.4.2 安裝自定義部件1. 進入Delphi集成開發環境
2. 選擇Option|Install Components菜單項
3. 選擇Add
4. 選擇Browse
5. 輸入\stereo
6. 選擇OK
11.4.3 激活自定義部件幫助系統
1. TstereoButton和TStereeSpeaker部件從部件調色板上的Sample頁拖至窗口;
2. 選擇TStereoButton部件並按F1,屏幕上出現關於TStereoButton的幫助信息;
3. 在Object Inspector窗體口選擇IsOn屬性並按F1,屏幕顯示IsOn屬性;
4. 在主菜單中選擇Help|Topic菜單項,並搜詢Stereo 主題, 屏幕將出現STEREO
.HLP的幫助內容。