Link to home
Start Free TrialLog in
Avatar of marajin
marajin

asked on

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.
ASKER CERTIFIED SOLUTION
Avatar of Russell Libby
Russell Libby
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of marajin
marajin

ASKER

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!
Avatar of marajin

ASKER

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.

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
 
Avatar of marajin

ASKER

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.
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;


Avatar of marajin

ASKER

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?

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
Avatar of marajin

ASKER

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.
Namespace conflict, simple name resolution is all that was needed...

Let me know if you have further problems (regarding the focus ;-),
Russell