Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.26;
Скачать: CL | DM;

Вниз

TWebBrowser и браузер по умолчанию   Найти похожие ветки 

 
Учусь   (2011-03-23 20:47) [0]

В программе есть форма, на которой лежит TWebBrowser, в него с сайта загружается инфа и пользователь может пройти по ссылке которая есть в этой инфе. При клике на ссылку TWebBrowser открывает свое окно - окно ИЕ, а не браузер установленный по умолчанию.
Подскажите можно ли заставить его открывать браузер установленный в системе "по умолчанию" ?


 
Игорь Шевченко ©   (2011-03-23 21:37) [1]

OnBeforenavigate перехватить линк, сказать ShellExecute ("open", ...) ?


 
Учусь   (2011-03-23 21:50) [2]

Спасибо, пошел разбираться:)


 
Учусь   (2011-03-24 16:25) [3]

ничего не понимаю:(


 
Учусь   (2011-03-24 16:27) [4]

Копипастю сюда текст кода и ничего не отображается.


 
Игорь Шевченко ©   (2011-03-24 16:30) [5]

ссылки из кода надо убрать


 
Учусь   (2011-03-24 16:46) [6]

Что-то ничего у меня не получается. Помогите пожалуйста, почсните, что я делаю не так? Есть такой код:

procedure TForm1.Button1Click(Sender: TObject);
var PAGE : String;
begin
  PAGE := "C:/Temp/Web/index.htm";
  FIsStartPage := True;
  Webbrowser1.Navigate("file:///" + PAGE);
  FIsStartPage := False;
end;

procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
var  txtURL: string;
begin
  txtURL := URL;
 if not FIsStartPage then
  begin
    Cancel := True;
    ShellExecute(Application.Handle, "open", PChar(txtURL), nil, nil, SW_NORMAL);
  end;
end;

Он нормально открывает локальную страницу. Но на локальной странице есть ссылка вида:
<а hrеf="httр://mуsеrvеr/mypage"  tаrgеt="_blаnk">
<img border="0" src="img/button.jpg" width="130" height="31"></a>

При клике на ней - открывается ИЕ. Хотя подефолту стоит Опера. В чем подвох?


 
Учусь   (2011-03-24 16:49) [7]

Да, еще, ставлю точку останова на строках:
 ShellExecute(Application.Handle, "open", PChar(txtURL), nil, nil, SW_NORMAL);
и не останавливается. Такое ощущение что WebBrowser1BeforeNavigate2 при клике не происходит...


 
b z   (2011-03-24 18:02) [8]

всему виной tаrgеt="_blаnk"


 
Учусь   (2011-03-24 18:34) [9]


> всему виной tаrgеt="_blаnk"

Нет, без него просто открывается в том же окне.

Не происходит это:
ShellExecute(Application.Handle, "open", PChar(txtURL), nil, nil, SW_NORMAL);
Вроде как WebBrowser1BeforeNavigate2 вообще не происходит. Такое возможно?


 
b z   (2011-03-24 18:46) [10]


> Нет, без него просто открывается в том же окне.
Без него навигейт работает (поставте точку останова на первой строке метода), а с ним ие "внутри" создает новое своё же окно/таб(сущетсвующего) и ему устанавливает локешн, ваш браузер ничего не знает про это.


 
Учусь   (2011-03-24 18:54) [11]

Навигейт работает, но мне надо чтобы по клику на кнопку запустился дефолтный браузер.. Т.е. это:
ShellExecute(Application.Handle, "open", PChar(txtURL), nil, nil, SW_NORMAL);

А это не происходит.


 
Игорь Шевченко ©   (2011-03-24 19:04) [12]

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, OleCtrls, SHDocVw, StdCtrls;

type
 TForm1 = class(TForm)
   WebBrowser1: TWebBrowser;
   procedure WebBrowser1BeforeNavigate2(ASender: TObject;
     const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
     Headers: OleVariant; var Cancel: WordBool);
   procedure FormCreate(Sender: TObject);
   procedure WebBrowser1DocumentComplete(ASender: TObject;
     const pDisp: IDispatch; var URL: OleVariant);
 private
   FStartPageComplete: Boolean;
 end;

var
 Form1: TForm1;

implementation
uses
 ShellApi;

const
 StartURL = "http://www.delphimaster.ru/";

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 WebBrowser1.Navigate(StartURL);
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
 const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
 Headers: OleVariant; var Cancel: WordBool);
var
 URLString: string;
begin
 if FStartPageComplete then
 begin
   URLString := VarToStr(URL);
   Cancel := True;
   ShellExecute(Handle,"open",PChar(URLString), nil, nil, SW_SHOW);
 end;
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
 const pDisp: IDispatch; var URL: OleVariant);
var
 URLString: string;
begin
 URLString := VarToStr(URL);
 if URLString = StartURL then
   FStartPageComplete := True;
end;

end.


 
b z   (2011-03-24 19:09) [13]


> А это не происходит.
Дэбаг форева. ;)


 
b z   (2011-03-24 19:31) [14]


> Игорь Шевченко ©   (24.03.11 19:04) [12]
По рефреш тоже откроет новое окно, а не должно. :)


 
Учусь   (2011-03-24 20:19) [15]


> Игорь Шевченко ©   (24.03.11 19:04) [12]

Работает. Но стоит заменить:

const
StartURL = "http://www.delphimaster.ru/";
на
StartURL = "file:///C:/Temp/web/index.htm";

И получается та же история - клик открывает ссылку в том же окне WebBrowserа.  Чего я и хотел побороть:)
Думаю решение где-то на поверхности, но ничего не придумывается. Тут разница только в http: и file: Может он и ссылку пытается локально открыть, из кеша?


 
Учусь   (2011-03-24 20:31) [16]

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
URLString: string;
begin
URLString := VarToStr(URL);
if URLString = StartURL then  // здесь
  FStartPageComplete := True;
end;


URLString = StartURL - здесь нет равенства при StartURL = "file:///C:/Temp/web/index.htm";
Поэтому не выполняется условие в WebBrowser1BeforeNavigate2 и ничего не запускается.
Что-то я совсем запутался:) Помогите решить?


 
Игорь Шевченко ©   (2011-03-24 20:44) [17]

procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
 var Cancel: WordBool);
var
 URLString: string;
begin
 if FStartPageComplete then
 begin
   URLString := ((TWebBrowser(ASender).document as IHTMLDocument2)
     .activeElement as IHTMLElement).getAttribute("href", 0);
   Cancel := True;
   ShellExecute(Handle,"open",PChar(URLString), nil, nil, SW_SHOW);
 end;
end;


 
Игорь Шевченко ©   (2011-03-24 20:48) [18]

При target="_blank" вызывается другое событие, OnNewWindow2

Я проверял на таком html

<html>
<head>Here is the news</head>
<body>
<H1>Here is the news coming to you every hour on the hour</H1>
<BR>
<A HREF="http://www.delphimaster.ru" target="_blank">Click here</A>
</body>
</html>



> URLString = StartURL - здесь нет равенства при StartURL
> = "file:///C:/Temp/web/index.htm";


use PathToURL


 
Учусь   (2011-03-25 15:00) [19]


> Игорь Шевченко ©   (24.03.11 20:44) [17]

Вставил этот обработчик в код и поставил точки останова - не останавливается.
И как понять строчку: "use PathToURL" ? про такую функцию знает только гугл и то говорит что она в джаве.

В общем получился такой код:

const
// StartURL = "httр://www.dеlphimaster.ru/";
StartURL = "file:///C:/Temp/web/index.htm";

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate(StartURL);
end;

{ procedure TForm1.WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
var
URLString: string;
begin
if FStartPageComplete then
begin
  URLString := ((TWebBrowser(ASender).document as IHTMLDocument2)
    .activeElement as IHTMLElement).getAttribute("href", 0);
  Cancel := True;
  ShellExecute(Handle,"open",PChar(URLString), nil, nil, SW_SHOW);
end;
end; }  // это не работает в обоих случаях.

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var
URLString: string;
begin
if FStartPageComplete then
begin
  URLString := VarToStr(URL);
  Cancel := True;
  ShellExecute(Handle,"open",PChar(URLString), nil, nil, SW_SHOW);
end;
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
URLString: string;
begin
URLString := VarToStr(URL);
if URLString = StartURL then
  FStartPageComplete := True; end;

end.


При StartURL = "http://www.delphimaster.ru/"; все работает как надо.
При StartURL = "file:///C:/Temp/web/index.htm"; - все ссылки открываются в то же окне WebBrowserа.
Помогите сделать как надо, пожалуйста.


 
Учусь   (2011-03-25 15:53) [20]

Заставил работать как мне нужнои зменив таким образом:

const
// StartURL = "httр://www.dеlphimaster.ru/";
// StartURL = "file:///C:/Temp/web/index.htm";

StartURL = "C:\TEMP\web\index.htm";

Скажите, это правильное, "кошерное" решение? Нет ли тут подводных камней?


 
Игорь Шевченко ©   (2011-03-25 16:54) [21]


> Скажите, это правильное, "кошерное" решение?


Раввин что говорит ?



Страницы: 1 вся ветка

Текущий архив: 2011.06.26;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
1-1257767754
Chizhov
2009-11-09 14:55
2011.06.26
Определение начала/завершения сеанса пользователя из сервиса?


15-1299749393
Юрий
2011-03-10 12:29
2011.06.26
С днем рождения ! 6 марта 2011 воскресенье


15-1299833572
OW
2011-03-11 11:52
2011.06.26
Как проверить было ли изменение TDataSet ?


2-1300262871
fred
2011-03-16 11:07
2011.06.26
AV


2-1300430234
Andrey_1
2011-03-18 09:37
2011.06.26
Перехватить информацию