Прикручиваем HELP

Для чего в программе существует система помощи, знают, наверное, все. Ну а если не знают, то догадываются :). Система помощи (справка, Help) должна предоставить пользователю информацию о том, как поступить в затруднительных ситуациях при использовании программы, сообщить координаты службы технической поддержки, дать общее представление о том, для чего предназначена программа (это особенно актуально при первом знакомстве с ней), сообщить, что нового в данной версии, где и как (и почем) купить программу (если она не бесплатна).

Вообще говоря, всякая программа, которая претендует на звание программного продукта, должна иметь документацию, а одной из форм документации является справочная система. При этом справка часто может как начинать, так и заканчивать список документации программы, особенно если это программа небольшая или бесплатная (хотя, как говорится, it depends). В любом случае справка желательна, поскольку у конечных пользователей все равно возникнут вопросы, даже если разработчику пользование программой кажется совершенно ясным. Ну а тот факт, что некоторые софтовые архивы не принимают программы без справочной системы, только подтверждает желательность справки.

Что еще, помимо информационного наполнения, требуется от справки? Она должна предоставляться, по возможности, в привычной для пользователя форме. При этом способ вызова справочной системы также должен быть общеизвестен.

Итак, можно выделить три момента: первый - информационное наполнение справки, второй - механизм вызова справки из программы, третий - формат справки. С точки зрения разработчика, который реализует систему справки, эти пункты нужно было бы нумеровать в обратном порядке.

Посему оставим информационное наполнение на усмотрение каждого разработчика (хотя перечень желательной информации в общих чертах приведен выше), о механизме вызова поговорим позже, поскольку он зависит от выбранного формата справки, а подробнее остановимся на формате.

 

В настоящее время наиболее известными и широко распространенными форматами справки в среде Windows являются WinHelp и HTMLHelp. Они позволяют сохранять форматированный текст, графику, анимацию, видео, звук. Оба этих формата обеспечивают удобное перемещение и поиск по справочной системе с использованием индексирования. С помощью функций API Windows можно вызывать отдельные разделы справочной системы.

Формат WinHelp - достаточно старый формат. В обновленном виде он мигрировал с 16-разрядной системы Windows. Многие программы, также имеющие давнюю историю, применяют этот формат (в том числе и Borland Delphi, и C++ Builder). Опыт работы с WinHelp имеют многие пользователи. Исходным материалом для справки в этом формате являются специальным образом подготовленные файлы в формате RTF.

Формат HTMLHelp гораздо моложе. Впервые Microsoft его использовала в операционной системе Windows 98. Его появление ознаменовало новый подход Microsoft по интеграции приложений и Web. Ну и, конечно же, кому, как не Microsoft было первой применить новый формат на практике - не только в операционке, но и в приложениях. Как можно догадаться по наименованию формата, справка строится на основе HTML-файлов.

У каждого из форматов есть свои достоинства и недостатки. Например, с точки зрения хранения справки на диске WinHelp требует до пяти файлов, а HTMLHelp - только один. Справку последнего можно распечатать целиком, а WinHelp этого не позволяет. В справке формата WinHelp "просмотровую машину" реализует модуль winhelp.exe. В справке формата HTMLHelp используются просмотровые возможности браузера Internet Explorer. Последнее означает, что версия браузера и персональные настройки пользователя влияют на то, как будут отображаться документы-страницы справки, тогда как для WinHelp такой проблемы не существует. К тому же WinHelp допускает форматирование текста в pop-up context help (жирный, курсив и т.д.), а вот HTMLHelp - нет (pop-up context help - это окошки с краткой справкой, которые появляются, если сначала нажать на кнопку со знаком вопроса, расположенную обычно в заголовке окна, а затем щелкнуть по элементу, справку о котором нужно получить).

Но при всем при том новый формат справки обеспечивает, в целом, большую функциональность, опирающуюся на возможности HTML и все, что с ним связано (а иначе зачем было огород городить!:). Кроме этого, поскольку для построения файла справки в формате HTMLHelp используются, скажем так, web-ориентированные файлы, их можно использовать и для размещения справки на сайте программы. Поэтому и рассмотрим, как создать и подключить к программе справку в формате HTMLHelp. Не будем углубляться в подробности, а рассмотрим только самые основные моменты.

С точки зрения вызова справки пользователем, нужно обеспечить следующее. Первое - когда справка явно вызывается пользователем (например, с помощью меню Справка/Содержание). Это, так сказать, вызов справки "вообще", предполагающий поиск нужной информации пользователем с помощью справочной системы. Второе - когда справка вызывается пользователем в контексте - например, по нажатию клавиши F1. В этом случае пользователь должен автоматически попасть именно в то место справки, которое позволяет найти информацию, соответствующую конкретной ситуации. В свете этого и построим дальнейшую работу.

