2011. május 22., vasárnap

Load a stream containing HTML code into a TWebBrowser


Problem/Question/Abstract:

How to load a stream containing HTML code into a TWebBrowser

Answer:

Solve 1:

Imagine, you want to load a html document into the browser, that is not available as a file on your hard disk, but linked as a resource into your application.

You can use TResourceStream to make the data accessible for Delphi. But how to get the data into your WebBrowser? HTML documents implement the IPersistentStreamInit - interface, what means they support standard methods to accept data from any kind of stream or write data to any kind of stream.

uses ActiveX;

{Loads the contents of the "Stream" into the "WebBrowser"
"Stream" should contain HTML code}

procedure LoadStream(WebBrowser: TWebBrowser; Stream: TStream);
var
  PersistStreamInit: IPersistStreamInit;
  StreamAdapter: IStream;
  MemoryStream: TMemoryStream;
begin
  {Load empty HTML document into Webbrowser to make "Document" a valid HTML document}
  WebBrowser.Navigate('about:blank');
  {wait until finished loading}
  repeat
    Application.ProcessMessages;
    Sleep(0);
  until
    WebBrowser.ReadyState = READYSTATE_COMPLETE;
  {Get IPersistStreamInit - Interface}
  if WebBrowser.Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK then
  begin
    {Clear document}
    if PersistStreamInit.InitNew = S_OK then
    begin
      {Make local copy of the contents of Stream if you want to use Stream directly,
                        you have to consider, that StreamAdapter will destroy it automatically}
      MemoryStream := TMemoryStream.Create;
      try
        MemoryStream.CopyFrom(Stream, 0);
        MemoryStream.Position := 0;
      except
        MemoryStream.Free;
        raise;
      end;
      {Use Stream-Adapter to get IStream Interface to our stream}
      StreamAdapter := TStreamAdapter.Create(MemoryStream, soOwned);
      {Load data from Stream into WebBrowser}
      PersistStreamInit.Load(StreamAdapter);
    end;
  end;
end;

{Let's test. You could also create a TResourceStream or TFileStream etc. here.}

procedure TForm1.Button2Click(Sender: TObject);
var
  S: TStringStream;
begin
  {To use this code, replace [ ] brackets with <> ones in the following two lines !}
  S := TStringStream.Create('[html][h1]Stream Test[/h1][p]This HTML content ' +
    'is being loaded from a stream.[/html]');
  try
    LoadStream(WebBrowser1, S);
  finally
    S.Free;
  end;
end;


Solve 2:

///////Begin Source
uses ActiveX;

function ShowHtml(mWebBrowser: TWebBrowser; mStrings: TStrings): Boolean;
var
  vMemoryStream: TMemoryStream;
begin
  Result := False;
  if not (Assigned(mStrings) and Assigned(mWebBrowser)) then
    Exit;
  mWebBrowser.Navigate('about:blank');
  if not Assigned(mWebBrowser.Document) then
    Exit;
  vMemoryStream := TMemoryStream.Create;
  try
    mStrings.SaveToStream(vMemoryStream);
    try
      vMemoryStream.Position := 0;
      Application.ProcessMessages; // :)
      (mWebBrowser.Document as IPersistStreamInit).Load(
        TStreamAdapter.Create(vMemoryStream));
    except
      Exit;
    end;
  finally
    vMemoryStream.Free;
  end;
  Result := True;
end; { ShowHtml }
///////End Source

///////Begin Demo

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowHtml(WebBrowser1, Memo1.Lines);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text :=
    ''#13#10 +
    'Hello Worlds!'#13#10 +
    ''#13#10;
end;
///////End Demo


Solve 3:

procedure AssignDocument(Browser: TWebBrowser; Text: string);
var
  Document: OleVariant;
{$IFDEF PERSIST_STREAM}
  InStream: TStream;
  Persist: IPersistStreamInit; {Declared in ActiveX}
{$ENDIF}
begin
{$IFDEF WRITE_FILE}
  Document := LocalServerPath('temp.html');
  WriteTextFile(Document, Text); {utility function}
  Browser.Navigate2(Document);
{$ENDIF}
{$IFDEF PERSIST_STREAM}
  Document := 'about:blank';
  Browser.Navigate2(Document);
  InStream := TStringStream.Create(Text);
  try
    Persist := (Browser.Document as IPersistStreamInit);
    Persist.Load(TStreamAdapter.Create(InStream));
  finally
    InStream.Free;
  end;
{$ENDIF}
{$IFDEF DISPATCH_DOC}
  Document := 'about:blank';
  Browser.Navigate2(Document);
  Document := Browser.Document as IDispatch;
  Document.Open;
  try
    Document.Write(Text);
  finally
    Document.Close;
  end;
{$ENDIF}
end;

Nincsenek megjegyzések:

Megjegyzés küldése