При работе с компонентом TWebBrowser в среде Delphi, разработчики иногда сталкиваются с ошибками, особенно при переходе на более новые версии операционных систем, таких как Windows 7. В данном случае, рассмотрим проблему, связанную с выводом HTML-кода на печать через TWebBrowser, отображаемый в диалоговом окне, не являющемся модальным. Код, который работал на Windows XP, выдавал ошибку "External exception C015D00F" при попытке выполнения той же операции на Windows 7.
Шаг 1: Определение проблемы
Проблема кроется в том, что активационный контекст, который пытается быть деактивирован, не является последним активированным. Это может быть вызвано различными причинами, включая неправильную работу с активационными контекстами в коде, а также изменениями в операционных системах, которые могут повлиять на взаимодействие с OLE-объектами.
Шаг 2: Анализ кода
В предоставленном примере кода используется метод IHTMLWindow3.Print для печати содержимого TWebBrowser. В коде также присутствует использование Web.ControlInterface.ExecWB, что также приводит к ошибке.
procedure THTMLPreview.DoPrint;
var
HTMLDoc: IHTMLDocument2;
HTMLWnd: IHTMLWindow2;
HTMLWindow3: IHTMLWindow3;
begin
if options and 4 = 4 then
begin
HTMLDoc := web.Document as IHTMLDocument2;
if HTMLDoc <> nil then
begin
HTMLWnd := HTMLDoc.ParentWindow;
HTMLWindow3 := HTMLWnd as IHTMLWindow3;
HTMLWindow3.Print;
end;
end;
end;
Шаг 3: Поиск решения
Пользователь в своем сообщении упоминал попытки использовать JavaScript для добавления кнопки печати и события onprint, которые также приводили к ошибке на Windows 7.
Шаг 4: Альтернативный подход
В качестве альтернативного подхода был предложен следующий код для печати содержимого TWebBrowser:
var
r: TRect;
sh, ph: HDC;
begin
OleInitialize(nil);
WebBrowser1.Navigate('file://' + HtmlFilePath);
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
Application.HandleMessage;
// ... остальная часть кода ...
end;
Этот код предполагает использование функций GDI для печати содержимого TWebBrowser, однако пользователь сообщал, что при использовании этого кода происходит сбой системы на Windows 7.
Шаг 5: Устранение проблемы с активационным контекстом
Проблема с активационным контекстом может быть связана с неправильным управлением активацией компонентов ActiveX. Важно убедиться, что все компоненты активированы корректно, и что активационный контекст, используемый в процессе, соответствует последнему активированному.
Шаг 6: Проверка загрузки документа
Также было предложено использовать глобальные переменные и обработчики событий DocumentComplete и NavigateComplete2 для отслеживания загрузки документа:
procedure TForm3.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; const URL: OleVariant);
begin
if (pDisp = CurDispatch) then begin
CurDispatch := nil; {clear the global variable }
DocLoaded := true;
end;
end;
Шаг 7: Обработка возможных проблем с TWebBrowser
Если проблема все еще существует, следует убедиться, что TWebBrowser имеет все необходимые ресурсы, например, вызвав WebBrowser1.HandleNeeded в событии FormShow.
Шаг 8: Проверка кодировки и шрифтов
Пользователь упоминал, что текст в UTF-8 кодировке не печатался, что может указывать на проблему с шрифтами. Важно убедиться, что используемый шрифт содержит все необходимые символы.
Заключение
Проблема печати из TWebBrowser на Windows 7 может быть вызвана различными факторами, включая неправильное управление активационными контекстами, проблемы с загрузкой документа, а также несоответствие шрифтов и кодировок. Для решения проблемы рекомендуется тщательно проверить код, убедиться в корректной активации компонентов, отслеживать загрузку документа и проверить соответствие шрифтов и кодировок требованиям печати.
После пересказа проблемы и предложенных решений, важно отметить, что конкретное решение может потребовать дополнительного анализа и тестирования в соответствии с конкретной ситуацией и окружением разработки.
Пользователь столкнулся с ошибкой при попытке печати содержимого TWebBrowser в приложении на Delphi, работающем на Windows 7, и ищет решение этой проблемы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS