Delphi webbrowser ошибка сценария

Поставил компонент TWebBrowser, загружаю страницу, выходит ошибка сценария. Если игнорировать ошибки путем

WB2.Silent := true;

то ошибки нет, но функционал страницы нарушен.

Как устранить данную проблему и сохранить функционал загружаемой страницы?

  • delphi-7
  • delphi
  • javascript
  • webbrowser

Kromster's user avatar

Kromster

13.6k12 золотых знаков43 серебряных знака73 бронзовых знака

задан 11 июн 2014 в 5:45

АлександрЪ's user avatar

АлександрЪАлександрЪ

2371 серебряный знак16 бронзовых знаков

6

  • Есть подозрение, что никак. Скорее всего, что WebBrowser не поддерживает какие-то объекты или методы, которые использует сценарий.

    11 июн 2014 в 6:07

  • @kot-da-vinci а есть какой-нибудь другой компонент, который может с этим справится?

    11 июн 2014 в 6:40

  • Если он и есть, то я о нем не знаю. WebBrowser разрабатывался более 10 лет назад. А стандарты Web меняются со скоростью света.

    11 июн 2014 в 7:00

  • Грусть( Чтож, @kot-da-vinci спасибо, буду гуглить и пытаться найти решение)

    11 июн 2014 в 7:13

  • @kot-da-vinci, Вы случайно не знакомы с jsWebbrowser? Может ли он помочь выйти из данной ситуации?

    13 июн 2014 в 4:21

1 ответ

ответ дан 23 мая 2017 в 7:34

microup's user avatar

microupmicroup

6654 серебряных знака19 бронзовых знаков

6 / 6 / 2

Регистрация: 14.12.2013

Сообщений: 117

1

31.07.2014, 10:32. Показов 14145. Ответов 6


Студворк — интернет-сервис помощи студентам

ВебБраузер делает свою работу. Вот только ошибку показывает. Можно как-то их отключить?



0



Mawrat

13097 / 5878 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

31.07.2014, 10:45

2

Лучший ответ Сообщение было отмечено KaDima281 как решение

Решение

Погасить вывод диалогов с предупреждениями и сведениями об ошибках:

Delphi
1
  WebBrowser1.Silent := True;



1



6 / 6 / 2

Регистрация: 14.12.2013

Сообщений: 117

31.07.2014, 10:57

 [ТС]

3

Спасибо. А есть какие-то аналоги вебБраузера? (Кроме TChromium)



0



13097 / 5878 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

31.07.2014, 11:46

4

Может быть, есть. Надо поискать в сети.



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32625 / 21092 / 8139

Регистрация: 22.10.2011

Сообщений: 36,354

Записей в блоге: 8

31.07.2014, 12:00

5

Mawrat, ничего нет. Mozilla забросила свой плагин, Оперы не было никогда. Только WB да Chromium



2



6 / 6 / 2

Регистрация: 14.12.2013

Сообщений: 117

31.07.2014, 13:51

 [ТС]

6

А то у меня хромиум не запускается. Теперь дельфи заново переустанавливать…



0



Nikita Shibaev

0 / 0 / 0

Регистрация: 28.07.2019

Сообщений: 7

03.06.2021, 14:41

7

У меня тоже была такая проблема с этим компонентом, но я решил это.
Посредством добавления строки

Delphi
1
RegisterAsBrowser:=true;

и совместным использованием этой строки со строкой

Delphi
1
Silent:=true;

у меня решилась эта проблема.



0



  • 0

dmdel

Ответ от

dmdel,

  • Задать вопрос

Вопрос

dmdel

Contributor

    • Поделиться

В приложении для windows  использую webbrowser следующим образом, 

procedure TForm13.FormCreate(Sender: TObject);
var
  WindowHandle: TWinWindowHandle;
begin
  WindowHandle := WindowHandleToPlatform(Handle);
  FWebBrowser := TWebBrowser.Create(Self);
  FWebBrowser.ParentWindow := WindowHandle.Wnd;
  FWebBrowser.Width := Width;
  FWebBrowser.Height := Height;
//  FWebBrowser.Silent:= true;
  FWebBrowser.Navigate('http://er.yamalzdrav.ru/er/categories/uncategorized/mainpage/');
end;

При отображении сайта  появляется сообщение об ошибках сценария. И сайт отображается некорректно. 

Как это поправить? 

Безымянный.png

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

Если через браузер захожу, то таких проблем нет

Ссылка на комментарий

  • 0

Rusland

Mentor

    • Поделиться

Видимо ошибка javascript на самом сайте. Помню в WebBrowser в VCL было свойство silent, c помощью которого можно было отключить отображение ошибок. К сожалению, в FMX не вижу этого свойства. 

Попробуйте веббраузер ChromiumFMX


Изменено пользователем Rusland

Ссылка на комментарий

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

59 минут назад, Rusland сказал:

Видимо ошибка javascript на самом сайте. Помню в WebBrowser в VCL было свойство silent, c помощью которого можно было отключить отображение ошибок. К сожалению, в FMX не вижу этого свойства. 

Попробуйте веббраузер ChromiumFMX

Silent пробовал, ошибка не появляется, но все равно сайт отображается некорректно. Часть функционала просто не показывается. 

Попробую ChromiumFMX

Ссылка на комментарий

  • 0

Rusland

Mentor

    • Поделиться

Так у вас VCL что ли? Тогда смотрите Хромиум для VCL (имейте в виду — их две версии dcef3 и dcef1)


Изменено пользователем Rusland

Ссылка на комментарий

  • 0

dmdel

Contributor

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

Вообщем попробовал  ChromiumFMX .

Скачал отсюда http://www.fmxexpress.com/web-browser-component-for-delphi-xe6-firemonkey-on-windows-and-mac-osx/

Установил компонент, скопировав файлы *.dcu в папку C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win32\debug и C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win32\release

Компонент установился, проект компилируется, но при запуске приложения ошибка. Вместе с установочником есть пример. Там та же ошибка. Может еще где-нибудь что нибудь не прописал или не скопировал?

Безымянный2.png

Ссылка на комментарий

  • 0

MAD_EVAL

Contributor

    • Поделиться

Положите все библиотеки (*.dll) Хромиума в папку с исполняемым файлом. Плюс как минимум 2 папки с локалями и компонентами движка.

Добавил принтскрин всего того что должно лежать в папке вместе с вашим екзешником.

Это всё есть в архиве, из которого Вы устанавливали компонент в папке cef3_ChromiumXE6\bin\Win32 (или Win64)

Безымянный.png


Изменено пользователем MAD_EVAL

Добавил

  • Rusland и
    enatechno


  • Like


    2

Ссылка на комментарий

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

7 часов назад, MAD_EVAL сказал:

Положите все библиотеки (*.dll) Хромиума в папку с исполняемым файлом. Плюс как минимум 2 папки с локалями и компонентами движка.

Спасибо! Заработало!

Ссылка на комментарий

  • 0

MAD_EVAL

Contributor

    • Поделиться

22 часа назад, dmdel сказал:

Спасибо! Заработало!

Не за что. Будут вопросы по хромиуму — пишите в личку

Ссылка на комментарий


Гость

Эта тема закрыта для публикации ответов.

  • Последние посетители

      0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

На чтение 8 мин. Просмотров 48 Опубликовано

Я использую компоненту TWebBrowser. Встала проблема избаиться от окна «Ошибка сценария Internet Explorer». Оно появляется на многих сайтах в которых есть ошибки в JAVA скриптах. Версия IE — 5.0.
Помогите пожалуйста!


Ihor Osov’yak ( 2003-01-18 22:42 ) [1]

Есть ошибка — значит будет сообщение об ошибке :-).

Зы — если кто-то посоветует Silent установить в true — не слушай его. Ибо в первых, Silent не все сообщения перехватывает — о твоем случае не знаю, нужно экспериментировать. Но проблема не в том – если даже это заблокирует сообщение об ошибке – то это будет равнозначно ответу “не выполнять скрипты более”. А как показывает опыт – сейчас очень модно на всякие линки и кнопки скрипты вешать – следовательно, броузер соотв. клики уже не будет обрабатывать. Со всеми вытекающими последствиями.

Юзание IDOCHOSTSHOWUI (пример реализации смотрим в TEmbeddedWB) тоже вряд ли (когда-то делал эксперименты – сообщения об ошибках здесь тоже не ловятся – но могу ошибиться за древностью – проверьте, если есть желанию).

