Файл справки (*.chm) не открывается в приложении embarcadero
проблема
Я использую Embarcadero C++ Builder XE. Я пытаюсь вызвать открытие файла справки (*.chm), когда пользователь нажимает кнопку F1 на своей клавиатуре. Я думал, что все сделал правильно, но я не получаю ответ / действие при нажатии F1.
Что я сделал:
Я создал файл справки.chm (с помощью Microsoft HTML Help Workshop). Я скопировал скомпилированный файл.chm в каталог приложения. Я установил:
Application->HelpFile = "My_Help.chm";
В основной форме я установил свойство HelpFile в тот же файл.chm.
В основную форму я включил следующие две строки кода:
#include "HtmlHelpViewer.hpp"
#pragma link "HTMLHelpViewer"
Это сбивает с толку: у меня это работало несколько недель назад, и впоследствии "потерял" код:(
И с тех пор, когда я решил воссоздать решение, у меня не было успеха.
Также
Если я определю кнопку справки, как подробно описано здесь ( embarcadero), все равно ничего не произойдет.
Однако, если я прикреплю следующий код к кнопке, файл справки откроется:
Application->HelpContext(0);
Вопрос
Кто-нибудь знает, почему это работало бы раньше, а теперь нет? Возможно, есть простой шаг, который я сделал в прошлом и забыл, но я искал всю помощь по этому вопросу, которую я могу найти (в том числе здесь по списку подсказок), и рассмотрел все шаги, которые я вижу. Любая помощь приветствуется.
(Я пытался разместить на форумах Embarcadero, но на данный момент это пустая трата времени)
2 ответа
Открытия и обходной путь
Я сделал несколько открытий и пока нашел обходной путь, пока не узнаю больше об этом предмете.
ОТКРЫТИЕ ОДИН
Значение HelpContext работает, если оно ненулевое и допустимое (т. Е. Идентификатор определен в файле CHM).
- Если я введу ненулевое и действительное значение, то файл справки откроется (на правильной странице), когда я нажму F1. Я (почти) уверен, что нулевое значение раньше использовалось - он откроет файл справки на первая страница / страница по умолчанию
ОТКРЫТИЕ ВТОРОЕ
Мое основное приложение (и я должен был подумать об этом и упомянул об этом раньше), состоит из одной формы, которая содержит большое количество кадров. Основная форма содержит меню навигации и пространство для держателя фрейма, а фреймы похожи на "страницы", по которым пользователь может перемещаться.
Итак, как только я попал в Discovery one (ненулевое значение ContextHelp), я заметил, что файл справки открывался на одной и той же странице, независимо от того, какой кадр отображался, даже если я определил разные значения HelpContext для каждого кадра.
Таким образом, значение HelpContext каждого кадра, кажется, не имеет значения. Интересно, связано ли это с тем, что в одной и той же позиции наложено несколько кадров, а пользовательская навигация эффективно включает в себя отображение одного кадра видимым, а предыдущий кадр невидимым. Тем не менее, Discovery Three заставляет меня думать иначе.
ОТКРОЙ ТРИ
На одном из фреймов ("страниц") я определил следующие компоненты: TGroupBox, TPanel, TStaticText, TCheckbox, TMemo и TButton.
- Значения ContextHelp для компонентов TGroupBox, TPanel и TStaticText не влияют.
- Значения ContextHelp для компонентов TCheckbox, TMemo и TButton работают
Таким образом, похоже, что ContextHelp работает только для интерактивных компонентов - компонентов, которые визуально реагируют на щелчок
Вот почему я думаю, что значения ContextHelp никогда не будут работать для компонентов TFrame.
ОТКРЫТЬ ЧЕТЫРЕ
У меня есть несколько всплывающих форм, которые создаются и удаляются на лету во время использования приложения. Значения ContextHelp, определенные для этих форм, работают.
РАБОТА Вокруг
Я определил только ненулевые и действительные значения ContextHelp для каждой формы, включая основную форму
Я определил пункт меню панели инструментов (который я сделал невидимым) и назначил ему ярлык F1. Теперь, когда нажата клавиша F1, сначала запускается событие OnClick этого меню, а затем вызывается обычная обработка OnHelp.
В событии OnClick меню я определяю, какой фрейм в данный момент является "активным" (видимым), и назначаю нужное значение ContextHelp основной форме. Затем вызывается обычная обработка OnHelp, которая использует это недавно назначенное значение ContextHelp, чтобы открыть файл справки на нужной странице.
В КОНЦЕ КОНЦОВ
Я довольно доволен обходным решением, так как он требует, чтобы я перечислил все значения ContextHelp в одной функции - что я собирался сделать для фреймов в любом случае - для ясности и простоты обслуживания.
У меня есть опыт написания справки, но я не программист на C++. Тем не менее, C++ Builder Community Edition установлен на моем ПК с Windows10.
Мой SDIForm имеет следующий фрагмент кода:
#include "Vcl.HTMLHelpViewer.hpp"
#pragma package(smart_init)
#pragma link "Vcl.HTMLHelpViewer"
Я скопировал файл CHM (CHM-example.chm) в каталоги сборки для упрощения (Base, Debug и Release). Это работает для меня.
Получившееся окно просмотра HTMLHelp:
void __fastcall TSDIAppForm::Button1Click(TObject *Sender)
{
Application->HelpContext(10000);
}
//---------------------------------------------------------------------------
void __fastcall TSDIAppForm::FormCreate(TObject *Sender)
{
ShowMessage("The form has been created");
Application->HelpFile = "CHM-example.chm";
}
После удаления файла CHM (CHM-example.chm) в трех каталогах, упомянутых выше, я попытался выполнить следующие шаги из документации - это тоже работает. Но учтите, что мне пришлось удалить следующий код (см. Скриншот):
Application->HelpFile = "CHM-example.chm";
Обычный способ обозначить основной файл справки для приложения - использовать свойство HelpFile глобального объекта Application.
Откройте диалоговое окно "Параметры проекта" ("Проект"> "Параметры") и выберите страницу "Внешний вид" (в разделе "Приложение"). В разделе "Файл справки" укажите файл справки. Нажмите Обзор. По умолчанию в диалоговом окне "Файл справки приложения" отображаются только файлы с расширением.hlp. Чтобы указать другие типы файлов справки, выберите тип "Любой файл (.)" В элементе "Тип файлов". Затем вы сможете выбрать файлы справки таких типов, как.CHM, .HTML и другие.
Эта опция устанавливает свойство Application.HelpFile. Это свойство определяет основной файл справки для приложения. Когда приложение получает какую-либо команду обработки справки, оно по умолчанию использует этот файл справки для выполнения команды справки.
Чтобы указать отдельный файл справки для конкретной формы, вы можете использовать свойство HelpFile этой формы.