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

Вниз

открыватьчужие ссылки в новом окне?   Найти похожие ветки 

 
ivanov   (2008-05-19 11:53) [0]

есть страница, http://moj.com
на этой странице несколько ссылок, некоторые из них вида
http://moj.com/thread.html,
другие же вида http://drugoj.com/
для работы используется компонент TWEbbrowser
как сделать чтобы по клику на ссылке те, которые http://moj.com открывались в этом-же окне, а все другие чтобы в новом окне?
как сделать проверку строки - я знаю,:

if pos("http://moj.com/", s) > 0 then

//открываем ссылку обычным путем

else

//открываем в новом окне. <--  как реализовать?


 
ЮЮ ©   (2008-05-19 12:18) [1]

Открываем новый экземпляр формы с TWEbbrowser-ом на борту.


 
ivanov   (2008-05-19 13:52) [2]


> Открываем новый экземпляр формы с TWEbbrowser-ом на борту.


в смысле это как, подробнее можно?
и в каком событии это делать?


 
ivanov   (2008-05-19 13:54) [3]

а открыть в браузере который в системе по дефолту стоит никак нелзя?


 
DVM ©   (2008-05-19 15:22) [4]


> а открыть в браузере который в системе по дефолту стоит
> никак нелзя?

можно


 
ivanov   (2008-05-19 15:37) [5]


> можно

а как именно?
сохранять урл на винт и запускать через shellexecute?
на какое событие  вешать?


 
ivanov   (2008-05-21 08:00) [6]

ауу! что дальше общих фраз дело не пойдет?
ну, как всегда...


 
DVM ©   (2008-05-21 16:48) [7]


> а как именно?

ShellExecute.


> сохранять урл на винт и запускать через shellexecute?

Зачем сохранять? Как параметр передавать.


 
ivanov   (2008-05-21 17:48) [8]

так, хочу код :)
дело в том, что я пробовал через shellexcute, не работает
и еще важно, на какое событие браузера это дело повесить?


 
Сергей М. ©   (2008-05-21 19:44) [9]


> хочу код


"Иванов на остановке, в ожиданьи кружки пива, в предкушеньи колесницы .." (С) БГ

Какой тебе еще код ?

Создавай новый экз-р TWEbbrowser и вызывай его метод Navigate


 
ivanov   (2008-05-22 10:56) [10]

итак,резюме:
открыть ссылку в браузере по дефолту через shellexecute не выйдет, разве что сохранять ее как файл *.url, но это к "мастерству" никакого отношения не имеет, а также - изврат.
создавать новый экземпляр формы с браузером - меня не устраивает такое решение.
к сожалению в который раз убедился, что "мастера" когда доходит до относительно сложных вопросов помочь ничем, кроме как напыщено заявлять "можно", "нельзя" не могут.
печально.


 
DVM ©   (2008-05-22 11:05) [11]


> открыть ссылку в браузере по дефолту через shellexecute
> не выйдет, разве что сохранять ее как файл *.url, но это
> к "мастерству" никакого отношения не имеет, а также - изврат.
>

Все выйдет еще как. Ты не пробовал в командной строке набирать:

C:\Program Files\Internet Explorer>iexplore.exe www.google.ru ???

Попробуй, удивишься.


 
DVM ©   (2008-05-22 11:20) [12]


> ivanov

Между прочим, при клике в TWebBrowser по ссылке, в теге которой указано "Открывать в новом окне" все прекрасно открывается в новом окне браузера. Если же ты хочешь ВСЕ ССЫЛКИ открывать в новом окне, то, очевидно, ShellExecute тебе в помощь.


> ivanov   (21.05.08 17:48) [8]
>
> так, хочу код :)
> дело в том, что я пробовал через shellexcute, не работает

Может покажешь как ты пробовал? Или ты и не пробовал вовсе?


> и еще важно, на какое событие браузера это дело повесить?

OnBeforeNavigate2.


 
ivanov   (2008-05-22 12:12) [13]

