... ..

The EnterPage

The Source for ToolBook and VBTrain.Net News
November 21, 2002
Issue 6-01

... From Platte Canyon Multimedia Software Corporation.

In This Issue


Top Stories
New LMS: Tracker.Net - Easy, Powerful, and Affordable
Speaking of LMS: Introducing the LmsApi Object
Training Classes on ToolBook and VBTrain.Net: Best Deals Ever
Price Reduction on "Learning & Mastering ToolBook" CDs
"Learning & Mastering" CDs Now Available Worldwide From Platte Canyon

ToolBook Tips and News
Plug-In Pro Tool Spotlight: Options Secrets
Expert Information from the "Learning & Mastering ToolBook" Series
OpenScript Tip from Jeff Rhodes
Actions Editor Tip by Cindy Kessler
The ToolBook Listserv
The ToolBook Webring

VBTrain.Net Tips and News
VBTrain.Net Tidbit from Jeff Rhodes
The VBTrain.Net Listserv

More News and Information
Conference Reviews and Previews
Platte Canyon Products in the Pipeline
e-Learning Creation Tip from Chris Bell: The Joys of Data Backup
Coming in the Next Issue of The EnterPage
Information on Subscriptions and Article Submissions



Man do I feel great! There is nothing more uplifting than holding a training class with a group that is fun, genuinely kind, and really interested in ToolBook. Last week we had a class just like that. In fact, it seems that every time I teach a ToolBook training class, it is filled with great people. Jeff has had similar experiences with his VBTrain.Net classes. The yearly conference is more of the same. You all are great!

At Platte Canyon, we're happy to serve the community by taking over the ToolBook Listserv next month. You'll see more on this below.

We're also very excited because we have just released a brand new Learning Management System that works with ToolBook's DHTML content. Because it works with any content that implements the SCORM Runtime Environment, it also supports content created with other tools as well!

We also have a ton of other products and news in this issue. So let's get on with the content!

Back to Top


Top Stories

New LMS: Tracker.Net - Easy, Powerful, and Affordable

At Platte Canyon, we’ve wanted to write a web-based Learning Management System (LMS) for many years. But frankly, we didn’t have the tools or the skill sets to do it right. But a funny thing happened on the way to the LmsApi object (see the following article). We needed to create a small test LMS to see if the LmsApi was properly interacting with a LMS. As often happens, Jeff got carried away. The next thing you know, he called up Chris and Cindy with the idea of writing a full-fledged product. Tracker.Net was born.

Tracker.Net uses ASP.NET, Web Services, and SQL Server to implement both the mandatory and optional aspects of the Sharable Content Object Reference Model (SCORM™) Runtime Environment 1.2 specification (see http://www.adlnet.org for more details). We’ve kept most of the popular features of our existing Tracker products for ToolBook while creating an industrial strength LMS that can be used with all flavors of content (e.g., ToolBook, Flash, ASP.NET).

Pricing is $5,995 for up to 500 users and $8,995 for unlimited users. This pricing is for a single web site with up to five databases per license. A list of system requirements, a live version of Tracker.Net, and more information is available at:


Back to Top

Speaking of LMS: Introducing the LmsApi Object

While Tracker.Net gives an exciting new solution for launching and interacting with SCORM content, it can be difficult to create this content in the first place. ToolBook (and to a lesser extent, Flash and Dreamweaver) does a good job of making the various JavaScript calls required by the SCORM Runtime Environment specification. But what if you wanted to create your content in ASP.NET? That was not easy, particularly due to the fact that all communication with the LMS is via client-side JavaScript rather than server-side Visual Basic (or C# for you code jockeys).

To make this process MUCH easier, we created the LmsApi object ($245). After referencing it in your ASP.NET application, you call its methods to automatically generate the appropriate SCORM calls. For example, here’s what the server-side code looks like to find the SCORM API object and send the initialization messages to the LMS:

apiObject = New LmsApi()
apiObject.Enabled = True
Me.LmsApiObject = apiObject

js = apiObject.GetJsApiLocate()
Me.RegisterClientScriptBlock("apiLocate", js)

js = apiObject.GetJsInitialize(True)
If js <> "0" Then		  ' not yet initialized
	Me.RegisterClientScriptBlock("apiInitialize", js)
End If

Similar calls allow you to generate the JavaScript to read values from the LMS, set new values, exit, and more.

More information is available at:

Back to Top

Price Reduction on "Learning & Mastering ToolBook" CDs

All "Learning & Mastering ToolBook" Training CDs are now at a lower price. Take advantage of the best deal ever!

Instructor 8 Training CD for $495 (previously $695)
Instructor 7 Training CD for $375 (previously $495)
Instructor 6 Training CD for $225 (previously $295)

Assistant 8 Training CD for $375 (previously $495)
Assistant 7 Training CD for $265 (previously $350)

Here are a couple of recent unsolicited posts from the ToolBook List about the Learning & Mastering ToolBook series:

"The Platte Canyon Learning and Mastering is probably the most interactive bit of multimedia training I've ever experienced."

"The Learning and Mastering ToolBook Instructor CD's from Platte Canyon are very good. After spending the time going through the CD, a couple of days, you should be able to develop ToolBook apps. Plus, the CD was built with ToolBook, so you can open tbk file in Instructor and see how the course itself was built and works."

More information is available at:


Back to Top

Learning & Mastering CDs Now Available Worldwide From Platte Canyon

All Platte Canyon training CDs may now be purchased directly from Platte Canyon regardless of where the CD is shipped. This means that our friends on every continent may now order directly from Platte Canyon. Visit our online store at:


Back to Top

Learning & Mastering CDs Now Available Worldwide From Platte Canyon

All Platte Canyon training CDs may now be purchased directly from Platte Canyon regardless of where the CD is shipped. This means that our friends on every continent may now order directly from Platte Canyon. Visit our online store at:


Back to Top


ToolBook Tips and News

Plug-In Pro Tool Spotlight: Options Secrets

by Chris Bell

For this issue of the Enter Page, I thought I'd share some lesser-known features that come with Plug-In Pro's seemingly endless set of tools that are available via custom menu or customizable toolbars. Let's talk about some of the Plug-In Pro Options.

Graphic Paste

When pasting from PhotoShop 6 or 7 for example, graphics are pasted as TB Pictures. One would think that they would come is as Paint Objects since Photoshop works primarily with bitmap (raster) images. Well, if you want all of your graphics to be pasted as Paint Objects, just choose the "Paste as Bitmap" feature and you're all set. No more settings to ever choose.

Text Paste
When pasting text into a ToolBook field from a word processor, it may very well come in formatted. Even though your field is set to show Arial 14, the text you copied could paste into the field as Times New roman 10. Just check Plug-In Pro's "Paste all text as Unformatted" box and this problem goes away.

Show Actions Editor Properties
This advanced feature lets you see the actual Actions Editor properties when you view the Properties Browser. Ever wonder what you were really setting when you were assigning actions? Just check this box in Plug-In Pro and dig into the properties for the object.

Interface Mode
Did you know that Instructor can be turned into Assistant? With Plug-In Pro's Options screen, just choose the "Assistant" mode. Next time you start Instructor, it will have the simplified look of Assistant. (It's also a fun way to play a prank on another ToolBook developer in your office).

More information on Plug-In Pro is available at:

Back to Top

Expert Information from the "Learning & Mastering ToolBook..." Series

by Jeff Rhodes

While the Flash ActiveX player is very powerful, one disadvantage over playing something in a standard ToolBook media player is the issue of focus. Without careful attention, there are times that the Flash player will have the focus and therefore user input such as key presses will not work correctly in ToolBook. In the Learning & Mastering ToolBook 8 CDs, the primary place this problem came up is when we had implemented the Navigation buttons on the lower right and the "UI" buttons on the lower left as Flash movies. We later had to remove these due to instability issues between Flash and the Microsoft Agent ActiveX control. However, the concepts are still relevant. Just don’t mix Flash and Agent in the same book!

We had to address the problem from several angles:

First in any place we are capturing a message coming from the Flash object, we redirect the message to the page in the sharedScript of the ShockwaveFlash controls themselves like this:

to handle extFSCommand string flashCommand
	send lrn_implementNavButtons flashCommand to this page
end extFsCommand

Sending the message to the page gets the focus back into ToolBook.

Next, we prevent either control from getting the focus in the tab order. Here is a segment of the script keyDown handler in lrncom8.sbk (a system book).

	when key = keyTab
		if focus <> null
			if focus contains "Shockwave"
				send lrn_changeFocus
			end if
		end if

Another issue is the initial focus on the page. We assign this sharedScript to the button or other object that should have the focus. This prevents the Flash object from grabbing it. If the object already has a sharedScript, we set the value on enterPage:

notifyAfter firstIdle
-- This script is used to set the first focus of a page.
-- The s_firstFocus variable is used in various places to prevent the
-- focus from being held by flash objects.

	system s_firstFocus

	s_firstFocus = self
	if (sysLevel = reader) AND (visible of self = TRUE)
		focus = s_firstFocus
	end if
end firstIdle
Last, we are careful to reset the focus any time the Flash control might have been clicked (e.g., next page, previous page, etc.). We do this by sending the lrn_changeFocus message after performing these actions. Its implementation code is shown below.
to handle lrn_changeFocus
	system s_firstFocus

	if focus <> null
		if focus contains "Shockwave"
			focus = s_firstFocus
		end if
	end if
end lrn_changeFocus

Back to Top


OpenScript Tip from Jeff Rhodes


We use the lrn_showTextInDisplayField handler shown below great deal in our ToolBook-created training. It allows us to have the desired text in hidden fields and then show it in a common "display field." This makes is very flexible in that we can have a buttonClick, mouseEnter, hotword, etc. interaction, grab the last word of the name of the "target" and use this number as the corresponding field text to display: "rectangle 1" shows "field 1", "rectangle 1" shows "field 2", etc.

But sometimes we want slightly different behavior. For example, in most cases, we want the display field to have an inset borderStyle if a scroll bar is not required. However, on some screen designs, we want to have a borderStyle of "none." Rather than writing a completely different handler, we just make the borderStyleType an optional parameter. Similarly, we have a few screens were we want to have TWO display fields. We want all the same features for the second display field, but of course it has to have a different name. So this is the alternateDisplayName optional parameter.

Note that optional parameters must either by untyped or have a dataType of string. This is true even if the value coming in will be a number. That is because ToolBook interprets the absence of the parameter as NULL, which is only a possible value for strings.

to handle lrn_showTextInDisplayField word  fieldNumber, string borderStyleType, /
string alternateDisplayName
	-- this handler displays the text of field (field fieldNumber) in
-- a field called Display Field.  borderStyleType is optional:
-- used to revert to that type if Display Field moved into a
-- scrollbox. alternateDisplayName is optional:  It is an
-- alternative field name than Display Field
	local string displayFieldName
	local field fieldID

	oldSysLockScreen = sysLockScreen
	sysLockScreen = true
	if alternateDisplayName <> null
		displayFieldName = alternateDisplayName
		displayFieldName = "Display Field"
	end if
	fieldID = field displayFieldName
	borderStyle of fieldID = "inset"
	clear text of fieldID
	scroll of fieldID = 0
	richText of fieldID = richText of field ("field" && fieldNumber)
	if textOverFlow of fieldID > 0
		borderStyle of fieldID = "scrolling"
		if borderStyleType <> null
			borderStyle of fieldID = borderStyleType
			borderStyle of fieldID = "inset"
		end if
	end if
	show fieldID
	scroll of fieldID = 0
	sysLockScreen = oldSysLockScreen
end lrn_showTextInDisplayField

Back to Top

Actions Editor Tip by Cindy Kessler

What’s the Difference Between Shared Actions and User Events?

Developers who use the Actions Editor often find themselves asking: "Do I want a User Event in this situation or a Shared Action? What’s the difference?"

Here are some things to consider:

1. Difference: Where they’re stored.

A Shared Action is stored at the book level. A User Event is stored with the object.

Consequence: When you copy an object that uses a Shared Action from one book to another, its Shared Action will NOT be copied automatically.
When you copy an object with a User Event from one book to another, its User Event goes with it.

SCORE: Shared Actions: 0, User Events: 1

However, when you copy an object with a Shared Action within the same book, regardless of how many copies you make, you still only have one copy of the code. When you copy an object with a User Event within the same book, you will duplicate that User Event for each copy of the object.

SCORE: Shared Actions: 1, User Events: 1

2. Difference: Where they can be called from.

A Shared Action can be called by any object in the book. A User Event can only be called by objects that can see the object whose User Event it is (e.g., typically the object itself or other objects on that object’s page).

SCORE: Shared Actions: 2, User Events: 1

3. Difference: The number of parameters they can have.

A Shared Action can have unlimited parameters (you define them). A User Event has one predefined parameter.

SCORE: Shared Actions: 3, User Events: 1

4. Difference: What they can return.

A Shared Action can return a value. A User Event cannot.

SCORE: Shared Actions: 4, User Events: 1

5. Difference: Safety.

This one is up for debate, but if you are planning to create an action sequence that uses properties unique to an object type, it’s a bit risky to use a Shared Action since you can call it from ANY object, whereas in a User Event you KNOW what type of object you’re working with.

SCORE: Shared Actions: 4, User Events: 1.5

Summary: Based on the raw score of this scientifically developed study, Shared Actions win. However you will want to weigh certain features more highly depending on your situation.

As a general rule, I like Shared Actions for any type of generic FUNCTION, i.e., for any action sequences that are called repeatedly, need to return a value, and are relatively independent of objects. (See "Shared Actions as Functions" in EnterPage 4-02, http://www.plattecanyon.com/ep/ep4-02.htm, for an example.)

I like User Events when I want to call an action sequence that is unique to an object, and when I want to call it from multiple events of the object or from other objects on the page. (See "Creating a Replay Option With ‘User Event’" in EnterPage 4-03, http://www.plattecanyon.com/ep/ep4-03.htm, for an example.)

I’m sure you’ll find more pros and cons as you work with them!

Back to Top

The ToolBook Listserv

ToolBook users have a wonderful resource in this friendly and knowledgeable group of people. Over the years, the group has grown into a happy family, with everyone's personality really shining through. If you can't get help anywhere else, you'll almost always find help here. Even reading through the 50 or so daily posts is very informative.

The listserv will be transferring to its new home here at Platte Canyon on December 5, but we anticipate that the move will not result in any significant changes. It should continue to thrive as it has for years.

For more information, check out the ToolBook Listserv's new home at:


Back to Top

The ToolBook Webring

Platte Canyon has also taken over management of the ToolBook Webring. More information on this group of web sites, all associated with ToolBook, may be found at:


Back to Top



VBTrain.Net Tips and Tricks

VBTrain.Net Tidbit from Jeff Rhodes

Binding to a DataGrid

One of the most powerful and flexible controls in .NET is the DataGrid. We use it extensively in Tracker.Net as well as in the recently updated VBTrain web site. For example, we have a page to download evaluation copies of our products.


Rather than hardcode the links and descriptive text, we store the information in the database (SQL Server in this case) and then load the page on the fly (caching it so it only reads the database at most once an hour). Here’s what one of the datagrids looks like in the ASP.NET source:

<asp:datagrid id="lmsApiDemoGrid" runat="server"
AutoGenerateColumns="False" CssClass="GridStyle">
<AlternatingItemStyle CssClass="ReportAlternatingGrid">
<ItemStyle CssClass="ReportItemGrid"></ItemStyle>
   <HeaderStyle Font-Bold="True"></HeaderStyle>
<asp:HyperLinkColumn DataNavigateUrlField="linkURL"
DataTextField="linkName" HeaderText="Download">
<asp:BoundColumn DataField="description"

In words, we have a datagrid control with two columns. The first column displays the text of the “linkName” column of our database table and will hyperlink to the value of the “linkURL” table. The second column of the grid is bound to the “description” column of the database table. The rest of the settings deal with the style of the grid itself as well as the rows (so they alternate color and so forth).

On the “code behind” side, we want to link to the database and “bind” to each grid. There is a “demo” and an “eval” grid for each product.

‘ Part of the Page_Load handler
Dim dbCommand As New SqlCommand("VBTrainDemoEval", connectionID)
Dim dbReader As SqlDataReader

dbCommand.CommandType = CommandType.StoredProcedure
' Add parameters
Dim parameterProductId As New SqlParameter("@productId", SqlDbType.Int)

' Do each product in turn

BindGridContent(1, False, shapeDemoGrid, parameterProductId, _
parameterDemoVal, dbReader, dbCommand)
BindGridContent(1, True, shapeEvalGrid, parameterProductId, _
parameterDemoVal, dbReader, dbCommand)
‘ rest of products here

We first create a Command object that links to a SQL Server stored procedure named "VBTrainDemoEval." We use an existing connection to the database (connectionID). We then create two input parameters: @productId and @demoVal. These are used to specify which product we want to read (Shape, Training Shape, etc.) and whether we want the demo or evaluation versions. Next, we open the connection and call a common “BindGridContent” method. The “True” or “False” of the second parameter refers to whether we want the demo or evaluation files. Notice how we pass the parameter objects as well as a reference to the associated datagrid to the method.

Private Sub BindGridContent(ByVal prodId As Integer, ByVal dVal As _
Boolean, ByRef gridId As DataGrid, ByRef parameterProductId As _
SqlParameter, ByRef parameterDemoVal As SqlParameter, ByRef _
dbReader As SqlDataReader, ByRef dbCommand As SqlCommand)

	parameterProductId.Value = prodId
	parameterDemoVal.Value = dVal
	dbReader = dbCommand.ExecuteReader
	With gridId
		.DataSource = dbReader
	End With
End Sub

In the BindGridContent method, we set the value of our two parameters and then call the command object’s ExecuteReader method. This returns a “DataReader” object [basically the table that is returned from the stored procedure] that we can then “bind” directly to the grid. As long as this reader contains the linkURL, linkName, and description columns, all works great.

Back to Top

The VBTrain.Net Listserv

Since we were already licensing and configuring the Listserv software in support of the ToolBook List, we decided to use Listserv for the VBTrain.Net List as well. This gives us a searchable digest as well as the ability to have a mirrored newsgroup.

We’ll send out an email to all list members with the exact transition date. For more information, please visit:

Back to Top



Conference Reviews and Previews

by Chris Bell

OnLine Learning 2002, September 23-25, 2002, Anaheim
Jeff Rhodes and I had a great time at OnLine Learning 2002 (and that's not just because we went to Disneyland one evening!). This year, rather than hosting a booth in the Expo hall, we decided to take in sessions, watch the LMS Shootouts, and wander the Expo hall. The huge Click2learn booth was in full swing every time we passed it as were a number of other booths. We enjoyed the technical sessions that we attended and also had the good fortune of meeting up with some old friends, Ross Hopkins and Dawn Adams. We also presented a full-day post-conference workshop for beginners called "Tools and Techniques for Online Learning" that went over quite well with attendees.

ASTD TechKnowledge 2003, January 28 -30, 2003, Orlando
I'm excited to be representing Platte Canyon with two sessions at the ASTD TechKnowledge conference. If you're at the conference, please stop by and say hi. The sessions I'll be presenting are:

GDI+: Awesome Graphics and Text in Visual Basic .NET
Thursday, January 30, 8:30 to 9:30 am

Integrating Media into ASP.NET Training Applications
Thursday, January 30, 10:00 am to 11:00 am

SALT New Learning Technologies 2003, February 19-21, 2003
Preconference workshops February 17 – 18, Orlando
I will be returning to Orlando in February for the Society for Applied Learning Technology's New Learning Technologies Conference. At the conference, I will be presenting two preconference workshops and a technical session. Please come join me if you'll be attending this conference.

Preconference Workshops:

Flash + Power: Creating Your User Interface in Flash and Your Training in Microsoft's .NET
Monday, February 17, 2003, 8:30 am to 12:00 p.m.

Integrating Media into ASP.NET Training Applications
Monday, February 17, 2003, 1:30 pm to 5:00 pm

Technical Sessions:

GDI+: Awesome Graphics and Text in Visual Basic .NET
Wednesday, February 19 8:30 to 9:30 am

Back to Top


Platte Canyon Products in the Pipeline

We’ll devote our energies in the near term toward filling out more of the VBTrain.Net product line. We’re hard at work at ASP.NET analogues to our Shape and Graphical Text objects. The Web Shape and Web Text controls will allow you to dynamically create shapes (ellipses, lines, arrows, etc.) or graphical text on your web site and either save it to an image file (e.g., to be used by the user for the whole session) or even to stream it directly into the browser without saving to a file first. The shape or text could have gradients, textures, and other effects. For example, your training could ask the student her name, make a stylized, graphical version, and show that at the upper right of every page during the session!

Along with the Web Shape and Web Text, we’ll also release a Web Button control. This will make it easier to create graphical buttons that rollover and depress.

Also on the web side, we’re hard at work on a Web Player control. It will automatically render itself as a Windows Media player, a Flash player, or a Real player. Or, if the user turns of the sound/video, it will turn into a simple label.

Next on the agenda is a complete question architecture. We plan to create question objects for both the Windows Forms and ASP.NET sides of the .NET house. You’ll be able to select the question type, set various properties, score a test, and more. Stay tuned for further details.

Back to Top


e-learning Creation Tip from Chris Bell: The Joys of Data Backup

Last week, I carried my laptop into the ToolBook training class I was teaching and turned on my computer as I had done every day that week and every day since I started working with that laptop as my main machine. This time, however, rather than playing the familiar Windows start up tone, all I heard was the hard disk going "Kachunk, Kachunk, Kachunk." The black screen of my computer said that it couldn't find a disk to boot from. Luckily, I had a back up training computer nearby, so I taught the rest of the week using it.

The bigger problem was that my main development machine had now lost its main hard disk. I could have lost all the data that I had been working on.

Luckily, I had been using a nifty little backup utility called Second Copy. This tool makes scheduled, unattended backups of any directories you specify. I had backed up most of my important files onto a second machine's hard disk. Because Second Copy does its job so well and so innocuously I had to check to make sure that everything had been backed up. Sure enough, everything I specified, had been backed up!

The only catch? I hadn't specified EVERYTHING I needed. I lost about a week's worth of work on an upcoming VBTrain.Net product. That was the biggest bummer. I had neglected to update Second Copy to back up that directory as well.

The lesson: Have an automatic data backup program (I like Second Copy a lot) AND make sure to include all of your development and data directories.

Back to Top


Coming in the Next Issue of the EnterPage

  • Another Plug-In Pro Tool Spotlight
  • More CBT Creation Tips from Chris Bell
  • More OpenScript Tips from Jeff Rhodes
  • More Actions Editor Tips from Cindy Kessler
  • More VBTrain.Net Tidbits from Jeff Rhodes
  • ToolBook Tip (from the "Learning and Mastering ToolBook..." Series)
  • More

Back to Top

Information on Subscriptions and Article Submissions

The EnterPage is distributed four times a year, with occasional special issues. Individuals who have expressed interest in Platte Canyon Multimedia Software Corporation or its products receive The EnterPage. If you do not wish to receive future issues, please send an email message to ep@plattecanyon.com with the word "unsubscribe" in the subject line. New subscriptions are available by sending an email message to ep@plattecanyon.com with the word "subscribe" in the subject line and the person's name and company in the text of the message. Suggestions for articles or proposals for article submissions are welcome. Send information to EP@plattecanyon.com. Back issues of the EnterPage are available at http://www.plattecanyon.com/enterpage.aspx.

All content Copyright Platte Canyon Multimedia Software Corporation, 2002.