• 动态更改WebBrowser数据流内容


    动态更改WebBrowser数据流内容

     

        有时,由于软件的特殊需要,我们希望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;
     
  • 相关阅读:
    第 17 章 责任链模式【Chain of Responsibility Pattern】
    第 16 章 观察者模式【Observer Pattern】
    第 15 章 组合模式【Composite Pattern】
    第 14 章 迭代器模式【Iterator Pattern】
    第 13 章 装饰模式【Decorator Pattern】
    第 12 章 命令模式【Command Pattern】
    第 11 章 桥梁模式【Bridge Pattern】
    第 10 章 建造者模式【Builder Pattern】
    编写高质量代码改善C#程序的157个建议——导航开篇
    C#实现简易ajax调用后台方法
  • 原文地址:https://www.cnblogs.com/honeynm/p/4169657.html
Copyright © 2020-2023  润新知