Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Ошибки WebBrowser


Автор: Teran 26.9.2006, 11:54
Иногда когда я загружаю страницу в TWebBrowser

выскакивает окно:

Internet Explorer Script Error
.....
Do you want to continue  running scripts on this page?
      Yes  No                              

Как можно сделать чтоб при ошибках скриптов - это окно не покзывалась ????

Автор: Teran 26.9.2006, 16:14
но когда эту же страницу(файл) загружаю грузиш IE - она грузится и никакие ошибки не выскакивают

Автор: December 26.9.2006, 17:23
Таково поведение ком-объекта: даже если ты отключил в осле показ ошибок скрипта, он все равно их показывает.
1) Данная функциональность реализована в TEmbeddedWB
2) Если у тебя задача оооочень специфическая (ты чётко знаешь, какие страницы будут грузиться), то самое дешёвое решение - поставить Silent:=true. Но вообще так делать нельзя, потому что нарушается функциональность во многих других областях.
3) Можно перехватывать создание новых модальных окон и анализировать их... Это самый долгий трудный, но и самый универсальный способ... Так как JS Error - не единственное окно, из-за которого хочется скомкать и выбросить TWebBrowser.

Автор: Sergey912 19.1.2007, 10:29
December, 
А можно поподробнее про третий способ, а то мне как раз окна нужны и только это не надо  smile Проблема в том, что у меня некоторые страницы из-за этого отказываются работать совсем  smile 
На каком уровне перехватывать окна? В самом браузере или на уровне приложения как-то нужно? И как это собственно реализовать на практике?

Автор: December 19.1.2007, 11:12
Sergey912, смотри исходники TEmbeddedWB.
Когда я смотрел, было очень криво написано, но в 90% случаев работало.

Автор: TrillerMan 21.1.2007, 11:52
А как в исходниках оно самое искать? какие функции з аэто отвечают за перехват этих окон и за глушение их?

А если у меня браузер visible:=false это окно всё ранво всплывёт или не будет появляться?

Автор: December 21.1.2007, 14:56
procedure TEmbeddedWB.FormWndProc(var AMsg: Messages.TMessage);

Добавлено @ 14:58 
Это глушение (посылается WM_CLOSE окну)
Цитата(TrillerMan @  21.1.2007,  11:52 Найти цитируемый пост)
браузер visible:=false это окно всё ранво всплывёт или не будет появляться

все равно появится

Автор: TrillerMan 21.1.2007, 15:05
Ок спасибо большое,это только одна процедура? она уже за перехват всех функций отвечает ? буду рыть сорцы smile 

Автор: Sergey912 28.1.2007, 14:38
December, 
Нашел процедуру, только непойму как это самому сделать?

Автор: December 28.1.2007, 21:51
лови...
Код

procedure TMainForm.TrapWM_Activate(var Msg: TWMActivate);
var
  L:Integer;
  wnd:Integer;
  WinClass,WinCaption:string;
  ShouldShow:boolean;
  ShouldClose:boolean;
begin
if Msg.Active = 0 then
  begin
  wnd := Msg.ActiveWindow;
  SetLength(WinClass,80);
  SetLength(WinClass,GetClassName(wnd, PChar(WinClass), Length(WinClass)));
  L:=GetWindowTextLength(wnd);
  SetLength(WinCaption,L+1);
  GetWindowText(Wnd,PChar(WinCaption),L+1);
  SetLength(WinCaption,L);
  ShouldShow:=(WinCaption<>'');
  if ShouldShow then
    begin
    ShouldClose:=(WinCaption='Îøèáêà ñöåíàðèÿ Internet Explorer') and (WinClass='Internet Explorer_TridentDlgFrame');
    ShouldClose:=ShouldClose or ((WinCaption='Internet Explorer Script Error') and (WinClass='Internet Explorer_TridentDlgFrame'));
    ShouldClose:=ShouldClose or ((WinCaption='Internet Explorer') and (WinClass='#32770'));
    if ShouldClose then SendMessage(wnd, WM_CLOSE, 0, 0);
    end;//if should show
  end;//if loose focus
