Mr. Script

Getting Creative with HTAs

Chris shows how you can take your HTAs one step further.

Over the past two months [see "Going Hyperactive," Jan. 2005, and "An HTA Reality Check," Feb. 2005], I’ve given you a crash course on the world of HTML applications (HTAs). We’ve covered most of the basics, and I hope you’ve gained a foundation of knowledge upon which you can build. Before we move on to other topics, let’s look at some additional areas where HTAs really shine.

Because HTAs are HTML, they’re excellent at displaying data in a variety of formats. You can display text in numerous fonts and with many styles, such as bold, italics, superscript and so on. You can also display data in a formatted table. Because our HTA example from last month dealt with adding data to an Access database, it seems fitting to demonstrate how to display that data properly within an HTA. At the same time, you’re going to learn how to dynamically populate HTA objects.

Our script from last month created a database of computer names and IP addresses. These were originally hard-wired into the script code. As promised, I’ve added the ability to enter records into the database. We’ll start by using the FileSystemObject (objFSO) to collect the names of valid computers from a text file. Once a valid computer is selected, it will prompt the user to enter the IP address. While this may be a bit of a stretch in terms of how we would actually accomplish this particular scripting task in real life, it does have the advantage of demonstrating the technique for dynamically populating a dropdown box.

Let’s Get Going
Because we’re now manually populating the database, the first change is to remove the AddData button and replace it with a DropDown list object.

Remove this:

<input id=AddDataButton
value="Add Data"

And replace it with this:

<select <br>
size="1" <br>

Because we’ve removed an object, we need to make sure we go through all the Subs and change any reference to the AddDataButton to point to Computers.

The next thing we need to change is the Sub Window_Onload. We’ve entered the names of valid computers in a text file called computers.txt and saved it to the root of C:\. Now, when the script is run, the Window_Onload Sub—in addition to resizing the window and disabling certain objects—retrieves the list from this file and populates a DropDown list for us.

Sub Window_Onload
self.ResizeTo 640,480
Set objFSO = _
Set objFile = _
objFSO.OpenTextFile("c:\computers.txt", 1)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
Set objOption = _
objOption.Text = strLine
objOption.value = strLine
Set objFIle=Nothing
Set objFSO=Nothing
End Sub

Finally, we need to change the Sub AddData to let users specify an IP address for the computer selected from the DropDown list. And yes, it will allow for more than one IP entry per computer just like NT does.

Sub AddData
strIPAddr=window.prompt _
("Enter the computer’s IP address", "")
If IsNull(strIPAddr) Then Exit Sub
If strIPAddr=Empty Then Exit Sub

Const adOpenStatic=3
Const adLockOptimistic=3
Set objConn=CreateObject("ADODB.Connection")
Set objRS=CreateObject("ADODB.Recordset")
objConn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source="
& DBActive.InnerHTML
objRS.Open _
"SELECT * FROM " & DBTable.InnerHTML , _
objConn, adOpenStatic, adLockOptimistic


strHTML = "<table border='1' " & _
"style='border-collapse: collapse' " & _
"bgcolor='white' bordercolor='black' " & _
"width='50%' id='Table1' >"
Do Until objRS.EOF
strHTML = strHTML & "<tr> </tr> <tr>"
strHTML = strHTML & "<td width='500'>" & _
objRS.Fields.Item("Computername") & "</td>"
strHTML = strHTML & "<td width='300'>" & _
objRS.Fields.Item("IPAddress") & "</td>"
strHTML = strHTML & "</tr>"
strHTML = strHTML & "</table> "

Set objRS=Nothing
Set objConn=Nothing
End Sub

Every time we add a pair of computer and IP addresses, the record set is refreshed and the data is reloaded into the table. Therefore, the display is constantly updated with current information. This involves recreating the table each time. Again, in the real world, this is not the most suitable solution. As the database grows in size, performance decreases. We do it here simply to demonstrate the technique of dynamically creating a table.

Extracurricular Activity
Other interesting functions available to HTAs include accessing the Print dialog, entering masked passwords, changing the cursor and more. You can even have an HTA reload itself, thereby resetting all default values. I encourage you to spend some time experimenting with HTAs, and see how many useful gems you can find.

More Information

Click here to download the entire script in a .txt document.

About the Author

Chris Brooke, MCSE, is a contributing editor for Redmond magazine and director of enterprise technology for ComponentSource. He specializes in development, integration services and network/Internet administration. Send questions or your favorite scripts to

comments powered by Disqus

Reader Comments:

Tue, Sep 12, 2006 Diane VA

Hello Mr. Script,
First off, I just want to say thank you for creating this column…IT HAS SAVED ME A LOT OF WORK!!!!

The question I have is about your column on "An HTA Reality Check" and "Getting Creative with HTA's".

I'm trying to put together the whole script - creating a database of IP addresses that our remote users can use when they dock to our different stores. But, I'm just not getting it…

I am "super" new to scripting, I only use them to install printers and small applications. This is a major one for me…Also, am I supposed to save the script as .vbs?

Any help from you is greatly appreciated!!!

P.S. I can't download the .txt file link you have posted under the "Getting Creative…" column.

Thank You!

Wed, Mar 16, 2005 jv NJ

Very Nice.
I downloaded it and jumped right into my MS script debugger. Made a couple of quick edits and had a db. Now you need to dump the text file and search the local segment for computers - or the domain.

Add Your Comment Now:

Your Name:(optional)
Your Email:(optional)
Your Location:(optional)
Please type the letters/numbers you see above

Redmond Tech Watch

Sign up for our newsletter.

I agree to this site's Privacy Policy.