![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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