Проблемы отображения HTMLHelp в Delphi XE7 и их решения
Разработчики, работающие с Delphi XE7 и столкнувшиеся с проблемами отображения HTMLHelp, часто сталкиваются с тем, что стандартный HTMLHelpViewer работает в том же процессе, что и приложение. Это может привести к различным проблемам, включая невозможность копирования текста из тем с помощью Ctrl-C и блокировку доступа к HelpViewer, когда активен модальный диалог.
Оригинальный запрос
Разработчик использует Delphi XE7 64-битной версии и ищет стратегию решения проблем с отображением HTMLHelp файлов внутри своих приложений. Основные проблемы заключаются в невозможности копирования текста из тем с помощью комбинации клавиш Ctrl-C и блокировке HelpViewer при активном модальном диалоге. Предполагается, что источник проблемы заключается в том, что HTMLHelpViewer работает в том же процессе, что и приложение. Разработчик интересуется возможностью запуска HelpViewer в отдельном процессе или необходимости запуска HH.EXE с использованием CreateProcess.
Анализ проблемы
При использовании встроенного HTMLHelpViewer в Delphi XE7, разработчики могут столкнуться с ограничениями, связанными с работой в одном процессе с приложением. Это может привести к проблемам с взаимодействием и управлением, особенно когда приложение ожидает взаимодействия с пользователем в модальных диалогах.
Альтернативное решение
Один из участников обсуждения предложил альтернативный подход: использовать прямое обращение к API HTMLHelp для открытия файлов помощи. Это позволяет избежать проблем, связанных с работой в одном процессе, и дает больше контроля над процессом отображения помощи.
Этот код позволяет открыть Help файл и перейти к определенной теме с ID 70.
Подтвержденное решение
Основываясь на комментариях других разработчиков, прямое обращение к API HTMLHelp может быть более надежным и менее подверженным проблемам, связанным с работой в одном процессе. Разработчик может реализовать обработчик события OnHelp, который напрямую вызывает функцию HTMLHelp, что позволяет избежать описанных проблем.
Пример реализации обработчика событий OnHelp
unit Help;
interface
uses
SysUtils, Classes, Windows, Messages, Forms;
procedure ShowHelp(HelpContext: THelpContext);
procedure CloseHelpWindow;
implementation
// ... (остальной код)
type
THelpWindowManager = class
// ... (класс THelpWindowManager)
end;
constructor THelpWindowManager.Create;
begin
inherited;
// ... (инициализация)
Application.OnHelp := ApplicationHelp;
end;
destructor THelpWindowManager.Destroy;
begin
// ... (закрытие)
Application.OnHelp := nil;
// ... (остальной код)
end;
function THelpWindowManager.ApplicationHelp(Command: Word; Data: THelpEventData; var CallHelp: Boolean): Boolean;
begin
// ... (логика обработки команд помощи)
case Command of
HELP_CONTEXT, HELP_CONTEXTPOPUP:
begin
// ... (логика открытия Help файла)
FHelpWindow := HtmlHelp(hWndCaller, HelpFile, HH_HELP_CONTEXT, Data);
// ... (остальной код)
end;
end;
end;
initialization
begin
// ... (инициализация модуля)
HelpWindowManager := THelpWindowManager.Create;
end;
finalization
begin
// ... (завершение работы модуля)
FreeAndNil(HelpWindowManager);
end.
Важные замечания
В коде реализована логика для восстановления и сохранения позиции окна помощи.
Для работы с позицией окна используется класс TFormLayoutPreference, который может быть исключен, если такая функциональность не требуется.
Функции ReportError и ReportErrorFmt используются для отображения диалогов об ошибках. Эти функции можно заменить на стандартные вызовы MessageBox.
Заключение
Разработчикам, столкнувшимся с проблемами отображения HTMLHelp в Delphi XE7, рекомендуется рассмотреть возможность использования прямого обращения к API HTMLHelp для решения описанных проблем. Такой подход позволяет избежать ограничений, связанных с работой в одном процессе с приложением, и предоставляет больше возможностей для контроля и управления процессом отображения помощи.
Проблема заключается в нежелательных последствиях использования стандартного HTMLHelpViewer в Delphi XE7, работающего в том же процессе, что и приложение, что приводит к ограничениям в функциональности, таким как невозможность копирования текста и блокир
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.