频道分类

Delphi 动态更改WebBrowser数据流内容

作者:admin 来源: 日期:2019/10/18 12:21:01 人气: 标签:

 
 有时,由于软件的特殊需要,我们希望DELPHI在WebBrowser或embeddedwb里动态更改返回的数据内容,而这需要返回网页的所有原始源码,包括网页开始的DOCTYPE html PUBLIC声明部分,仅仅使用mshtml是无法实现的,需要用到数据流的方法。
 

    具体执行方法如下(需要 uses mshtml,activex):
 

procedure TForm1.Button1Click(Sender: TObject);
var
s: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;