Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подземелье Магов
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
 
 02:29 Geo
 
 
Во Флориде и в Королевстве сейчас  02:47[Войти] | [Зарегистрироваться]

Обсуждение материала
Использование функциональности IE или заметки о WebBrowser
Полный текст материала


Другие публикации автора: Ihor Osov'yak

Цитата или краткий комментарий:

«... Довольно часто современному программисту приходится решать вопросы, которые связанные с отображением или обработкой информации, представленной в виде html-ресурсов. Можно, конечно, используя WinInet.dll, получить доступ к требуемому веб-ресурсу, а затем с помощью многочисленных строковых функций получить интересующею нас ее часть. Эта технология вполне работает, но довольно трудоемкая и, в большинстве случаев далека от элегантности. Другой путь - использование функциональности Microsoft Internet Explorer. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]1285.7%
 
  Ничего особенно нового и интересного
[2]214.3%
 
  Написано неверно (обязательно укажите почему)
[3]00%
 
Всего проголосовали: 14

Оценка стиля изложения

  Все понятно, материал читается легко
[1]1076.9%
 
  Есть неясности в изложении
[2]215.4%
 
  Непонятно написано, трудно читается
[3]17.7%
 
Всего проголосовали: 13




Смотрите также материалы по темам:
[TWebBrowser] [Интеграция с Internet Explorer]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 15

11-01-2009 08:32
Оно конечно может и общеизвестные вещи, но нормальным языком. Я уже пробовал вникнуть, что такое интерфейсы, но только сейчас вот думаю, что понял. ;)


08-01-2009 14:30
Ну и замечание!!!
Да ради нескольких стоящих моментов иногда толстую книгу можно купить.


08-01-2009 07:29
В основном общеизвестные вещи, только некоторые детали стоят внимания.


28-11-2006 04:21
Ссылки на примеры исправлены


28-11-2006 03:50
примеры не скачиваются
http://delphi.mtu-net.ru/zip/example2.zip


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
Отличный и понятный материал. Это не исходник со скудными комментариями, а полноценная статья, содержащая необходимую теоритическую информацию. ОГРОМНОЕ спасибо автору!
 zlo


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
 vadi


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;

 vadi


01-03-2001 11:49
С нетерпением жду продолжения материала...


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Какой месяц идет после марта?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования