Система для работы с HTML-справкой

Удобно вендрять данную систему в самом начале разработки программы. Но я опишу способ внедрения в целом.

В раздел глобальных переменных добавьте следующие переменные для работы со справкой:

_HHwinHwnd: HWND = 0; HHCtrlHandle: THandle = 0; mHelpFile: String;

Сразу после раздела глобальных переменных и перед implementation вставьте следующие строки кода:

var

HtmlHelpA: function(hwndCaller: HWND; pszFile: PAnsiChar;
uCommand: UInt; dwData: DWORD): HWND; stdcall;

HtmlHelpW: function(hwndCaller: HWND; pszFile: PWideChar;
uCommand: UInt; dwData: DWORD): HWND; stdcall;

HtmlHelp: function(hwndCaller: HWND; pszFile: PChar;
uCommand: UInt; dwData: DWORD): HWND; stdcall;

const

hhctrlLib = ‘hhctrl.ocx’;

const

HH_DISPLAY_TOPIC = $0000;
HH_HELP_CONTEXT = $000F;
HH_CLOSE_ALL = $0012;

Где-нибудь в самом начале раздела implementation вставьте код:

const hhPathRegKey = ‘CLSID\{adb880a6-d8ff-11cf-9377-00aa003b7a11}\InprocServer32′;

function GetPathToHHCtrlOCX: string;
var Reg: TRegistry;
begin
result := ”; //default return
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
if reg.OpenKeyReadOnly(hhPathRegKey) then begin
result := Reg.ReadString(”); Reg.CloseKey;
if (result <> ”) and (not FileExists(result)) then result := ”;
end;
Reg.Free;
end;

procedure LoadHtmlHelp;
var OcxPath: string;
begin
if HHCtrlHandle = 0 then
begin
OcxPath := GetPathToHHCtrlOCX;
if (OcxPath <> ”) and FileExists(OcxPath) then
begin
HHCtrlHandle := LoadLibrary(PChar(OcxPath));
if HHCtrlHandle <> 0 then
begin
@HtmlHelpA := GetProcAddress(HHCtrlHandle, ‘HtmlHelpA’);
@HtmlHelpW := GetProcAddress(HHCtrlHandle, ‘HtmlHelpW’);
@HtmlHelp := GetProcAddress(HHCtrlHandle, ‘HtmlHelpA’);
end;
end;
end;
end;

procedure UnloadHtmlHelp;
begin
if HHCtrlHandle <> 0 then
begin
FreeLibrary(HHCtrlHandle);
HHCtrlHandle := 0;
end;
end;

В OnCreate главной формы приложения добавьте:

mHelpFile := ExtractFilePath(ParamStr(0)) + ‘Help.chm’;
mHelpFile := ExpandFileName(mHelpFile);
LoadHtmlHelp;
if HHCtrlHandle = 0 then
begin
ShowMessage(’HTML-справка не поддерживается системой’);
end;

В обработчике пункта меню для загрузки справки (например, Справка - Содержание) пишем:

if HHCtrlHandle = 0 then showmessage(’Справка не поддерживается’) else
begin
HtmlHelp(Handle,PChar(mHelpFile+’::/Pages/topic1.htm’),HH_DISPLAY_TOPIC,0);
end;

При выходе из программы необходимо закрыть все открытые окна справки, поэтому в OnClose главной формы добавляйте строку:

HtmlHelp(0, nil, HH_CLOSE_ALL, 0);

Часто в программах делают другие пункты меню, соответствующие разделам справки. Вот как их загружать:

HtmlHelp(Handle,PChar(mHelpFile+’::/путь/страница.htm’),HH_DISPLAY_TOPIC,0);

Аналогичным образом можно загружать любой необходимый раздел справки.

Ноябрь 21, 2007 — Рубрика: Delphi
Метки: ,