Файл справки (*.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 этой формы.

Другие вопросы по тегам