Делаю так – немного в лоб, но работает наверняка (IE от 5, все винды)

— хук на создание окна для своего потока.
— в хуке смотрим класс окна, если это Internet Explorer_Server — вполне может быть, что это окно с сообщением об ошибке. Тогда – PostMessage на взвод таймера примерно на 0.1 сек – єто нужно для того, что в соотв. окне еще ничего нет. По срабатыванию таймера запрашиваем IHtmlDocument2 от соотв. хидера окна – как это сделать, здесь уже говорили, поищи по ключевым словам ObjectFromLresult,IHtmlDocument2

— парсим соотв. IHtmlDocument2, и если там есть бутончик, в html коде которого есть >


crash123 ( 2003-01-19 10:29 ) [2]

Уважаемый Ihor Osov»yak, если Вас не затруднит, напишите исходный код. Заранее спосибо!


Ihor Osov’yak ( 2003-01-19 11:31 ) [3]

Держи фрагменты, выдернуто с реального проекта, убраны некоторые несущественные детали, но может и не все, посему некоторые фрагменты «будут лишними», также не даю кода всякой мелочовки вида WrTm — это у меня отладочный вывод:

function GetWndClassName(aWnd:THandle):string;
var wS:string;
l:integer;
begin
SetLength(ws,160);
l:=GetClassName(aWnd,PChar(ws),length(ws));
if length(ws)>0
then Result := Copy(ws,1,l)
else Result := «»;
SetLength(ws,0);
end;

Собственно процедура хука.
notifHandle — хендл формы, в которой будем организовать клик по кнопочке, у меня это главная форма,WUM_HookIEFired- юзверовский месидж

При юзании только для своего процесса
оформлять в виде длл необязательно:

function Kah_hook(Code:integer; aWParam:WPARAM; aLParam:LParam):longint; stdcall;
var wnd: dword;

wnd :=aWParam;
fl:= 0;
if code

ну и собственно обработчик WUM_HookIEFired:

procedure TFormMain_DreamMates14_2.WUMHookIEFired(var Msg: TMessage);
begin

if Msg.WParam <> 0 then begin
fHWndHookedIEFrame := Msg.WParam;
fHWndHooked := Msg.LParam;

end
else exit;
TimerHook.Enabled := true;

И обработчик таймера(здесь основная работа) — почему через таймер — я уже говорил — нужно дать время на формирование сообщения, оно начинает формироватся даже не при создании окна, а сразу после активации (у меня такое впечатление сложилось, но в прочем на єтом я не настаиваю — в смысле, когда формируется, но что задержка нужна — это обнозначно, я ставлю 0.2 сек)

type
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM:
wParam; out pObject): HRESULT; stdcall;

const MSG: Integer = 0;
hInstLib: HWND =0;
ObjectFromLresult: TObjectFromLresult = nil;

function GetIDocFromHWND(WHandle: HWND; var iDoc: IHtmlDocument2): HRESULT;
var
lRes: Cardinal;
begin
Result := S_FALSE;
if hInstLib = 0 then hInstLib := LoadLibrary(«Oleacc.dll»);
if not assigned(ObjectFromLresult) then @ObjectFromLresult := GetProcAddress(hInstLib, «ObjectFromLresult»);
if @ObjectFromLresult <> nil then begin
try
if MSG=0 then MSG := RegisterWindowMessage(«WM_HTML_GETOBJECT»);
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, iDoc);
finally
//eeLibrary(hInst);
end;
end;
end;

procedure TFormMain_DreamMates14_2.TimerHookTimer(Sender: TObject);
var
WndChild: HWND;
//IE:IWebbrowser2;
iElem:IHtmlElement;
iDoc:IHtmlDocument2;

procedure HtmlCodToLog;
begin
if not assigned(iDoc) then exit;
WrTm(2,»Hooked text:» + GetTxtBoby(iDoc));
WrTm(2,»Hooked html:» + GetHtmlBoby(iDoc));

procedure TryForceCloseHokkedWnd;
var h1,h:thandle;
begin
if fHWndHooked<>0 then begin
PostMessage(fHWndHooked,WM_Close,0,0);
exit;
end;
h1:= fHWndHookedIEFrame;

if ((h=0) or (h=Handle)) then begin
PostMessage(h1,WM_Close,0,0);
exit;
end;
h1 := h;

var s:string;
begin //
try
TimerHook.Enabled := false;

if ((fHWndHookedIEFrame<>0) and (fHWndHooked=0)) then begin

if not assigned(iDoc) then begin

WndChild := FindWindowEX(fHWndHookedIEFrame, 0, «Internet Explorer_Server», nil);
if WndChild=0 then begin
WrTm(2,»TimerHookTimer: cp1″);
WndChild := FindWindowEX(fHWndHooked, 0, «Internet Explorer_Server», nil);
end;
if WndChild=0 then begin
WrTm(2,»TimerHookTimer: cp2″);
Exit;
end;
if GetiDocFromHWND(WndChild,IDoc)<>S_OK then begin
WrTm(2,»TimerHookTimer: cp3″);
exit;
end;
end;
if not assigned(iDoc) then begin
WrTm(2,»TimerHookTimer: cp4″);
exit;
end;

WrTm(0,»** Catch window with a html-warnintg . «);
HtmlCodToLog;

if Pos(«error has occurred in the script on this page»,s)>0 then begin
iElem := GetButtonWithSubstrInOuterHtml2( >if assigned(iElem) then begin
iElem.Click;
WrTm(2,»TimerHookTimer: click on «continue running scripts»»);
exit;
end;
end;


Ihor Osov’yak ( 2003-01-19 11:34 ) [4]

Да, функция постановки хука: 🙂

procedure OnHook(aHNotif:THandle);
begin
if HookHandle<>0 then exit;
notifHandle := aHNotif;
HookHandle:=SetWindowsHookEx(WH_CBT,@Kah_hook,0,GetCurrentThreadId);


int64 ( 2003-01-19 12:57 ) [5]

crash123 (18.01.03 16:48)

Сделай так, и вообще никаких окон не будет. Во всяком случае, посмотри, может получится.

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
private
FOldWindowProc: TWndMethod;
procedure FormWndProc(var AMsg: TMessage);
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
FOldWindowProc:= WindowProc;
WindowProc := FormWndProc;
WebBrowser1.Navigate(«c: emp1.htm»);
end;

procedure TForm1.FormWndProc(var AMsg: TMessage);
var
ChWnd, wnd: Integer;
Msg: TWmActivate;
i: integer;
s: string;
begin
if AMsg.Msg = WM_ACTIVATE then
begin
Msg := TWmActivate(AMsg);
wnd := Msg.ActiveWindow;
//if . then
SendMessage(wnd, WM_CLOSE, 0, 0);
end;
FOldWindowProc(AMsg);
end;

А если хочешь, чтоб какое-то конкретное окно пропадало, то перед SendMessage(wnd, WM_CLOSE, 0, 0) ставь проверку на корректную идентификацию этого окна.

Ihor Osov»yak © (19.01.03 11:34)
Что-то ты много написал. Может ты практически подходил? А я вот теоритически. )


Ihor Osov’yak ( 2003-01-19 13:48 ) [6]

2 int64 © (19.01.03 12:57)

> Что-то ты много написал. Может ты практически подходил? А я вот теоритически. )

Практик я, практик. 🙂
Для теоретиков повторяю: прибитие окна на взлете равнозначно тисканию на кнопочку «не выполнять более скриптов» — или как она там зовется, пишу по-памяти, что в болшинстве практических случаев ведет к нарушению функционирования сайта — сейчас часто на всякие линки и кнопки скрипты разработчики сайтов вешают.
Хотя в конкретном случае вариант от int64 пройдет. Но нужно быть готовым к тому, что через некоторое время софту доделывать придется, так как авторы сайта подпадут под модные течения и . (см. выше)


Ihor Osov’yak ( 2003-01-19 13:50 ) [7]

Зы
> прибитие окна на взлете равнозначно тисканию на кнопочку
> «не выполнять более скриптов»
— сие проверялось практически и не единыжды 🙂


Ihor Osov’yak ( 2003-01-19 13:57 ) [8]

Зы еще — в коде от int64 наверно есть ошибка — FormWndProc делает сабклассинг для делфийской формы и будет соотв. ловить ее активацию, а не активацию окна с сообщением с ошибкой.
Имхо, активацию окна с ошибкой — только через хуки.

Зы — на сей раз это теоритическое размышление, практически проверять влом. Но думаю, что я прав.


sergey2 ( 2003-01-21 15:00 ) [9]

Я лично у себя написал:

try
WebBrowser1.Navigate(URL);
except
end;

и никаких ошибок не вылазит.

9 TipTop [2011-12-19 22:49:00]

У меня возникли проблемы с обработкой ошибок javascript в WebBrowser на Delphi 2010.

Я использую WebBrowser с включенным тихим свойством. Кажется ОК, но есть одна проблема на сайтах с багги-скриптами: она кажется частью script после того, как ошибка не выполняется. Результаты некоторых script немного отличаются от IE.

Вы знаете, как решить эту проблему?

javascript browser delphi

2 ответа

12 Решение TLama [2011-12-20 18:06:00]

В следующем примере я использовал вставленный класс, поэтому, если вы поместите этот код в свое подразделение, только эти веб-браузеры в форме или созданные в этом устройстве динамически получат это поведение.

Поставил компонент TWebBrowser , загружаю страницу, выходит ошибка сценария. Если игнорировать ошибки путем

то ошибки нет, но функционал страницы нарушен.

Как устранить данную проблему и сохранить функционал загружаемой страницы?

На чтение 8 мин. Опубликовано 15.12.2019

Я использую компоненту TWebBrowser. Встала проблема избаиться от окна «Ошибка сценария Internet Explorer». Оно появляется на многих сайтах в которых есть ошибки в JAVA скриптах. Версия IE — 5.0.
Помогите пожалуйста!


Ihor Osov’yak ( 2003-01-18 22:42 ) [1]

Есть ошибка — значит будет сообщение об ошибке :-).

Зы — если кто-то посоветует Silent установить в true — не слушай его. Ибо в первых, Silent не все сообщения перехватывает — о твоем случае не знаю, нужно экспериментировать. Но проблема не в том – если даже это заблокирует сообщение об ошибке – то это будет равнозначно ответу “не выполнять скрипты более”. А как показывает опыт – сейчас очень модно на всякие линки и кнопки скрипты вешать – следовательно, броузер соотв. клики уже не будет обрабатывать. Со всеми вытекающими последствиями.

Юзание IDOCHOSTSHOWUI (пример реализации смотрим в TEmbeddedWB) тоже вряд ли (когда-то делал эксперименты – сообщения об ошибках здесь тоже не ловятся – но могу ошибиться за древностью – проверьте, если есть желанию).

Делаю так – немного в лоб, но работает наверняка (IE от 5, все винды)

— хук на создание окна для своего потока.
— в хуке смотрим класс окна, если это Internet Explorer_Server — вполне может быть, что это окно с сообщением об ошибке. Тогда – PostMessage на взвод таймера примерно на 0.1 сек – єто нужно для того, что в соотв. окне еще ничего нет. По срабатыванию таймера запрашиваем IHtmlDocument2 от соотв. хидера окна – как это сделать, здесь уже говорили, поищи по ключевым словам ObjectFromLresult,IHtmlDocument2

— парсим соотв. IHtmlDocument2, и если там есть бутончик, в html коде которого есть >


crash123 ( 2003-01-19 10:29 ) [2]

Уважаемый Ihor Osov»yak, если Вас не затруднит, напишите исходный код. Заранее спосибо!


Ihor Osov’yak ( 2003-01-19 11:31 ) [3]

Держи фрагменты, выдернуто с реального проекта, убраны некоторые несущественные детали, но может и не все, посему некоторые фрагменты «будут лишними», также не даю кода всякой мелочовки вида WrTm — это у меня отладочный вывод:

function GetWndClassName(aWnd:THandle):string;
var wS:string;
l:integer;
begin
SetLength(ws,160);
l:=GetClassName(aWnd,PChar(ws),length(ws));
if length(ws)>0
then Result := Copy(ws,1,l)
else Result := «»;
SetLength(ws,0);
end;

Собственно процедура хука.
notifHandle — хендл формы, в которой будем организовать клик по кнопочке, у меня это главная форма,WUM_HookIEFired- юзверовский месидж

При юзании только для своего процесса
оформлять в виде длл необязательно:

function Kah_hook(Code:integer; aWParam:WPARAM; aLParam:LParam):longint; stdcall;
var wnd: dword;

wnd :=aWParam;
fl:= 0;
if code

ну и собственно обработчик WUM_HookIEFired:

procedure TFormMain_DreamMates14_2.WUMHookIEFired(var Msg: TMessage);
begin

if Msg.WParam <> 0 then begin
fHWndHookedIEFrame := Msg.WParam;
fHWndHooked := Msg.LParam;

end
else exit;
TimerHook.Enabled := true;

И обработчик таймера(здесь основная работа) — почему через таймер — я уже говорил — нужно дать время на формирование сообщения, оно начинает формироватся даже не при создании окна, а сразу после активации (у меня такое впечатление сложилось, но в прочем на єтом я не настаиваю — в смысле, когда формируется, но что задержка нужна — это обнозначно, я ставлю 0.2 сек)

type
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM:
wParam; out pObject): HRESULT; stdcall;

const MSG: Integer = 0;
hInstLib: HWND =0;
ObjectFromLresult: TObjectFromLresult = nil;

function GetIDocFromHWND(WHandle: HWND; var iDoc: IHtmlDocument2): HRESULT;
var
lRes: Cardinal;
begin
Result := S_FALSE;
if hInstLib = 0 then hInstLib := LoadLibrary(«Oleacc.dll»);
if not assigned(ObjectFromLresult) then @ObjectFromLresult := GetProcAddress(hInstLib, «ObjectFromLresult»);
if @ObjectFromLresult <> nil then begin
try
if MSG=0 then MSG := RegisterWindowMessage(«WM_HTML_GETOBJECT»);
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, iDoc);
finally
//eeLibrary(hInst);
end;
end;
end;

procedure TFormMain_DreamMates14_2.TimerHookTimer(Sender: TObject);
var
WndChild: HWND;
//IE:IWebbrowser2;
iElem:IHtmlElement;
iDoc:IHtmlDocument2;

procedure HtmlCodToLog;
begin
if not assigned(iDoc) then exit;
WrTm(2,»Hooked text:» + GetTxtBoby(iDoc));
WrTm(2,»Hooked html:» + GetHtmlBoby(iDoc));

procedure TryForceCloseHokkedWnd;
var h1,h:thandle;
begin
if fHWndHooked<>0 then begin
PostMessage(fHWndHooked,WM_Close,0,0);
exit;
end;
h1:= fHWndHookedIEFrame;

if ((h=0) or (h=Handle)) then begin
PostMessage(h1,WM_Close,0,0);
exit;
end;
h1 := h;

var s:string;
begin //
try
TimerHook.Enabled := false;

if ((fHWndHookedIEFrame<>0) and (fHWndHooked=0)) then begin

if not assigned(iDoc) then begin

WndChild := FindWindowEX(fHWndHookedIEFrame, 0, «Internet Explorer_Server», nil);
if WndChild=0 then begin
WrTm(2,»TimerHookTimer: cp1″);
WndChild := FindWindowEX(fHWndHooked, 0, «Internet Explorer_Server», nil);
end;
if WndChild=0 then begin
WrTm(2,»TimerHookTimer: cp2″);
Exit;
end;
if GetiDocFromHWND(WndChild,IDoc)<>S_OK then begin
WrTm(2,»TimerHookTimer: cp3″);
exit;
end;
end;
if not assigned(iDoc) then begin
WrTm(2,»TimerHookTimer: cp4″);
exit;
end;

WrTm(0,»** Catch window with a html-warnintg . «);
HtmlCodToLog;