Для начала озаботимся самой справкой, а иначе что подключать? Чтобы собрать файл справки, необходимо, во-первых, подготовить страницы-документы (HTML-файлы), а также все то, что ими используется (а это могут быть изображения, файлы java-скриптов и т.п.), и, во-вторых, скомпилировать полученные файлы в единый файл.

Тема инструментария для изготовления HTML-страниц достаточно обширна, и мы не будем здесь ее обсуждать. Будем считать, что нам достаточно обычного Notepad ("Блокнот"), входящего в комплект поставки Windows.

Для того, чтобы отладить общий и контекстный вызовы справки, понадобится несколько страниц (по меньшей мере, две). Создадим три страницы: "О программе" (About), "Использование программы" (Using), "Обратная связь" (Feedback). Вызов справки из меню (Help/Contents) должен привести к показу страницы по умолчанию (это будет страница "О программе"), контекстный вызов должен привести к показу второй или третьей страницы (в зависимости от контекста).

Когда страницы справки созданы и сверстаны, их нужно скомпилировать в единый файл справки (с расширением *.CHM). Для этого следует воспользоваться бесплатным инструментарием от Microsoft, именуемым HTML Help Workshop, который можно найти, в первую очередь, на сайте производителя или на каком-нибудь софтовом архиве (ссылок не привожу по причине громоздкости, www.google.com вам поможет:). При создании файла справки будем пользоваться минимально необходимым набором средств.

Для удобства следует сложить полученные HTML-файлы в одну папку, там же будет находиться и файл проекта справки. Запустив HTML Help Workshop (hhw.exe) и выбрав в меню "File/New", с помощью появившегося мастера (wizard) создадим проект справки, при прохождении по страницам которого как раз удобно воспользоваться подключением HTML-файлов в проект.

Помимо меню и панели инструментов, главное окно HTML Help Workshop имеет панель управления проектом, расположенную слева. В панели расположен блокнот с тремя вкладками - "Project", "Contents", "Index". На каждой из вкладок слева расположена вертикальная панель с кнопками управления. Воспользуемся верхней кнопкой на вкладке "Project" ("Change project options") и в появившемся диалоговом окне "Options" на вкладке "General" установим файл по умолчанию "Default file". Это файл, который будет показан в качестве топика при старте справки без указания конкретного индекса топика. Для нашего случая это будет файл About.html. Больше в этом окне ничего устанавливать не будем, нажимаем кнопку "OK".

Теперь в главном окне переходим к вкладке "Contents". Если файла содержания еще нет, подтверждаем запрос на его создание. Содержание можно сформировать в древовидной форме, с использованием разделов, но, поскольку справочных топиков у нас крайне мало, сформируем просто список. Воспользуемся кнопкой "Insert a page" и добавим в содержание наши три страницы - About, Using, Feedback. После этого можно скомпилировать и оценить полученный файл справки (File/Compile..., View/Compiled File... или соответствующие кнопки на панели инструментов).

Теперь необходимо обеспечить возможность вызова отдельных топиков справки. Для этого нужно задать соответствие страницам справки числовых идентификаторов (help context index). Создадим файл map.h со следующим содержимым:

#define IDH_About 0
#define IDH_Using 1
#define IDH_Feedback 2

и файл alias.h со следующим содержимым:

IDH_About=about.html
IDH_Using=using.html
IDH_Feedback=feedback.html

В соответствии с этими определениями будем вызывать нужные страницы справки из программы.

Подключим эти файлы с помощью диалога "HTMLHelp API Information", вызываемого с помощью одноименной кнопки на вкладке "Project" (соответственно, вкладки "Map" и "Alias"). Снова компилируем проект справки и получаем финальный файл в формате CHM.

Теперь нужно подключить полученную справку к программе. Предполагаем, что последняя будет создана с помощью Borland Delphi. Механизм работы со справкой встроен в библиотеку VCL, начиная с первой версии. Однако первоначально он был ориентирован на работу только с файлами формата WinHelp. Начиная с 6-й версии Delphi, механизм существенно изменился. Теперь за вызов справки отвечает класс THelpViewer, который реализует ряд COM-интерфейсов, обеспечивающих работу со справочной системой. Для того, чтобы работать со справкой в формате HTMLHelp, нужно написать соответствующий HelpViewer-класс и зарегистрировать его с помощью функции RegisterViewer, содержащейся в модуле HelpIntfs (существенный момент!). В принципе, разобравшись что к чему, написать вьюер несложно. Однако, чтобы не изобретать велосипед, я решил покопаться на www.torry.net в поисках возможного готового решения. Как и следовало ожидать, были найдены два решения в исходных текстах, имевшие бесплатную лицензию. Посмотрев на внутреннее устройство каждого из них, решил выбрать то, что свежее и богаче по возможностям - SPHtmlHelp Сергея Мальцева. Реализация основана на явном использовании ActiveX-компонента HHCTRL.OCX.

