|
6 / 6 / 2 Регистрация: 14.12.2013 Сообщений: 117 |
|
|
1 |
|
|
31.07.2014, 10:32. Показов 13357. Ответов 6
ВебБраузер делает свою работу. Вот только ошибку показывает. Можно как-то их отключить?
__________________
0 |
|
Mawrat 13090 / 5871 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||
|
31.07.2014, 10:45 |
2 |
|||
|
РешениеПогасить вывод диалогов с предупреждениями и сведениями об ошибках:
1 |
|
6 / 6 / 2 Регистрация: 14.12.2013 Сообщений: 117 |
|
|
31.07.2014, 10:57 [ТС] |
3 |
|
0 |
|
13090 / 5871 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
|
|
31.07.2014, 11:46 |
4 |
|
Может быть, есть. Надо поискать в сети.
0 |
|
Супер-модератор
32444 / 20939 / 8104 Регистрация: 22.10.2011 Сообщений: 36,202 Записей в блоге: 7 |
|
|
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 |
|||||||
|
У меня тоже была такая проблема с этим компонентом, но я решил это.
и совместным использованием этой строки со строкой
у меня решилась эта проблема.
0 |
- 0
Ответ от
dmdel,
23 октября, 2016
-
Задать вопрос
Вопрос
-
- Поделиться
В приложении для 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;
При отображении сайта появляется сообщение об ошибках сценария. И сайт отображается некорректно.
Как это поправить?
Ссылка на комментарий
Рекомендуемые сообщения
- 0
- Автор
-
- Поделиться
Если через браузер захожу, то таких проблем нет
Ссылка на комментарий
- 0
![]()
-
- Поделиться
Видимо ошибка javascript на самом сайте. Помню в WebBrowser в VCL было свойство silent, c помощью которого можно было отключить отображение ошибок. К сожалению, в FMX не вижу этого свойства.
Попробуйте веббраузер ChromiumFMX
Изменено 24 октября, 2016 пользователем Rusland
Ссылка на комментарий
- 0
- Автор
-
- Поделиться
59 минут назад, Rusland сказал:
Видимо ошибка javascript на самом сайте. Помню в WebBrowser в VCL было свойство silent, c помощью которого можно было отключить отображение ошибок. К сожалению, в FMX не вижу этого свойства.
Попробуйте веббраузер ChromiumFMX
Silent пробовал, ошибка не появляется, но все равно сайт отображается некорректно. Часть функционала просто не показывается.
Попробую ChromiumFMX
Ссылка на комментарий
- 0
![]()
-
- Поделиться
Так у вас VCL что ли? Тогда смотрите Хромиум для VCL (имейте в виду — их две версии dcef3 и dcef1)
Изменено 24 октября, 2016 пользователем Rusland
Ссылка на комментарий
- 0
- 0
- Автор
-
- Поделиться
Вообщем попробовал ChromiumFMX .
Скачал отсюда http://www.fmxexpress.com/web-browser-component-for-delphi-xe6-firemonkey-on-windows-and-mac-osx/
Установил компонент, скопировав файлы *.dcu в папку C:Program Files (x86)EmbarcaderoStudio15.0libwin32debug и C:Program Files (x86)EmbarcaderoStudio15.0libwin32release
Компонент установился, проект компилируется, но при запуске приложения ошибка. Вместе с установочником есть пример. Там та же ошибка. Может еще где-нибудь что нибудь не прописал или не скопировал?

Ссылка на комментарий
-
- 0
![]()
-
- Поделиться
Положите все библиотеки (*.dll) Хромиума в папку с исполняемым файлом. Плюс как минимум 2 папки с локалями и компонентами движка.
Добавил принтскрин всего того что должно лежать в папке вместе с вашим екзешником.
Это всё есть в архиве, из которого Вы устанавливали компонент в папке cef3_ChromiumXE6binWin32 (или Win64)

Изменено 25 октября, 2016 пользователем MAD_EVAL
Добавил
-
enatechno и
Rusland -

2
Ссылка на комментарий
- 0
- Автор
-
- Поделиться
7 часов назад, MAD_EVAL сказал:
Положите все библиотеки (*.dll) Хромиума в папку с исполняемым файлом. Плюс как минимум 2 папки с локалями и компонентами движка.
Спасибо! Заработало!
Ссылка на комментарий
- 0
![]()
-
- Поделиться
22 часа назад, dmdel сказал:
Спасибо! Заработало!
Не за что. Будут вопросы по хромиуму — пишите в личку
Ссылка на комментарий

Эта тема закрыта для публикации ответов.
-
Последние посетители
0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
← →
crash123
(2003-01-18 16:48)
[0]
Я использую компоненту 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 коде которого есть id=btnYes, то кликаем по нему. Иначе – просто прибываем
![]()
![]()
← →
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{var _Msg: TMsg}):longint; stdcall;
var wnd: dword;
begin
wnd :=aWParam;
fl:= 0;
if code <0 then begin
Result := CallNextHookEx(HookHandle, Code, aWParam, aLParam {Longint(@_Msg)});
Exit;
end;
if Code = HCBT_CREATEWND then begin
//WrTm(2,"HCBT_CREATEWND");
if GetWndClassName(wnd)="Internet Explorer_Server" then begin
WrTm(2,"Hooked Internet Explorer_Server");
PostMessage(notifHandle,WUM_HookIEFired,wnd,0);
end;
end;
Result:= CallNextHookEx(HookHandle, Code, aWParam, aLParam );
end;
ну и собственно обработчик 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;
end;
И обработчик таймера(здесь основная работа) — почему через таймер — я уже говорил — нужно дать время на формирование сообщения, оно начинает формироватся даже не при создании окна, а сразу после активации (у меня такое впечатление сложилось, но в прочем на єтом я не настаиваю — в смысле, когда формируется, но что задержка нужна — это обнозначно, я ставлю 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));
end;
procedure TryForceCloseHokkedWnd;
var h1,h:thandle;
begin
if fHWndHooked<>0 then begin
PostMessage(fHWndHooked,WM_Close,0,0);
exit;
end;
h1:= fHWndHookedIEFrame;
repeat
h:=GetParent(h1);
if ((h=0) or (h=Handle)) then begin
PostMessage(h1,WM_Close,0,0);
exit;
end;
h1 := h;
until false;
end;
var s:string;
begin //
try
TimerHook.Enabled := false;
if ((fHWndHookedIEFrame<>0) and (fHWndHooked=0)) then begin
GetiDocFromHWND(fHWndHookedIEFrame,IDoc);
end;
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;
//fIsOtherHTMLWarning := true;
WrTm(0,"** Catch window with a html-warnintg ....");
HtmlCodToLog;
s:=lowercase(GetTxtBoby(iDoc));
if Pos("error has occurred in the script on this page",s)>0 then begin
iElem := GetButtonWithSubstrInOuterHtml2(iDoc,"id=btnYes");
if assigned(iElem) then begin
iElem.Click;
WrTm(2,"TimerHookTimer: click on "continue running scripts"");
exit;
end;
end;
TryForceCloseHokkedWnd;
finally
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);
end;
![]()
![]()
← →
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;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FOldWindowProc:= WindowProc;
WindowProc := FormWndProc;
WebBrowser1.Navigate("c:temp1.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;
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;
и никаких ошибок не вылазит.
![]()
![]()
На чтение 8 мин. Просмотров 43 Опубликовано 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 , загружаю страницу, выходит ошибка сценария. Если игнорировать ошибки путем
то ошибки нет, но функционал страницы нарушен.
Как устранить данную проблему и сохранить функционал загружаемой страницы?
|
|
|
|

Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.
Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.
Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Полезные ссылки:
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь:
Krid,
Rouse_

TwebBrowser и отлов ошибки сценария
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
|
|
Hi All. Есть TwebBrowser, в который страница загружается через непосредственную передачу html кода. Заранее спасибо. |
|
Zub. |
|
|
Junior
Рейтинг (т): -3 |
А нет ли ошибки в ХТМЛ- коде этой страницы? Обычно такое окно возникает при ошибке ХТМЛ, JavaScript или чего-то подобного. Ещё такое бывает при передаче кода по сети, когда сеть плохо работает. |
|
Lavrik |
|
|
дык в том то и печенюшка, что скорее всего есть и нужно это ловить и гасить — один фиг после нажатия кнопки «да» страничка показывается, нужно обходицца без нажатий |
|
Lavrik |
|
|
проблема снялась с использованием TEmbeddedWB и в событии OnScriptError установки флагов |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Сетевое программирование
- Следующая тема
[ Script execution time: 0,0184 ] [ 16 queries used ] [ Generated: 29.01.23, 02:27 GMT ]
Вы можете использовать IOleCommandTarget и в IOleCommandTarget.Exec метод поймать OLECMDID_SHOWSCRIPTERROR.
В следующем примере я использовал вставленный класс, поэтому, если вы поместите этот код в свое подразделение, только эти веб-браузеры в форме или созданные в этом устройстве динамически получат это поведение.
uses
SHDocVw, ActiveX;
type
TWebBrowser = class(SHDocVw.TWebBrowser, IOleCommandTarget)
private
function QueryStatus(CmdGroup: PGUID; cCmds: Cardinal; prgCmds: POleCmd;
CmdText: POleCmdText): HRESULT; stdcall;
function Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
const vaIn: OleVariant; var vaOut: OleVariant): HRESULT; stdcall;
end;
implementation
function TWebBrowser.QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
prgCmds: POleCmd; CmdText: POleCmdText): HRESULT; stdcall;
begin
Result := S_OK;
end;
function TWebBrowser.Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD;
const vaIn: OleVariant; var vaOut: OleVariant): HRESULT; stdcall;
begin
// presume that all commands can be executed; for list of available commands
// see SHDocVw.pas unit, using this event you can suppress or create custom
// events for more than just script error dialogs, there are commands like
// undo, redo, refresh, open, save, print etc. etc.
// be careful, because not all command results are meaningful, like the one
// with script error message boxes, I would expect that if you return S_OK,
// the error dialog will be displayed, but it vice-versa
Result := S_OK;
// there a script error in the currently executed script, so
if nCmdID = OLECMDID_SHOWSCRIPTERROR then
begin
// if you return S_FALSE, the script error dialog is shown
Result := S_FALSE;
// if you return S_OK, the script error dialog is suppressed
Result := S_OK;
end;
end;
У меня действительно простая программа Delphi XE7. По сути, это просто компонент TWebBrowser, встроенный в форму без дополнительного кода, кроме кнопки, которая вызывает метод Browser.Navigate. Насколько я понимаю, TWebBrowser — это просто оболочка ActiveX для IE.
Я пытаюсь использовать это для отображения очень простой страницы, которая ссылается на библиотеку Javascript D3 (но пока ничего не делает с ней), и веб-страницы обслуживаются с локального веб-сервера, который работает на моем компьютере с использованием WAMPSERVER.
Веб-страницы прекрасно работают в Chrome или IE 11 (у меня Windows 7, 64-разрядная версия). Но когда я пытаюсь просмотреть их в программе Delphi / TWebBrowser, я получаю сообщение об ошибке IE «Произошла ошибка в скрипте на этой странице» (см. Прикрепленное изображение). Кажется, ошибка возникает при попытке получить доступ к библиотеке javascript d3.js в папке d3test / d3 на локальном хосте. Я проверил, что файл d3.js существует в этой папке, и это, кажется, подтверждается тем фактом, что страница работает и отлично отображается как в Chrome, так и в IE.
Возможно, есть проблема с доступом встроенного веб-браузера к локально размещенным страницам? Дополнительные сведения — Я также очистил кеш IE, сбросил настройки Интернета на панели управления Windows, установил минимальные настройки безопасности IE и временно отключил сканер Norton Firewall / Virus.
У кого-нибудь есть мысли по этому поводу? Я действительно надеюсь, что мне удастся вставить некоторые графики D3 в мою программу для Windows.
Вот также HTML-код:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>D3 Test</title>
<script type="text/javascript" src="d3d3.js"></script>
</head>
<body>
Hello World
</body>
</html>

2 ответа
Лучший ответ
Я добавил ответ из ваших комментариев ниже вопроса, так что это может быть полезно для других
Добавьте этот метатег на свою веб-страницу
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
4
Azad
14 Мар 2016 в 06:38
В этом случае вы должны добавить этот класс в ваш код:
type TBrowserEmulationAdjuster = class
private
class function GetExeName(): String; inline;
public const
// Quelle: https://msdn.microsoft.com/library/ee330730.aspx, Stand: 2017-04-26
IE11_default = 11000;
IE11_Quirks = 11001;
IE10_force = 10001;
IE10_default = 10000;
IE9_Quirks = 9999;
IE9_default = 9000;
/// <summary>
/// Webpages containing standards-based !DOCTYPE directives are displayed in IE7
/// Standards mode. Default value for applications hosting the WebBrowser Control.
/// </summary>
IE7_embedded = 7000;
public
class procedure SetBrowserEmulationDWORD(const value: DWORD);
end platform;
class function TBrowserEmulationAdjuster.GetExeName(): String;
begin
Result := TPath.GetFileName( ParamStr(0) );
end;
class procedure TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(const value: DWORD);
const registryPath = 'SoftwareMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION';
var
registry: TRegistry;
exeName: String;
begin
exeName := GetExeName();
registry := TRegistry.Create(KEY_SET_VALUE);
try
registry.RootKey := HKEY_CURRENT_USER;
Win32Check( registry.OpenKey(registryPath, True) );
registry.WriteInteger(exeName, value)
finally
registry.Destroy();
end;
Конец;
Наконец добавьте в свой OnCreate формы:
TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);
Это должно решить вашу проблему
0
Ingo
4 Фев 2019 в 14:21
Сообщение было отмечено KaDima281 как решение
Спасибо. А есть какие-то аналоги вебБраузера? (Кроме TChromium)
А то у меня хромиум не запускается. Теперь дельфи заново переустанавливать…

