Cry about...
Delphi Programming with TWebBrowser

Example of how to call the W3C HTML validator from TWebBrowser

The following code sample was kindly provided to me by Anthony Naylon.
It illustrates how to pass a block of HTML to the W3C HTML validator. It
uses many of the ideas found in "How to read and write form elements".

Using a TWebBrowser component this example performs all of the steps
necessary to upload an HTML document to the
W3C HTML validator and display
the returned HTML results page. This procedure automates the process of
manually pasting the HTML code (stored in the variable "html_code") into
the form field "Validate by Direct Input" and pressing the button
"Check".

An alternative would be to paste the name of the local HTML file to
be validated into the field "Validate by File Upload". This is not
possible to automate, however, because this field is of the type "file",
which for security reasons blocks any attempt to programmatically upload
a file.

After this procedure is executed, the form containing the TWebBrowser
is shown.

procedure validate_html(const html_code : string);
var d : ihtmldocument2; // Document
f : ihtmlformelement; // Form
begin
screen.cursor := crhourglass;
webbrowser.navigate('http://validator.w3.org/');// Wait until the validation input form is loaded
while webbrowser.ReadyState < READYSTATE_INTERACTIVE do
begin Sleep(5);
Application.ProcessMessages; end;// Get the document that is contained in "webbrowser"
d := webbrowser.document as ihtmldocument2;// Get the document form (third form, so number = 2)// that contains the field that we want to fill
f := (d.forms as ihtmlelementcollection).item(2,'') as ihtmlformelement;// Fill the textarea field "Validate by Direct Input", which is// called "fragment" in the Web page HTML, with the HTML code
(f.item('fragment','') as ihtmltextareaelement).value := html_code;// Submit the form
f.submit;// Wait until the validation results are loaded
while webbrowser.ReadyState < READYSTATE_INTERACTIVE do
begin Sleep(5);
Application.ProcessMessages; end;
screen.cursor := crdefault;
end;

If you use this code sample I suggest adding a call to Sleep(5) in
both of the while loops - this stops the code from being processor bound
and the user is unlikely to notice a delay of a few milliseconds.

These notes are believed to be correct for Delphi 7 and
may apply to other versions as well.

About the author: Brian Cryer
is a dedicated software developer and webmaster. For his day job he
develops websites and desktop applications as well as providing
IT services. He moonlights as a technical author and consultant.