Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.26;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1299314549
Galera
2011-03-05 11:42
2011.06.26
СБИС - поиск сервера ПГД - и все это через прокси


15-1299747769
vuk
2011-03-10 12:02
2011.06.26
Бакшевская Масляница


2-1300254324
Andrey_1
2011-03-16 08:45
2011.06.26
DbGrid-ячейка в две строки


2-1300886684
>|<
2011-03-23 16:24
2011.06.26
Quick Report: Блокируется файл отчета после экспорта в PDF


1-1257772682
antonsha
2009-11-09 16:18
2011.06.26
Thread ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский