Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TWebBrowser спотыкается на <SCRIPT>, если не задан ParentWindow


evvcom ©   (2006-05-15 00:29:00) 

Решил помучить всем известный IE, т.е. распарсить HTML без отображения IE. Таким образом ParentWindow не задается. И вот что обнаружил. У меня IE 6.0.2800.1106.xpsp2. Как только встречается тег <SCRIPT>, у IE "сносит крышу", по другому назвать это не могу. Т.е. этот скрипт в документе становится последним, что IE разобрал и принял. Кстати, попробовал сейчас свой тестовый пример на mail.ru натравить, оказалось, что и от <LINK> IE не в восторге.
Итак, тестовый пример:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   WebBrowser: TWebBrowser;
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   Memo1: TMemo;
   TabSheet3: TTabSheet;
   Memo2: TMemo;
   Button4: TButton;
   TabSheet4: TTabSheet;
   Edit1: TEdit;
   Button5: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
 private
   { Private declarations }
   WebBrowser1: TWebBrowser;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 WebBrowser1 := TWebBrowser.Create(Self);
 WebBrowser1.Navigate('about:blank');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Document: IHTMLDocument2;
 V: OleVariant;
begin
 PageControl1.ActivePage := TabSheet1;
 WebBrowser.Navigate(Edit1.Text);
 // Без отображения (пусть даже в невидимом окне)
 // WebBrowser1 спотыкается на тегах <SCRIPT>
 // WebBrowser1.ParentWindow := TabSheet4.Handle; // Раскомментируем и все ОК
 WebBrowser1.Navigate(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 Document: IHTMLDocument2;
 Collection: IHTMLElementCollection;
 Element: IHTMLElement;
begin
 PageControl1.ActivePage := TabSheet1;
 // Этот метод модифицирует текст документа при помощи DHTML
 Document := WebBrowser.Document as IHtmlDocument2;
 Collection := Document.all;
 Collection := Collection.Tags('BODY') as IHTMLElementCollection;
 Element := Collection.Item(NULL, 0) as IHTMLElement;
 Element.InnerText := 'Modifyed by DHTML';

 Document := WebBrowser1.Document as IHtmlDocument2;
 Collection := Document.all;
 Collection := Collection.Tags('BODY') as IHTMLElementCollection;
 Element := Collection.Item(NULL, 0) as IHTMLElement;
 if Assigned(Element) then
   Element.InnerText := 'Modifyed by DHTML';
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 Document: IHTMLDocument2;
begin
 PageControl1.ActivePage := TabSheet2;
 // Этот метод позволяет просмотреть в TMemo код HTML
 // документа из TWebBrowser
 Document := WebBrowser.Document as IHtmlDocument2;
 Memo1.Text := ((Document.all.tags('HTML') as IHTMLElementCollection).Item(0, 0)
   as IHTMLElement).OuterHTML;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
 Document: IHTMLDocument2;
begin
 PageControl1.ActivePage := TabSheet3;
 // Этот метод позволяет просмотреть в TMemo код HTML
 // документа из TWebBrowser
 Document := WebBrowser1.Document as IHtmlDocument2;
 Memo2.Text := ((Document.all.tags('HTML') as IHTMLElementCollection).Item(0, 0)
   as IHTMLElement).OuterHTML;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 WebBrowser1.ParentWindow := TabSheet4.Handle;
 TabSheet4.TabVisible := True;
end;

end.


evvcom   (2006-05-15 00:41:00) [1]

Теперь описание действий:

Жмем кнопку Load, загружается страничка в 2 броузера, один на закладке WebBrowser, другой не отображается. Кнопками HTML1 и HTML2 смотрим тексты в этих броузерах и видим разницу, что во 2-ом текст отображается некорректно. Если 2-му IE зададим ParentWindow (кнопка Parent), то IE после этого "корректирует свое понимание" загруженного (жмем еще раз HTML2).
Так вот, все бы ничего, задал бы ему родителя и делов-то, но надо парсер IE заставить работать в доп.потоке, а потому ни о каком "отображении" речи идти не может.
Кто-нибудь сталкивался с подобным? Может есть какой способ заставить IE выполнить те "магические" операции, которые он выполняет перед отображением для правильного понимания содержания документа?


evvcom   (2006-05-15 00:31:00) [2]

Форма:

object Form1: TForm1
 Left = 234
 Top = 114
 Width = 783
 Height = 540
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 232
   Top = 4
   Width = 75
   Height = 25
   Caption = 'Load'
   TabOrder = 0
   OnClick = Button1Click
 end
 object Button2: TButton
   Left = 316
   Top = 4
   Width = 75
   Height = 25
   Caption = 'Change'
   TabOrder = 1
   OnClick = Button2Click
 end
 object Button3: TButton
   Left = 400
   Top = 4
   Width = 75
   Height = 25
   Caption = 'HTML1'
   TabOrder = 2
   OnClick = Button3Click
 end
 object PageControl1: TPageControl
   Left = 0
   Top = 36
   Width = 775
   Height = 470
   ActivePage = TabSheet1
   Align = alBottom
   Anchors = [akLeft, akTop, akRight, akBottom]
   TabOrder = 3
   object TabSheet1: TTabSheet
     Caption = 'WebBrowser'
     object WebBrowser: TWebBrowser
       Left = 0
       Top = 0
       Width = 767
       Height = 442
       Align = alClient
       TabOrder = 0
     end
   end
   object TabSheet2: TTabSheet
     Caption = 'HTML1'
     ImageIndex = 1
     object Memo1: TMemo
       Left = 0
       Top = 0
       Width = 767
       Height = 442
       Align = alClient
       Lines.Strings = (
         'Memo1')
       TabOrder = 0
     end
   end
   object TabSheet3: TTabSheet
     Caption = 'HTML2'
     ImageIndex = 2
     object Memo2: TMemo
       Left = 0
       Top = 0
       Width = 767
       Height = 442
       Align = alClient
       Lines.Strings = (
         'Memo2')
       TabOrder = 0
     end
   end
   object TabSheet4: TTabSheet
     Caption = 'TabSheet4'
     ImageIndex = 3
     TabVisible = False
   end
 end
 object Button4: TButton
   Left = 484
   Top = 4
   Width = 75
   Height = 25
   Caption = 'HTML2'
   TabOrder = 4
   OnClick = Button4Click
 end
 object Edit1: TEdit
   Left = 4
   Top = 4
   Width = 221
   Height = 21
   TabOrder = 5
   Text = ' http://www.test.com/index.htm'
 end
 object Button5: TButton
   Left = 568
   Top = 4
   Width = 75
   Height = 25
   Caption = 'Parent'
   TabOrder = 6
   OnClick = Button5Click
 end
end


Наверх

Титульная страница Поиск, карта сайта Написать письмо