Як працювати з довідковою системою в delphi 7


Як хотілося б зробити у нової програми стандартну довідкову систему, але всі поради, які говорять - зроби так і так і все буде "ОК" - не працюють. Довелося довго "колупатися" в документації і исходниках, щоб все запрацювало і тепер коштує поділиться з усіма. Тут не будуть повторяться пропозиції різних посібників, тому що вони виявилися не працездатні в MDI-додатках. Тут наведено підсумкові результати, які стабільно працюють в MDI-додатках при численних викликах додаткових форм з дочірніх.
Зауваження 1. Скрізь буде описуватися робота в Delphi 7, тільки тому що запропоновані рецепти в ній були перевірені. Цілком можливо ці рецепти будуть працювати і в інших версіях, але це не перевірялося.
Зауваження 2. Для розробки самого Help-файлу використовувалася програма HelpManual 4.0. Це одна з кращих програм, але в ній є "ложка дьогтю" - Plug-in для Delphi, який начебто допомагає розставити номери topic-ів по проекту. Насправді його використання призводить до багатьох проблем. Якщо програма HelpManual тільки встановлюється, то потрібно зазначити в опціях, що цей plug-in ставити не потрібно. В іншому випадку - її потрібно перевстановити. Хоча для самого додатка неважливо в якій програмі зроблений файл довідки.
Тож почнемо:

Робота в одновіконний додатку (SDI Application)

Це найпростіший випадок і в ньому працює варіант, який придумала фірма Borland. А саме:
- У властивості форми HelpFile потрібно прописати шлях до файлу довідкової системи. Якщо буде написано тільки ім'я файлу, то додаток буде шукати довідкову систему там же де лежить додаток. Це властивість можна формувати в обробці події onFormCreate і тоді прописувати повний шлях до файлу довідкової системи.
- У кожного об'єкта у властивості HelpContext вказати номер Topic-а, який відповідає цьому Control-у. Plug-in від HelpManual автоматично створює невидимі Topic-і для КОЖНОГО Control і сам прописує їх номери. Але, по-перше, не кожен об'єкт вимагає свого Topic-а, по-друге - часто кілька Control-ів вимагають одного Topic-а. Виправляти ситуацію часто складніше ніж створювати заново.
І, в принципі цього достатньо, щоб довідкова система працювала. Так задумала фірма Borland. І все б було добре, якби це SDI-додаток не викликає інших форм, наприклад, якусь модальну форму для введення даних. І тут виникають проблеми, які відносяться до багатовіконний додатків.
Однак, прописувати номера не дуже зручно - завжди можна чогось наплутати. Тому є другий варіант. Використовувати не номери, а TopicID - текстовий ідентифікатор.
Але, при цьому потрібно знищити сліди попередньої діяльності. Справа в тому, що якщо в проекті (в будь-який з форм) було заповнене властивість HelpContext, то Delphi буде перехоплювати подія onKeyDown і саме обробляти клавішу F1. Для перевірки можна використовувати наступний код:

Після цього можна починати роботу з клавішею F1.
Перше, що потрібно зробити - це при створенні Довідкової системи значення всіх TopicID, які прив'язані до конкретних об'єктів, зробити рівними іменах об'єктів, для яких вони створюються. Це не є вимогою системи, але значно зменшує кількість помилок.
Друге - при створенні форми визначити шлях до файлу довідкової системи.

Тоді виклик довідки по конкретному об'єкту можна зробити наступним чином:

де параметр у функції HelpJump і є TopicID.

Робота в багатовіконний додатків (MDI Application)

Багатовіконне додаток відрізняється тим, що по-перше - кожній формі може відповідати свій файл довідкової системи, і, по-друге - будь-яка з форм може викликати іншу в модальному або звичайному режимі, а та, в свою чергу, іншу. Попередній приклад з методом HelpJump працює в MDI додатку тільки в тому випадку, коли викликається з дочірньою форми, яка в свою чергу була викликана з головної форми. Як тільки дочірня форма викликає якийсь діалог, то Delphi передає виклик довідкової системи батьківському вікну, а в батьківському вікні HelpContext не визначений, що і призводить до помилки. Прявляется це тим, що перш ніж відкрити WinHelp двічі відкриває файл довідки. Точніше кажучи, кількість відкриттів відповідає рівню виклику форми, тобто якщо дочірня форма викликала іншу, з якої викликається довідка, то кількість відкриттів файлу довідки буде три. При цьому довідка відкривається на темі, яка була першою в файлі .CNT.
Для того щоб зробити працездатну довідкову систему в MDI-додатку потрібно використовувати в кожній формі наступний код:

Константи, що визначають HelpContext Number для кожного TopicID краще записати на початку в одному місці, для того щоб було легше вносити зміни. Для цих же цілей імена констант відповідають іменам об'єктів з додаванням префікса 'hlp_'.
Після чого в подію FormCreate в змінну fmhWND записується ідентифікатор вікна форми.

У події FormClose здійснюється прямий вихід WinHelp для закриття поточної довідкової системи.

І, нарешті, для кожного об'єкта в подію KeyDown записується обробка клавіші F1:

Виклик довідкової системи з меню

Схожі статті