procedure tform1.Button2Click(Sender: TObject);
var flags: OleVariant;
begin
flags := 0;
webbrowser1.Navigate("http://mail.ru", flags);
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
 Headers: OleVariant; var Cancel: WordBool);
 var s, n: string;
 p: pchar;
begin
 s := "mail.ru";
 n := url;
 p := pchar(n);
cancel := false;
if (pos(s, url) <= 0) then begin
  shellexecute(handle, "open", p, " target="_blank"", nil, sw_shownormal);
  cancel := true;
 end;
end;


вот пожалуста.
куча рекламных окон.


 
Сергей М. ©   (2008-05-22 12:26) [14]


>
> вот пожалуста.
> куча рекламных окон.
>


Что написал, то и получил, чему ж тут удивляться)


 
ivanov   (2008-05-22 12:55) [15]


> Что написал, то и получил, чему ж тут удивляться)


???
что конкретнo здесь не правильно?


 
DVM ©   (2008-05-22 13:31) [16]


> что конкретнo здесь не правильно?

Конкретно надо отделять мух от котлет в OnBeforeNavigate2. Это событие возникает чаще, чем ты думаешь, особенно на навороченных страницах с баннерами во фреймах и.т.д.


 
ivanov   (2008-05-22 14:03) [17]

так вы же сами написали в пост #12.
каким образом тогда отделять мух от котлет, если неизвестно какие адреса реклама, а какие не реклама?
получается это событие не подходит...


 
Сергей М. ©   (2008-05-22 14:20) [18]


> что конкретнo здесь не правильно?


Каждая вызванная тобой ShellExecute стартует отдельный процесс браузера.
Каждый стартованный процесс браузера создает как минимум одно окно.


> каким образом тогда отделять мух от котлет, если неизвестно
> какие адреса реклама, а какие не реклама?


Ты предлагаешь определять это нам  ?

Или ты полагаешь, что на свете существует супер-пупер-функция типа

function IsReklama(URL: String): Boolean;

которая сделает это сама ?


 
Сергей М. ©   (2008-05-22 14:25) [19]


> ivanov


И вообще - если вся эта твоя хитромудрая затея сводится к необходимости блокировать запросы к нежелательным ресурсам, то реализуется все то гораздо проще: браузеру указывается прокси-сервер с требуемой функциональностью, который настраивается требуемым образом.


 
ivanov   (2008-05-22 14:26) [20]

я вам ничего не предлагаю.
я надеюсь, может DVM все-таки подскажет, на какое событие вешать, так как уже определили, что beforeNavigate2 не подходит.


 
DVM ©   (2008-05-22 14:27) [21]


> каким образом тогда отделять мух от котлет, если неизвестно
> какие адреса реклама, а какие не реклама?

Дело не в рекламе. Дело в том, что ты пытаешься изменить правильное поведение браузера на заведомо неправильное. Браузер следут тому, что указано в параметрах ссылки - в новом окне, значит в новом, в текущем, значит в текущем. Ты же делаешь так, что при любом переходе по ссылке (а обновление баннера во фрейме с помощью джаваскрипта это тоже переход) ты всегда пытаешься создать новое окно. Вот и получается ерунда.


> получается это событие не подходит...

подходит оно, подходит.


 
Сергей М. ©   (2008-05-22 14:28) [22]


> так как уже определили, что beforeNavigate2 не подходит


Где и кто это определил, кроме тебя самого в [20] ?


 
ivanov   (2008-05-22 14:37) [23]

ладно, как тогда обработать для моей задачи щелчок по ссылке в браузере если не заморачиватся с событием beforeNavigate2?


 
DVM ©   (2008-05-22 14:43) [24]


> ivanov   (22.05.08 14:37) [23]

Щелчок понятие растяжимое. Пример: при клике мышкой по некоторой картинке, которая не является ссылкой, браузер, благодаря скрипту на JavaScript или ActiveX или Flash или Java или .... уходит по некой ссылке. Или сам по себе, без клика по той же причине.

beforeNavigate2 возникнет, а вот ссылки и не было никакой.

Это гиблый подход.


 
DVM ©   (2008-05-22 14:45) [25]


> а вот ссылки и не было никакой.

точнее клика по ссылке <a href>...</a>


 
ivanov   (2008-05-22 14:47) [26]

шелчок по гиперссылке (напр. <a href="www.ssilka.com">ssilka</a>)
как обработать?


 
DVM ©   (2008-05-22 14:56) [27]


> шелчок по гиперссылке

Никак. Можно лишь понять что браузер собрался в путь по какой-то гиперссылке и разрешить/запретить ему это или поменять что-то во флагах перед навигацией.

Чудак-человек, пойми, что кликать можно не только по ссылкам. А вот при переходе всегда ссылка будет.


 
ivanov   (2008-05-23 10:19) [28]

странно.  а может можно через метод onclick объектной модели документа?
вот ms пишет, что у ihtmldocument2 есть такой метод http://msdn.microsoft.com/en-us/library/aa752611(VS.85).aspx


 
DVM ©   (2008-05-23 10:51) [29]


> а может можно через метод onclick объектной модели документа?

Так это клик вообще, а не по ссылке. К тому же я уже говорил, что браузер мождет перейти по ссылке и без кликов вообще.


 
ivanov   (2008-05-23 11:14) [30]

значит задача не решаема.
жаль.


 
DVM ©   (2008-05-23 11:18) [31]


> ivanov   (23.05.08 11:14) [30]
> значит задача не решаема.

А зачем это все нужно в конечном итоге? Ты бы рассказал - может другое решение есть.


 
ivanov   (2008-05-23 12:13) [32]

вкратце:
есть один форум. у него неизменяемый дизайн (скажем красный).
это с течением времени сильно напрягло глаза и мозг.
решил сделать специально под него клиент (дизайн - вовсе не единственная причина написания программы) в котором могу подключить свой CSS.
идея простая, на винте лежит файл CSS, в ктором прописаны те цвета, кот я хочу.
программа при загрузке страницы подключает мой css вместо ихнего, и показывает в webbrowser форум с красивыми цветами. :)
все довольны, и форум и я.
но есть одна проблема, люди на форуме в тредах дают ссылки на другие сайты, и когда переходишь по такой ссылке часто (но не всегда) лезут ошибки.
эти ошибки объясняются просто - попытка использования файла стилей, который к данной странице не подходит.
этим и обусловлена задача отделения одних ссылок от других, с тем, чтобы "чужие" ссылки открывались в новом окне дефолтного браузера, и мой файл стилеj к нему отношения не имел.
как говоритса "с глаз долой - из сердца вон"

а можно чтоб здесь не размазывать кашу вам на мыло написать.
к тому-ж не хочется адрес в паблик светить.


 
DVM ©   (2008-05-23 14:42) [33]


> этим и обусловлена задача отделения одних ссылок от других,
>  с тем, чтобы "чужие" ссылки открывались в новом окне дефолтного
> браузера, и мой файл стилеj к нему отношения не имел.

Дык не подключать свой файл стилей к тем страницам которые не содержат адреса форума. Т.е. перед навигацией на страницу ты должен смотреть, если в URL адрес форума, если есть - подключай свой файл стилей, если нет - не подключай.


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

Обсуждение лучше все же здесь, это может быть кому то еще интересно окажется.


 
ivanov   (2008-05-23 14:58) [34]


> если есть - подключай свой файл стилей, если нет - не подключай.


делал.
проблема в том, что при проверке старый цвет лезет.


 
DVM ©   (2008-05-23 15:27) [35]


> проблема в том, что при проверке старый цвет лезет.

Что значит лезет? Момент проверки он в BeforeNavigate как там может что-то лезть? Давай код, в котором лезет, на примере, скажем, этого сайта.

Вообще, если все же открывать в новые окна, наверное получится так:

1) В BeforeNavigate смотрим по флагам в новом или не в новом окне собралась открываться страница.
2) Если в новом - нехай открывается как есть - скорее всего это внешняя ссылка.
3) Если не в новом, то смотрим адрес форума в URL содержится или нет. Если содержится, то меняем таблицу стилей, если не содержится - не меняем.


 
ivanov   (2008-05-23 18:44) [36]

вот
когда по ссылкам переходить, видно, что старый дизайн на некоторое время появляется.


procedure tform1.updateStyle;
var s: string;
begin
s := "file:///c:/my.css";
if webbrowser1.Document <> nil then
webbrowser1.OleObject.Document.styleSheets.Item(0).href := s;
end;

procedure tform1.updateStyle2(fs: string);
var s: string;
begin
s := "file:///c:/my.css";
if (pos("www.delphimaster.ru", s) > 0) then begin
 if (webbrowser1.Document <> nil) then
 webbrowser1.OleObject.Document.styleSheets.Item(0).href := s;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate("http://www.delphimaster.ru/cgi-bin/forum.pl?n=4");
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
 Headers: OleVariant; var Cancel: WordBool);
begin
updatestyle2(url);
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
updatestyle;
end;


 
ivanov   (2008-05-23 18:53) [37]

в посте 36 опечатка.
в функции updatestyle2 вместо

(pos("www.delphimaster.ru", s) > 0)

нужно

(pos("www.delphimaster.ru", fs) > 0)


 
DVM ©   (2008-05-23 21:07) [38]


> ivanov   (23.05.08 18:53) [37]

По-моему вот так все нормально работает. По форуму фон красный, по остальным ссылкам стандартный:


procedure tform1.updateStyle2(fs: string);
var
 s: string;
begin
 s := "file:///c:/my.css";
 if (pos("www.delphimaster.ru/cgi-bin/forum.pl", fs) > 0) then
   begin
     if (webbrowser1.Document <> nil) then
       webbrowser1.OleObject.Document.styleSheets.Item(0).href := s;
   end;
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
 const pDisp: IDispatch; var URL: OleVariant);
begin
 updatestyle2(URL);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 webbrowser1.Navigate("http://www.delphimaster.ru/cgi-bin/forum.pl?n=4");
end;


В my.css все то же, что у форума delphimaster, только исправил:

body, td, ol, ul, li, p {
font: 10pt Verdana, Arial, Helvetica, Tahoma, sans-serif;
background-color: red;
}


 
ivanov   (2008-05-23 22:39) [39]

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


 
DVM ©   (2008-05-23 23:30) [40]


> ivanov   (23.05.08 22:39) [39]

Вот еще вариант, у меня не мелькает. Точнее мелькает несколько, но уже по другой причине, и это мелькает не старое оформление.


unit Main;

interface

uses
 Forms, Menus, OleCtrls, SHDocVw, Classes, Controls, StdCtrls, XPMan,
 UContainer, ExtCtrls, ShellAPI;

type
 TMainForm = class(TForm)
   WebBrowser1: TWebBrowser;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   fWBContainer: TWBContainer;
 end;

var
 MainForm: TMainForm;

implementation

uses
 SysUtils, Windows, Graphics, Dialogs;

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
var
 FmtCSS: string;  // Stores default CSS
begin
FmtCSS := "body {"#13#10
   + "    background-color: red;"#13#10
   + "}";
 fWBContainer := TWBContainer.Create(WebBrowser1);
 fWBContainer.UseCustomCtxMenu := True;
 fWBContainer.Show3DBorder := False;
 fWBContainer.ShowScrollBars := False;
 fWBContainer.AllowTextSelection := False;
 fWBContainer.CSS := FmtCSS;
 fWBContainer.HostedBrowser.Navigate("http://www.delphimaster.ru/cgi-bin/forum.pl?n=4");
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 fWBContainer.Free;
end;

end.



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

Форум: "Сети";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.006 c
1-1238665266
salexn
2009-04-02 13:41
2010.02.28
Проблема с динамической загрузкой пакета


15-1260807632
Kostafey
2009-12-14 19:20
2010.02.28
Шрифты в редакторе формул Word-а


1-1237789977
Riply
2009-03-23 09:32
2010.02.28
Получение EnvironmentStrings среды.


4-1229369994
DenisArd
2008-12-15 22:39
2010.02.28
Загрузка иконок


15-1260906039
@!!ex
2009-12-15 22:40
2010.02.28
Эмулятор COM модема





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский