В первой части мы рассмотрели с Вами самый простой случай справки с использованием hhw — создали chm-файл, содержащий всего один топик. Для более-менее серьезной справки этого естественно недостаточно. Хорошая развитая справочная система должна иметь как минимум четкое оглавление, поиск по разделам и контексту, а вызывающая Delphi-программа должна обеспечить для пользователя удобный и быстрый доступ ко всем разделам справки.
Как пользователю дать возможность получать быстрый доступ к интересующей его информации по работе программы или отдельным элементам интерфейса? Здесь вариантов может быть несколько.
Первое что приходит в голову при описании интерфейса программы — это задать каждому элементу интефейса подсказку (Hint), Которая будет отображаться при наведении указателя мыши на элемент (кнопку, label и т.д.). Здесь можно также немного поработать и сделать длинные многострочные хинты (чтоб пользователь глаза сломал, читая их). Но это ведь все не то. Применимо и просто реализуемо, но иногда требуется больше.
К примеру, у нас в приложении есть некая «волшебная» метка (label), нажав на которую пользователю не только откроется новое окно программы, но и проведутся какие-либо другие действия. Засунуть описание такой метки в Hint? Думаю, что выглядеть это будет не совсем удачно. Намного лучше использовать:
1. Показывать пользователю тот раздел справки, в котором описан именно этот жлемент, т.е. использовать контектсную справку.
2. Popup-окно, которое, в отличие от hint может сколь угодно долго быть видимым (у hint тоже можно выставить задержку больше минуты, но, тем неменее это время все равно будет конечно).
Pop-up’ы мы рассмотрим немного позже, а контекстом займемся прямо сейчас.
1. Работа с контекстной справкой. Вариант 1 — использование команды HH_DISPLAY_TOPIC.
Самый простой способ показать пользователю нужный раздел справки. Всё, что от нас по сути требуется — это правильно указать путь к html-файлу с необходимой информацией.
Для демонстрации примера воспользуемся проектом справки, который мы делали в первой части. Добавим в этот проект ещё один html-файл (топик справки) с названием context.htm. Содержимое файла можете сделать по своему усмотрению.
Теперь в тестовый Delphi-проект добавим ещё одну кнопку с названием «Контекстная справка». У меня вид приложения стал таким:
В событии OnClick новой кнопки пишем следующее:
procedure TForm5.Button1Click(Sender: TObject); begin HtmlHelp(Handle,PChar(ExtractFilePath(Application.ExeName)+'help.chm::context.htm'),HH_DISPLAY_TOPIC,0) end;
Здесь мы указали точно расположение файла топика, который необходимо показать пользователю. В данной случае файл context.htm лежал в той же директории, что и файл index.htm, используемый по умолчанию.
Чем хорош представленный способ? Способ достаточно прост — указали команду, указали путь и получили результат. Никаких лишних телодвижений в hhw.
Чем мне этот способ не нравится. Как минимум тем, что приходится использовать много строковых констант при работе со справкой большого объема. На мой взгляд более удобно использовать в качестве констант целые числа — идентификаторы разделов. Поэтому рассмотрим второй способ работы с контекстной справкой.
1. Работа с контекстной справкой. Вариант 2 — использование команды HH_HELP_CONTEXT.
Тех, кто только-только начинает использовать hhw данный вариант работы может вогнать в ступор на некоторое время следующее описание использования команды HH_HELP_CONTEXT в функции HtmlHelp:
pszFile — файл, содержащий информацию по разметке.
dwData — числовое значение идентификатора топика. Вы должны создать символические идентификаторы и числовые идентификаторы в разделе [MAP] проекта (.hhp-файл).
Как создать этот MAP-раздел и что за символичесике и числовые идентификаторы нам надо определить?
Начнем по порядку. Вначале создадим символические идентификаторы в hhp-файле. Для этого откроем hhp-файл в любом текстовом редакторе, например в блокноте и создадим вот такой раздел:
[ALIAS] IDH_HomePage=index.htm IDH_Test1=context.htm IDH_Test2=index.htm
Теперь в этом же файле объявим числовые идентификаторы:
[MAP] #define IDH_HomePage 1000 #define IDH_Test1 1001 #define IDH_Test2 1002
Обратите внимание, что в разделах ALIAS и MAP имена идентификаторов должны полностью совпадать.
Теперь сохраняем файл и открываем его в hhw. Убеждаемся, что разделы MAP и ALIAS успешно добавлены:
Теперь, обратившись, например, к идентификатору IDH_Test1 с помощью команды HH_HELP_CONTEXT мы должны получить в ответ топик context.htm и т.д. Пишем в обработчике кнопки «Контекстная справка» следующий код:
HtmlHelp(Handle,PChar(ExtractFilePath(Application.ExeName)+'help.chm'),HH_HELP_CONTEXT,1001)
Запускаем программу и убеждаемся, что все в порядке — отбражается необходимый нам раздел.
Теперь для хранения идентификаторов разделов справки вы можете использовать либо константы в каком-либо модуле проекта, либо использовать свойство визуальных компонентов HelpContext, которое может содержать целочисленные значения.
В рассмотренных выше примерах мы получали справку в окне по умолчанию. В следующий раз научимся создавать окна, содержащие различные элементы управления и использовать эти окна при вызове справки из Delphi-программ.


