We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

HTML Rendering without needing the source written to a file.

marajin
marajin asked
on
Medium Priority
521 Views
Last Modified: 2010-04-05
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.
Comment
Watch Question

Software Engineer, Advisory
CERTIFIED EXPERT
Top Expert 2005
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Author

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!

Author

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.
Russell LibbySoftware Engineer, Advisory
CERTIFIED EXPERT
Top Expert 2005

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
 

Author

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.
Russell LibbySoftware Engineer, Advisory
CERTIFIED EXPERT
Top Expert 2005

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;


Author

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?
Russell LibbySoftware Engineer, Advisory
CERTIFIED EXPERT
Top Expert 2005

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

Author

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.
Russell LibbySoftware Engineer, Advisory
CERTIFIED EXPERT
Top Expert 2005

Commented:
Namespace conflict, simple name resolution is all that was needed...

Let me know if you have further problems (regarding the focus ;-),
Russell
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.