Использование крайне простое - нужно просто включить в проект модули SPHTMLHelp, HtmlHelpAPI, указать в свойствах проекта требуемый файл справки (в нашем случае - test.chm), а также обеспечить вызов справки, в целом, и настроить контекстный вызов из соответствующих частей приложения. Вот и поговорим о непосредственном вызове справки.

Контекстный вызов справки, вообще говоря, реализуется двумя способами: путем указания числового идентификатора нужного топика или путем указания ключевого слова топика. Воспользуемся в нашем случае традиционным способом - путем задания свойству HelpContext значения, равного идентификатору конкретного топика справки. Например, для вызова контекстной справки для пункта меню нужно использовать свойство самого объекта TMenuItem, если используется привязка пунктов меню к объектам TAction, то значение свойства HelpContext задается у последнего. Аналогичным образом задается свойство HelpContext и у элементов управления (кнопки, строки ввода и т.д.). По умолчанию компоненты имеют значение HelpContext = 0, при этом вызов справки не выполняется. Поэтому мы задали топику по умолчанию индекс, равный 0.

Итак, приступим к подключению. Создадим новый проект, в который подключим указанные выше модули. В диалоге свойств проекта укажем полученный файл справки. В главном окне поместим компонент TmainMenu, создадим пункт "File" и к нему - выпадающее меню с таким содержимым: "Help Contents", "Using...", разделитель, "Exit". Зададим константы, помещенные в файл map.h.

В обработчике OnClick пункта "Help Contents" зададим вызов содержимого справки:

Application.HelpSystem. ShowTableOfContents;

Или можно явно вызвать топик с индексом IDH_About (очевидно, что для вызова топика с иным индексом нужно его и указать в вызове):

Application.HelpSystem.Show ContextHelp(IDH_About, '');

В результате выбора пользователем этого пункта меню будет показан топик справки с индексом, равным 0.

Для пункта меню "Using..." зададим HelpContext=1 (IDH_Using). При нажатии на клавишу "F1", когда этот пункт активен (когда пользователь находится в процессе поиска нужного пункта меню), будет показан топик справки с индексом 1. Аналогично можно поступить и в отношении других пунктов управления. В обработчике сделаем вызов окна сообщения, последним параметром в котором является индекс требуемого топика:

MessageDlg('Click Help',mtWarning,[mbOk,mbHelp],IDH_Feedback);

Видно, что окно будет содержать две кнопки - "OK" и "Help", при нажатии на последнюю должен быть показан топик с индексом 2 (IDH_Feedback).

Ну и в обработчике пункта "Exit" пишем: Close;

Теперь можно скомпилировать проект, запустить программу и проверить, как работает вызов справки.

Вот и все, в основном. В заключение следует добавить, что существует инструментарий, облегчающий построение справочных систем. При этом создание информационных страниц, содержания, компиляция выполняются из одного программного средства. Многие позволяют получить справку как в формате WinHelp, так и в формате HTMLHelp. Как правило, такие программы платные (например, HelpScribble, www.helpscribble.com, Help Development Studio, www.divcomsoft.com/helpstd). Ну а для начала, я надеюсь, можно использовать описанный пример и шаг за шагом наращивать возможности справочной системы вашей программы.

Юрий А. СМАНЦЕР,
georgesman@mail.ru

Версия для печатиВерсия для печати

Номер: 

02 за 2004 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!
 

Комментарии

Аватар пользователя Igor T.
Ещё не дочитал, но уже вижу, что супер!

Уже можно начинать создавать помощь.

Благодарю!!!

Аватар пользователя Антон
Жаль, что нету прикручивания Help'a в формате chm :(
Аватар пользователя Vadik
Как в си билдере прописать вызов справки на нажатие кнопки. Ну просто жму батон и вылазит справка. в делфи это Winhelp(Form1.Handle,"HELP.hlp",HELP_CONTEXT,1);

А в билдере?

Аватар пользователя mike
См. WinHelp в справке по Билдеру.
Аватар пользователя Юрий Сманцер
Господа, приношу свои извинения, что это ярко не прозвучало в статье, но HTMLHelp - это и есть справка в формате CHM. И именно о ее прикручивании речь и идет.