Help…как же я ненавижу всю работу, связанную с созданием всякого рода хелпов. И ведь никуда от это работы не деться. Без полноценного, качественного help’a, контекстных справок, hint’ов и т.д. любая сколь угодно функциональная программа с «интуитивно понятным» интерфейсом может превратиться в нечто непостижимое для пользователя. Понятно, что редко кто читает Help к медиаплееру или текстовому редактору. Но совсем другое дело, когда пишется какая-то специализированная программа, например, ГИС или, как приходилось писать мне — программы расчёта приземных концентраций загрязняющих веществ — тут хочешь-не хочешь, а на пальцах всё объяснить пользователю за пять минут не получится — большое количество переменных, задаваемых пользователем, работа с БД — все эти моменты приходится прописывать в справку. До сих пор я обходился в работе простыми html-файлами, но рано или поздно надо было переходить на использование возможностей Windows. И видимо сегодня этот день настал :).
Как Вы знаете, для хранения справочной информации Windows активно использует chm-файлы. Достаточно удобный и легкий в плане работы формат. Именно такую справку мы и будем писать сегодня.
Для компиляции и работы с chm-файлами воспользуемся тем, что предлагает нам Microsoft — программой «HTML Help Workshop» скачать которую можно, перейдя по ссылке. Там же скачайте и всю документацию по API работы со справочной системой — она нам пригодиться на будущее.
И первое, что мы сделаем — это установим «HTML Help Workshop» (HHW) и создадим новый проект, содержащий всего один файл.
Жмем в главном меню HHW File—>New и в открывшемся окне выбираем «Project» — запустится мастер создания нового проекта.
Первый шаг можно пропустить т.к. мы ничего не конвертируем. Далее нас попросят задать расположение файла проекта на диске — указываем и остальные шаги пропускаем. В конце жмем «Готово» и hhw сгенерирует нам новый пустой проект справки:
Можете установить новые свойства вашего проекта — для этого надо сделать двойной щелчок по секции «Options» или нажать одноименную кнопку в левой части окна.
Теперь создадим наш первый (и единственный) в проекте файл справки. Для этого жмем в главном меню File—>New—>HTML File. В открывшемся окне пишем название нового раздела справки, например, «Hello World!» и HHW создаст для нас «скелет» нового документа:
Так как никаких визуальных средств для разработки hhw не использует, кроме редактора в стиле «а-ля блокнот», то будем писать весь HTML-код ручками.
Для начала запишем следующее:
Заголовок первого уровня
Заголовок второго уровня
Это наш первый html-файл для супер-спраки для супер-программы Hello World!
Жмем кнопку Save в верхнем тулбаре, задаем имя файла, например, index и сохраняем файл на диск.
Теперь прицепим этот файл к проекту. Для нажимаем кнопку «Add/Remove topic files», затем в открвшемся окне кнопку «Add» и добавляем наш файл index.html к проекту:
Теперь надо наш проект скомпилировать. Для этого в главном меню программы необходимо выбрать File—>Compile и в открывшемся окне указать путь к файлу проекта (по умолчанию поле ввода содержит путь к текущему файлу проекта). В результате компиляции hhw выдаст нам в главном окне лог компиляции и создаст chm-файл справки.
Если Вы делали все как написано в посте, то Вы должны были получить в результате работы три файла: *.chm, *.hhp и *.html. Теперь можете открыть получившийся chm-файл и убедиться, что наш текст из index.htm в нем присутствует:
.
Теперь нам остается научиться вызывать этот файл из своей Delphi-программы.
В Сети вы можете встретить массу статей, касающихся запуска chm-фалов из своих программ. Обчно в этих статьях Вам сначала предлагают импортировать библиотеку, обявить вызов функции HtmlHelp и уж потом работать со справкой. Но дело в том, что модуль Windows.pas в Delphi 2010 уже содержит все необходимые типы данных и функции для работы с chm.
Создайте новый проект Delphi и поместите на главную форму всего одну кнопку. Убедитесь, что в uses подключен модуль windows и в событии onClick кнопки напишите всего одну строку:
HtmlHelp(handle,'Путь_к_файлу/help.chm',HH_DISPLAY_TOPIC,0);
Убедитесь, что файл справки запускается корректно. Теперь разберемся, что мы написали.
handle — первый параметр функции содержит всегда HWND окна вызывающего приложения.
Второй параметр — путь к файлу справки. В этом же параметре можно указать конкретный раздел справки, который необходимо открыть, название окна и т.д.
Третий параметр (HH_DISPLAY_TOPIC) — команда API. В конкретно нашем случае мы попросили открыть топик справки.
И последний параметр — ноль. Этот параметр используется, например, для команды вызова pop-up окна справки (об этом поговорим позже), в остальных случаях четвертый параметр должен быть равен нулю.
В следующий раз поговорим более подробно о структуре справочной системы и попробуем использовать другие возможности для работы со справкой, используя всё туже единственную функцию HtmlHelp.
Уух не знаю Влад. Мне например проще набросать хелп в ворде и потом конвертнуть в chm с помощью html2chm. Скорее всего дело привычки…
Егор, тут дело даже не в подборе инструмента — их валом, другое дело использовать API на максимум возможностей. А HHW — это просто «родной» инструмент M$ поэтому его и взял за основу, а так есть HelpNDoc — хорошая штука с визуальным редактором и дружит с компилятором hhw :)
З.Ы. Жду от вас продолжения статей по защите программ. Первая получилась супер.
> А HHW – это просто “родной” инструмент M$ поэтому его и взял за основу, а так есть HelpNDoc
Мы этой весной искали по работе инструмент для создания хэлпа. Так вот как оказалось, большая часть доступных бесплатных — либо глючат либо работают с ограничениями. В этом плане HHW — получается действительно лучшим. Впрочем, я завтра напишу об этом в блоге.
Рад, что вам понравилось Влад! Вторая часть уже на блоге :)
>> HelpNDoc – хорошая штука с визуальным редактором и дружит с компилятором hhw :)
Вот кстати не знал ( Сыплю пепел на свою голову паралельно качая HelpNDoc…
«Путь_к_файлу/help.chm», лучще сразу на Application.HelpFile менять.
зы: справки к проге делал только один раз в Help And Manual. очень хороший инструмент для разработки. платный правда.
Честно говоря я (и не только я) устал уже от постоянных смен формата хелпов. *.hlp, *.chm и т.д. На этой винде они запускаются, на другой — не запускаются.
Сейчас уже многие просто делают ссылки на страницы в Инете вместо хелпа.
Все-равно те, кто реально покупает софт — имеют доступ к Инету…
Разверстал страницу и вперед.
Александр Божко, не всегда те кто покупает софт имеют доступ в Инет. Редко, но метко встречаются и такие у кого на работе даже локалки нету :)
Vlad спасибо за статью!
Вот тут описано как мы в офисе искали программу для создания справки. (сорри за рекламу, просто думаю, что это действительно будет интересным и твоим читателям)
+1 за Help&Manual. Чудесная вещь.
> +1 за Help&Manual.
Ага. 2 Help&Manual-a по цене равны одной Delphi :D
Хм…лучше уж пока ручками поковырять файлики :)
> 2 Help&Manual-a по цене равны одной Delphi.
Во-первых, 350 + 350 = 700 < 900
Во-вторых, тебе зачем 2 Help&Manual-а?
Три с половиной сотни $ — не так уж много за продукт такого уровня.
P.S. Vlad, в последнее время твой сайт тормозит с прокруткой в Google Chrome.
>> HelpNDoc – хорошая штука с визуальным редактором и дружит с компилятором hhw :)
Чего-то она русские названия топиков кракозябрами после компиляции пишет :(
Есть решение?
Решение одно — отказаться от юникода :) Кракозябры исчезнут сами собой
Позовите Майкла Каплана, он их пристрелит за кривую поддержку юникода :D
Да ладно, пусть живут. Я HHW юзаю в чистом виде :)
Здравствуйте, Влад. У меня благодаря вашей статье получился очень хороший и красивый справочный файл. Но проблема, файл через сеть не открывается. После некоторых настроек в системе, правда, получается. Но это не рационально, не могу я настраивать все ПК клиентов. Посоветуйте, пожалуйста.
хм..так если Вам нужен хелп, который работает через Сеть, то зачем Вам chm? По-моему в этом случае удобнее сделать простую html-справку и разместить её в сети. Так, с одной стороны, доступ к хэлпу будет у всех и, с другой стороны — никаких настроек на машинах клиентов делать не надо. По-крайней мере я бы сделал так :)
Файл по сети и не должен открываться. Ибо это уязвимость.
Файл нужно скопировать локально (и вообще-то, этим должен заниматься установщик программы).
Если же при ручном копировании файл не открывается, то щёлкаем по нему правой и заходим в свойства. На первой вкладке будет кнопка «Разблокировать».
Хотелось бы добавить несколько слов по поводу вызова справки в формате CHM.
В составе Delphi (начиная с какой — не помню, в 2006 точно есть) идет модуль HTMLHelpViewer.
Его надо подключить к проекту и реализовать интерфейс IHtmlHelpTester (например в главном окне приложения). В нем есть всего 7 функций, назначение которых вполне очевидно. После этого все будет работать «автоматом», без явного вызова HtmlHelp. Если кому то интересно, могу привести пример использования.
у меня программно не вызывается справка. в юсес все подключено но ругается якобы
[Error] Unit1.pas(30): Undeclared identifier: ‘HtmlHelp’
[Error] Unit1.pas(30): Undeclared identifier: ‘HH_DISPLAY_TOPIC’
что делать подскажите?
у меня программно не вызывается справка. в юсес все подключено но ругается якобы
[Error] Unit1.pas(30): Undeclared identifier: ‘HtmlHelp’
[Error] Unit1.pas(30): Undeclared identifier: ‘HH_DISPLAY_TOPIC’
как исправить?
тока что проверил на эмбракадэро все работает а на седьмом делфи выдает такие ошибки
Не стоит по нескольку раз повторять вопрос — от этого ответ быстрее не напишется.
[Error] Unit1.pas(30): Undeclared identifier: 'HtmlHelp'
[Error] Unit1.pas(30): Undeclared identifier: ''
Вам же Delphi вполне понятно сообщает, что нету в её версии таких типов как HtmlHelp и HH_DISPLAY_TOPIC. Что исправлять-то? Используйте более свежую версию Delphi и не насилуйте уже эту 7-ку.
да я пробовал эмбракадеро но она создает кучу ненужных модулей и много всего другого. и проекты сделанные на эмбре с трудом запускаются на более старых версиях т.к в старых попросту нет таких модулей и проходится многое исправлять. так что я сошелся на том что 7 более оптимальный выбор для меня. т.к мне часто приходится иметь дело со страрыми версиями делфи. ну придется искать другой способ подключения возможно через shellexecute.все равно спасиб)
действительно окзалось намного проще подключить хэлп с помощью shellexecute)
ну, если приходится часто иметь дело со старыми версиями Delphi, то да — проще ShellExecute
Здравствуйте уважаемые . Просьба к Вам помочь написать мини программу.
Суть программы:
Нужно что бы в окне программы выводилась информация которая находится на листе эксель.
Строк примерно 25 . колонок 3. Лист 1
Примечание.
1.В экселе информация в этик сроках обновляется каждые 5 минут и программа должна также показывать обновленное инфо.
2. Возможно ли наложить пароль для доступа к инфо ограниченный по времени (допустим на сутки или неделю или месяц)
Спс большое за ранее жду ответов. За мной не заржавеет обещаю.
С уважением Skyppy
Если что пишите на мыло: kartvelit@gmail.com
Красавцы помогли сильно