本文整理自网络,侵删。
有时,由于软件的特殊需要,我们希望DELPHI在WebBrowser或embeddedwb里动态更改返回的数据内容,而这需要返回网页的所有原始源码,包括网页开始的DOCTYPE html PUBLIC声明部分,仅仅使用mshtml是无法实现的,需要用到数据流的方法。
具体执行方法如下(需要 uses mshtml,activex):
procedure TForm1.Button1Click(Sender: TObject);vars:string;ms: TMemoryStream;StrStream:TStringStream;begin //先读取到流中,暂存于memo1 if not Assigned(embeddedwb1.Document) then Exit; ms := TMemoryStream.Create; (embeddedwb1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(ms), True); ms.Position := 0; Memo1.Lines.LoadFromStream(ms); ms.Free;
//再从流中取出数据输出 s := memo1.text; //执行替换部分代码 s:=StringReplace(s,'_blank','_self',[rfReplaceAll,rfIgnoreCase]); StrStream:=TStringStream.Create(s); try StrStream.Position:=0; (embeddedwb1.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream)); finally StrStream.Free; end; end;
通过以上转换,可以实现无损式的动态修改网页源码,保证css格式。
但存在一个问题,比如原始的网页的uri为 http://www.piaoyi.org,经过上面的数据流处理后,网页的url变成了 about:blank ,这就使得网页里采用相对路径的文件,如 images/piaoyi.gif 的路径发生了错误,即变成了 about:blankimages/piaoyi.gif ,明显这是路径错误。解决的方法,就是替换所有相对路径为绝对路径。方法就是再html代码前加上这么一句:<base href="http://www.piaoyi.org">
另外,还有一种方法可以动态的写入源码到 webbrowser 或 embeddedwb 里,如下:
procedure TForm11.Button1Click(Sender: TObject);var v:OleVariant; HTMLDocument:ihtmldocument2;begin HTMLDocument := EmbeddedWB1.Document as IHTMLDocument2; v := VarArrayCreate([0, 0], varVariant); v[0] := '这里写入html代码'; HTMLDocument.Write(PSafeArray(TVarData(v).VArray)); HTMLDocument.Close;end;
相关阅读 >>
Delphi webbrowser通过遍历id查找元素是否存在
Delphi dateutils.ispm - 判断时间是否是下午
Delphi xe8在firemonkey tlistbox中显示图像
检查是否在Delphi xe7中启用或禁用了android蓝牙
更多相关阅读请进入《Delphi》频道 >>