2010-03-20 68 views
0

如何在MSHTML中设置整个HTML?如何在MSHTML中设置整个HTML?

我使用这个任务努力:

(Document as IHTMLDocument3).documentElement.innerHTML := 'abc'; 

,但我得到了错误:

"Target element invalid for this operation"

我使用

(Document as IHTMLDocument2).write 

也试过,但这种形式只能增加HTML进入正文部分,我需要替换所有的HTML源代码。
有人知道我是如何做到这一点的?

在此先感谢。

回答

1

下面是我的一些旧代码,看看它是否可以帮助你:

type 
    THackMemoryStream = class(TMemoryStream); 

procedure Clear(const Document: IHTMLDocument2); 
begin 
    Document.write(PSafeArray(VarArrayAsPSafeArray(VarArrayOf([WideString('')])))); 
    Document.close; 
end; 

procedure LoadFromStream(const Document: IHTMLDocument2; Stream: TStream); 
var 
    Persist: IPersistStreamInit; 
begin 
    Clear(Document); 
    Persist := (Document as IDispatch) as IPersistStreamInit; 
    OleCheck(Persist.InitNew); 
    OleCheck(Persist.Load(TStreamAdapter.Create(Stream))); 
end; 

procedure SetHtml(const Document: IHTMLDocument2; const Html: WideString); 
var 
    Stream: TMemoryStream; 
begin 
    Stream := TMemoryStream.Create; 
    try 
    THackMemoryStream(Stream).SetPointer(PWideChar(Html), (Length(Html) + 1) * SizeOf(WideChar)); 
    Stream.Seek(0, soFromBeginning); 
    LoadFromStream(Document, Stream); 
    finally 
    Stream.Free; 
    end; 
end; 
+0

Thaks。它工作完美。 – 2010-03-22 11:59:07

+0

清除文档的正确方法是将导航()改为“about:blank”。 – 2010-03-24 10:11:36

+0

Navigate的问题在于它是异步的,因此您必须记住/替换相应的事件处理程序,并在稍后恢复它,这似乎是错误的。我承认我没有广泛地测试上述Clear程序。它有问题吗?另一种选择可能是从一个空的(或最小的html字符串)流加载。 – 2010-03-24 10:22:50

0

作为替代方案,你也可以使用TEmbededWB是围绕Web浏览器的扩展包装,并有一些易于使用的提供方法这个功能。

相关问题