end;//TrapWM_Activate


procedure TMainForm.WMActivate(var Msg: TWMActivate);
begin
TrapWM_Activate(Msg);
inherited;
end;

Автор: Sergey912 29.1.2007, 17:40
December, 
Гм, не работает. Если первая процедура как я понял делает закрытие окна, то что делает вторая? Когда окно появляется ничего не срабатывает...

Автор: December 30.1.2007, 17:19
В интерфейсе формы пропиши procedure WMActivate(var Msg: TWMActivate) message WM_Activate;
как-то так

Автор: Sergey912 31.1.2007, 12:10
December, 
Это я прописал для обоих функций, я говорю, что в таком виде код работать не хочет совсем и пропускает все JS ошибки.
А как процедура WMActivate(var Msg: TWMActivate); их отлавливает? Может попробовать как-то подругому?

Автор: Alexeyt 7.2.2007, 11:26
Цитата(December @ 26.9.2006,  17:23)
Таково поведение ком-объекта: даже если ты отключил в осле показ ошибок скрипта, он все равно их показывает.
1) Данная функциональность реализована в TEmbeddedWB
2) Если у тебя задача оооочень специфическая (ты чётко знаешь, какие страницы будут грузиться), то самое дешёвое решение - поставить Silent:=true. Но вообще так делать нельзя, потому что нарушается функциональность во многих других областях.


Можно подробней плиз? Почему Silent=True приведет к ошибкам, к каким?

У меня стоит именно Silent=True, вроде все работает. Какие могут быть проблемы?

Автор: December 7.2.2007, 21:09
Есть ещё как минимум 3 диалога, подавление которых приводит к некорректной работе страницы или окна. Это
1) HTTP Authorization
2) JS prompt() function
3) JS alert() function
Думаю, есть и ещё диалоги, которые мне сразу в голову не пришли.

Автор: Yura_Matsuk 22.10.2007, 17:12
Цитата(December @ 28.1.2007,  20:51)
лови...
Код

procedure TMainForm.TrapWM_Activate(var Msg: TWMActivate);
var
  L:Integer;
  wnd:Integer;
  WinClass,WinCaption:string;
  ShouldShow:boolean;
  ShouldClose:boolean;
begin
if Msg.Active = 0 then
  begin
  wnd := Msg.ActiveWindow;
  SetLength(WinClass,80);
  SetLength(WinClass,GetClassName(wnd, PChar(WinClass), Length(WinClass)));
  L:=GetWindowTextLength(wnd);
  SetLength(WinCaption,L+1);
  GetWindowText(Wnd,PChar(WinCaption),L+1);
  SetLength(WinCaption,L);
  ShouldShow:=(WinCaption<>'');
  if ShouldShow then
    begin
    ShouldClose:=(WinCaption='Îøèáêà ñöåíàðèÿ Internet Explorer') and (WinClass='Internet Explorer_TridentDlgFrame');
    ShouldClose:=ShouldClose or ((WinCaption='Internet Explorer Script Error') and (WinClass='Internet Explorer_TridentDlgFrame'));
    ShouldClose:=ShouldClose or ((WinCaption='Internet Explorer') and (WinClass='#32770'));
    if ShouldClose then SendMessage(wnd, WM_CLOSE, 0, 0);
    end;//if should show
  end;//if loose focus
end;//TrapWM_Activate


procedure TMainForm.WMActivate(var Msg: TWMActivate);
begin
TrapWM_Activate(Msg);
inherited;
end;

Довольно таки ценный пример. Только скажите, каким образом этот код должен активироваться?

Автор: December 22.10.2007, 20:50
Я там через несколько постов написал, в protected разделе объявления формы пропиши WMActivate как соответствующую сообщению WMActivate. Как это сделать написано везде smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)