HTML Rendering without needing the source written to a file.

Hi,

I'm looking for a quick and easy way to render html code that doesn't need to me actually have the code saved in a file. The IE wrapper component doesn't seem to be able to do this and the htmlayout component/engine seems to actually be missing more of the S outta the SDK, (By which I mean they don't actually distribute any source except the example apps, as far as I can see), and I'm not sure whether it can do this or not. Any ideas on how to manage this?

Otherwise, what would be the best way to manage this?

I'd prefer not to have it stored in a file as the code would be being edited (although not quite literally on the fly)

Incidentally, I'm using Delphi7.
marajinAsked:
Who is Participating?
 
Russell LibbyConnect With a Mentor Software Engineer, Advisory Commented:
The IE wrapper can do this for you....

// Procedure to load you browser component using text
procedure LoadHtml(Browser: TWebBrowser; Html: String);
var
  V, vDocument, vMIMEType, vHTML: OleVariant;
begin

  if Assigned(Browser) then
  begin
     Browser.Stop;
     V:=Browser.Document;
     if (VarType(V) = varDispatch) then
     begin
        vDocument:=V.Script.Document;
        vMIMEType:='text/html';
        vHTML:=Html;
        vDocument.Open(vMIMEType);
        vDocument.Clear;
        vDocument.Write(vHTML);
        vDocument.Close;
     end;
  end;

end;

// Example usage
procedure TForm1.Button1Click(Sender: TObject);
begin

  LoadHtml(WebBrowser1, '<html>This is a test</html>');

end;

------------

Regards,
Russell

0
 
marajinAuthor Commented:
Well... I do feel the idiot...

But fair enough, you pointed out the way and your code works perfectly, so the points go to you :)

Thanks!
0
 
marajinAuthor Commented:
A quick additional if you don't mind...

The webbrowser grabs focus if you click on it (Unsurprisingly), however if you go back to the code editor and hit a couple of keys, all keys after the first will be intercepted by the browser.

That is to say, if for example I scroll down the page in the browser, then go back to my editor and type "wibble" in, W gets put in the code but all after that is sent to the browser instead of my code editor.
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
Russell LibbySoftware Engineer, Advisory Commented:

It most likely has to do with what you are loading, as I can't reproduce the problem that you are having.

If you could show me the html code that produces this behavior (just enough so that the behavior is displayed would be fine) then I would be willing to take a look at it for you.

Regards,
Russell
 
0
 
marajinAuthor Commented:
I don't think it's my HTML code, as it occurs with any of a number of totally different pages.

It's much more likely to do with the way I've laid out the WebBrowser and code editor. They both sit on a single MDI child, seperated by a splitter. I'm currently feeding the browser the updated document with the editor's OnChange event. Less than the best way to do it, I know, but I wanted to see how it handled effective "realtime" modification.

I can pin down what causes the issue, but not what relieves it. Any form of action towards the web browser will cause it to keep stealing the keyboard input, but sometimes it seems to give up and leaves the editor to take the keyboard input. The most repeatable way of making the browser relinquish control is to scroll the editor up and down a bit then select a point in the text/code. This only works sometimes however.
0
 
Russell LibbySoftware Engineer, Advisory Commented:
Thanks for the explanation, makes much more sense now... (OnChange firing)

And it is, to some degree, html dependant. By that I mean that the display has some kind of input field/button/etc control in it. If the display is just a textual rendering then this does not happen (thus I wasn't able to reproduce at first).
Regardless, the following should resolve your problem; let me know if it does not.

Russell

-------

procedure LoadHtml(Browser: TWebBrowser; Html: String);
var
  V, vDocument, vMIMEType, vHTML: OleVariant;
  hwndActive:    HWND;
begin

  hwndActive:=GetFocus;
  if Assigned(Browser) then
  begin
     Browser.Stop;
     V:=Browser.Document;
     if (VarType(V) = varDispatch) then
     begin
        vDocument:=V.Script.Document;
        vMIMEType:='text/html';
        vHTML:=Html;
        vDocument.Open(vMIMEType);
        vDocument.Clear;
        vDocument.Write(vHTML);
        vDocument.Close;
     end;
  end;
  SetFocus(hwndActive);

end;


0
 
marajinAuthor Commented:
It won't even compile, telling me that it's passing too many parameters to SetFocus. Do I need to include an additional unit to get an overloaded procedure?
0
 
Russell LibbySoftware Engineer, Advisory Commented:

What version of Delphi are you using, and have you declared this procedure as part of the form? Basically it boils down to a namespace conflict, as TWinContols have a SetFocus method associated with them, when what you are after is the windows api SetFocus.

So change the line to the full namespace qualification

Windows.SetFocus(hwndActive);

----

Russell
0
 
marajinAuthor Commented:
Ok :) That works great now as far as I can tell, thanks.

But by the by, I'm using Delphi 7, and the procedure is delared as part of the form yes.
0
 
Russell LibbySoftware Engineer, Advisory Commented:
Namespace conflict, simple name resolution is all that was needed...

Let me know if you have further problems (regarding the focus ;-),
Russell
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.