if Pos(«error has occurred in the script on this page»,s)>0 then begin
iElem := GetButtonWithSubstrInOuterHtml2( >if assigned(iElem) then begin
iElem.Click;
WrTm(2,»TimerHookTimer: click on «continue running scripts»»);
exit;
end;
end;


Ihor Osov’yak ( 2003-01-19 11:34 ) [4]

Да, функция постановки хука: 🙂

procedure OnHook(aHNotif:THandle);
begin
if HookHandle<>0 then exit;
notifHandle := aHNotif;
HookHandle:=SetWindowsHookEx(WH_CBT,@Kah_hook,0,GetCurrentThreadId);


int64 ( 2003-01-19 12:57 ) [5]

crash123 (18.01.03 16:48)

Сделай так, и вообще никаких окон не будет. Во всяком случае, посмотри, может получится.

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
private
FOldWindowProc: TWndMethod;
procedure FormWndProc(var AMsg: TMessage);
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
FOldWindowProc:= WindowProc;
WindowProc := FormWndProc;
WebBrowser1.Navigate(«c: emp1.htm»);
end;

procedure TForm1.FormWndProc(var AMsg: TMessage);
var
ChWnd, wnd: Integer;
Msg: TWmActivate;
i: integer;
s: string;
begin
if AMsg.Msg = WM_ACTIVATE then
begin
Msg := TWmActivate(AMsg);
wnd := Msg.ActiveWindow;
//if . then
SendMessage(wnd, WM_CLOSE, 0, 0);
end;
FOldWindowProc(AMsg);
end;

А если хочешь, чтоб какое-то конкретное окно пропадало, то перед SendMessage(wnd, WM_CLOSE, 0, 0) ставь проверку на корректную идентификацию этого окна.

Ihor Osov»yak © (19.01.03 11:34)
Что-то ты много написал. Может ты практически подходил? А я вот теоритически. )


Ihor Osov’yak ( 2003-01-19 13:48 ) [6]

2 int64 © (19.01.03 12:57)

> Что-то ты много написал. Может ты практически подходил? А я вот теоритически. )

Практик я, практик. 🙂
Для теоретиков повторяю: прибитие окна на взлете равнозначно тисканию на кнопочку «не выполнять более скриптов» — или как она там зовется, пишу по-памяти, что в болшинстве практических случаев ведет к нарушению функционирования сайта — сейчас часто на всякие линки и кнопки скрипты разработчики сайтов вешают.
Хотя в конкретном случае вариант от int64 пройдет. Но нужно быть готовым к тому, что через некоторое время софту доделывать придется, так как авторы сайта подпадут под модные течения и . (см. выше)


Ihor Osov’yak ( 2003-01-19 13:50 ) [7]

Зы
> прибитие окна на взлете равнозначно тисканию на кнопочку
> «не выполнять более скриптов»
— сие проверялось практически и не единыжды 🙂


Ihor Osov’yak ( 2003-01-19 13:57 ) [8]

Зы еще — в коде от int64 наверно есть ошибка — FormWndProc делает сабклассинг для делфийской формы и будет соотв. ловить ее активацию, а не активацию окна с сообщением с ошибкой.
Имхо, активацию окна с ошибкой — только через хуки.

Зы — на сей раз это теоритическое размышление, практически проверять влом. Но думаю, что я прав.


sergey2 ( 2003-01-21 15:00 ) [9]

Я лично у себя написал:

try
WebBrowser1.Navigate(URL);
except
end;

и никаких ошибок не вылазит.

9 TipTop [2011-12-19 22:49:00]

У меня возникли проблемы с обработкой ошибок javascript в WebBrowser на Delphi 2010.

Я использую WebBrowser с включенным тихим свойством. Кажется ОК, но есть одна проблема на сайтах с багги-скриптами: она кажется частью script после того, как ошибка не выполняется. Результаты некоторых script немного отличаются от IE.

Вы знаете, как решить эту проблему?

javascript browser delphi

2 ответа

12 Решение TLama [2011-12-20 18:06:00]

В следующем примере я использовал вставленный класс, поэтому, если вы поместите этот код в свое подразделение, только эти веб-браузеры в форме или созданные в этом устройстве динамически получат это поведение.

Поставил компонент TWebBrowser , загружаю страницу, выходит ошибка сценария. Если игнорировать ошибки путем

то ошибки нет, но функционал страницы нарушен.

Как устранить данную проблему и сохранить функционал загружаемой страницы?

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Dell support assist ошибка скачивания
  • Delphi try except текст ошибки
  • Delphi try except код ошибки
  • Delta ms300 ошибки
  • Delphi getlasterror текст ошибки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии