| | | | |
Использование функциональности IE или заметки о WebBrowser | Полный текст материала
Другие публикации автора: Ihor Osov'yak
Цитата или краткий комментарий: «... Довольно часто современному программисту приходится решать вопросы, которые связанные с отображением или обработкой информации, представленной в виде html-ресурсов.
Можно, конечно, используя WinInet.dll, получить доступ к требуемому веб-ресурсу, а затем с помощью многочисленных строковых функций получить
интересующею нас ее часть. Эта технология вполне работает, но довольно трудоемкая и, в большинстве случаев далека от элегантности. Другой путь -
использование функциональности Microsoft Internet Explorer. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 12 | 85.7% | | | | Ничего особенно нового и интересного | [2] | 2 | 14.3% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 14 | | | Все понятно, материал читается легко | [1] | 10 | 76.9% | | | | Есть неясности в изложении | [2] | 2 | 15.4% | | | | Непонятно написано, трудно читается | [3] | 1 | 7.7% | | Всего проголосовали: 13 |
[TWebBrowser] [Интеграция с Internet Explorer]
Отслеживать это обсуждение
Всего сообщений: 1511-01-2009 08:32Оно конечно может и общеизвестные вещи, но нормальным языком. Я уже пробовал вникнуть, что такое интерфейсы, но только сейчас вот думаю, что понял. ;) |
|
08-01-2009 14:30Ну и замечание!!!
Да ради нескольких стоящих моментов иногда толстую книгу можно купить. |
|
08-01-2009 07:29В основном общеизвестные вещи, только некоторые детали стоят внимания. |
|
28-11-2006 04:21Ссылки на примеры исправлены |
|
28-11-2006 03:50
16-12-2005 17:53Долго думал и придумал)). Всё таки открыл ссылку в новом экземпляре приложения, а не формы. Думаю, что многих это заинтересует. Да и может кто-то знает другой, менее громоздкий способ и скинет мне это на ящик. Буду благодарен. ))
.....................
type
TForm1 = class(TForm)
wb1: TWebBrowser;
private
_nw : boolean;
wb2 : twebbrowser;
procedure BNv2(Sender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
var Cancel: WordBool);
.......................
end;
var
Form1: TForm1;
implementation
.......................
procedure TForm1.FormCreate(Sender: TObject);
begin
_nw:=false;
wb2:=nil;
end;
.......................
procedure TForm1.wb1NewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
begin
if (wb2<>nil)
then wb2.Destroy;
_nw:=true;
wb2:=twebbrowser.Create(form1);
wb2.OnBeforeNavigate2:=Form1.BNv2;
ppdisp:=wb2.ControlInterface;
end;
procedure TForm1.BNv2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var s : string;
begin
if (_nw)
then begin
_nw:=false;
s:=application.ExeName+' '+url;
winexec(pchar(s),sw_normal);
cancel:=true;
end;
end;
........................
end. |
|
16-12-2005 17:49Долго думал и придумал)). Всё таки открыл ссылку в новом экземпляре приложения, а не формы. Думаю, что многих это заинтересует. Да и может кто-то знает другой, менее громоздкий способ и скинет мне это на ящик. Буду благодарен. ))
|
|
16-04-2005 08:47Отличный и понятный материал. Это не исходник со скудными комментариями, а полноценная статья, содержащая необходимую теоритическую информацию. ОГРОМНОЕ спасибо автору! |
|
09-12-2003 13:41А когда будет продолжение? |
|
23-04-2001 13:21
08-04-2001 17:31Хочу присоединиться к предыдущему отзыву: "С нетерпением жду продолжения материала...". Тема действительно
актуальна, а решение данной проблемы никак не назовешь тривиальным. |
|
01-03-2001 16:16сообщение от автора материала Я хотел-бы сказать несколько слов в ответ Вадиму ...
>Да еще по поводу реальности URL-адресов метода LocationURL и >механизма предложенного автором обсуждаемой статьи. Я получаю >реальные адреса из параметра URL метода BeforeNavigate2 браузера
>procedure TfmMain.wbWebBrowserBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
Ваши рассуждения не верны. Я описывал, как определить, что действительно загружено в WB после загрузки. BeforeNavigate2 возникает до навигации,
те. в URL будет то, что собираемся грузить (но уже после нормализации URL, те если ВЫ в Navigate даете "www.bit.te.ua\uu.html", то в
BeforeNavigate2 URL будет "http:\\www.bit.te.ua\uu.html", и не более).
В действительности будет загруженна служебная страница
res:\\....stddoclc\http_404.html и это можно определить, так как я описывал в статье (в принцыпе, есть и другие способы)
Даже если Вы воспрользуетесь для анализа зацепками, которые возникают
после загрузки - Вам все равно нужно использовать соответствующий метод от IHtmlDocument2, но не WebBrowser2.LocationURL - это ключевой момент моих рассуждений ...
По поводу OnNewWindow2 -
>Нечто подобное я пытался воспроизвести, но это, как мне кажется,
>не решает проблеммы.
>Во-первых этот механизм создает не экземпляр браузера (как приложения),
>а только экземпляр формы в рамках того же приложения и как следствие его пиктограмма не добавляется на панель задач, что делает почти невозможным переключение между окнами.
Естественно, что 'экземпляр формы'. Но ведь невозможно привести рецепты
на все случаи жызни. Я повторюсь - 'то Вам нужно создать свой экземпляр броузера и параметру ppDisp присвоить
интерфейсную ссылку на этот экземпляр ' - под броузером я везде
понимал екземпляр COM-обьекта WebBrowser. И не важно, где он живет -
в TWebBrowser на отдельной форме, в другом приложении (как делает Вадим),
или даже на другой машине - вспомним о DCOM..
.. но это еще не все. Я позволю себе несколько критических замечаний по поводу
размышлений Вадима. Они не имеют прямого отношения к теме разговора,
но посколько с моей точки зрения там есть несколько заблуждений, то:
- для того, чтобы для формочки был свой буттон (пиктограмма) в линейке задач,
совсем не обязательно создавать новый экземпляр приложения. Детали выходят за тему дискуссии - спрашивайте на круглом столе ...
- > только экземпляр формы в рамках того же приложения
> и как следствие его пиктограмма не добавляется на панель задач,
> что делает почти невозможным переключение между окнами.
>Кроме того минимизация этой формы убирает ее вовсе из экрана,
> и поскольку на панели задач нет ее пиктограммы - нет средств снова
> вызвать ее.
У меня впечатление, что Вы начали только вчера работать с Delphi. Существует миллион способов решения этой 'проблемы' и ни один из них не имеет прямого отношения к WebBrowser..
- >Во-вторых локально созданная ссылка на форму при выходе
> из процедуры теряется навсегда и теряется возможность
> освободить память занятую этой формой.'
Неуд. Есть такоя дивная зацепка FormClose(Sender: TObject; var Action: TCloseAction);
в которой можно сказать Action:=caFree; И это не единственный способ
решения 'проблемы'.
- Если я верно понял с фрагментов исходников Вадима - у него для OnNewWindow2 сначала создается форма c броузером в текущем приложении, а потом открывается
в новом приложении. Действительно, чем дольше живу, тем более убеждаюсь, что в 99% оригинальный подход cвязан с наличием предшедсвующих ошибок или незнания очевидных вещей.. Вадим, я приношу извинения за резкий тон, но лучше получить взбучку, чем остатся при не очень рациональных подходах
(с моей точки зрения). Чтобы легше было - я не единыжды публично более жестко получал, пошло на пользу ...
Сорри также за сумбурность - пишу на быструю руку и русский мне не родной ..
|
|
01-03-2001 14:17{Часть 2}
Затем, я внес в процедуру NewWindow2 браузера, следующий код
procedure TfmMain.wbWebBrowserNewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
if TooForm <> nil then
begin
TooForm.Free;
TooForm := nil;
end;
TooForm := TfmMain.Create(Application);
TooForm.Visible := False;
FlagToo := True;
ppDisp := TooForm.wbWebBrowser.DefaultInterface;
end;
который создает, объявленную ранее форму (а в случае если она уже создавалась ранее - предварительно удаляет ее из памяти). При этом в методе Close формы я педусмотрел следующее
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if TooForm <> nil then
begin
TooForm.Free;
TooForm := nil;
end;
end;
И теперь самое главное. Процедура BeforeNavigate2 браузера, в случае необходимости открыть второе окно, проверяет флаг FlagToo и если он - истина - создает еще один, независимый экземпляр приложения
procedure TfmMain.wbWebBrowserBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var
Par: array[0..255] of Char;
S: String;
begin
........
if FlagToo then
begin
S := TooForm.cbURL.Text;
ShellExecute(Application.MainForm.Handle, nil, "webbrowser.exe",
strPcopy(Par, S), nil, SW_SHOW);
FlagToo := False;
end;
end;
Вот и все.
Да еще по поводу реальности URL-адресов метода LocationURL и механизма предложенного автором обсуждаемой статьи. Я получаю реальные адреса из параметра URL метода BeforeNavigate2 браузера
procedure TfmMain.wbWebBrowserBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
Конечно, в моем варианте, тоже не все гладко. Например, тестирование программы под proxy - идеально, а с модемом - иногда делает не то что просишь (правда не на всех машинах и тут возможна вина Windows).
В любом случае, спасибо за внимание. Если кого-то заинтересовало комплексное решение задачи могу выслать коды проекта (около 80 Кб)
Единственная проблемма, посколько я писал программу в Германии, все кнопки и команды меню на немецком, но это мне кажется не очень большое препятствие, т. к. коды достаточно прозрачны для понимания.
С уважением Вадим Кегелес
vadi@gmx.de |
|
01-03-2001 14:16{Прошу прощения, но посколько я получаю сообщение о превашении текстом допустимых 5 Кб (хотя на самом деле их 4,7) я посылаю его в двух частях. Итак часть 1}
Здраствуйте!
Хочу высказаться более подробно, чем просто 'Оценка содержания'.
Я столкнулся с программированием в Delphi под интернет впервые около месяца назад. Сначала были пример Web Browser, поставляемый с Delphi, и статья Александра Лозовюка (кстати, на мой взгляд очень хорошая). Затем я приступил к написанию Браузера. В этой работе мне очень помогли советы А.Лозовюка и, особенно, решения, предложенные Юрием (не знаю фамилии - в нашем клубе под псевдонимом Sum) в приватной переписке.
Итак, Игорь Осов"як предлагает для открытия страницы в новом экземпляре своего браузера следующее, цитирую:
OnNewWindow2
Возникает при попытке открыть документ в новом окне. Если Вы хотите, чтобы документ был открыт в Вашем экземпляре броузера, то Вам нужно создать свой экземпляр броузера и параметру ppDisp присвоить интерфейсную ссылку на этот экземпляр:
procedure TFormSimpleWB.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
var newForm:TFormSimpleWB;
begin
newForm:=TFormSimpleWB.Create(Application);
newForm.Show;
ppDisp:=newForm.WebBrowser1.ControlInterface;
end;
Нечто подобное я пытался воспроизвести, но это, как мне кажется, не решает проблеммы.
Во-первых этот механизм создает не экземпляр браузера (как приложения), а только экземпляр формы в рамках того же приложения и как следствие его пиктограмма не добавляется на панель задач, что делает почти невозможным переключение между окнами. Кроме того минимизация этой формы убирает ее вовсе из экрана, и поскольку на панели задач нет ее пиктограммы - нет средств снова вызвать ее.
Во-вторых локально созданная ссылка на форму при выходе из процедуры теряется навсегда и теряется возможность освободить память занятую этой формой.
Я решил эту задачу следующим образом:
В интерфейсную часть модуля, описывающего главную форму, я добавил еще одну переменную типа гавная форма и флаг, содержащий информацию о том создана эта форма или нет
interface
...
type
TfmMain = class(TForm)
...
var
fmMain : TfmMain;
TooForm : TfmMain;
FlagToo: Boolean;
Переменную TooForm я сделал глобальной для того чтобы к ней можно было обратиться из любой процедуры (а потом и освободить за ней память).
В методе Create формы я присваиваю флагу значение False
procedure TfmMain.FormCreate(Sender: TObject);
...
begin
...
FlagToo := False;
end;
|
|
01-03-2001 11:49С нетерпением жду продолжения материала... |
|
|
|