The EnterPage 8-03
The Source for ToolBook and VBTrain.Net News
from Platte Canyon Multimedia Software Corporation
September 27, 2005
Tracker.Net Version 3 Released
ToolBook Instructor 2004 SP2 (Decaf) and SP3 Available
ToolBook Training Class in Boulder October 10th
TBCON 2005 "Archives for Attendees" Available
"Learning & Mastering ToolBook Assistant 2004" Beta Testers Needed
Plug-In Pro Tool Spotlight – User Properties Editor
Come See Us: The Platte Canyon World Tour
Platte Canyon Products in the Pipeline
Coming in the Next Issue of The EnterPage
We have a lot of new things around here at
The genesis of this new product comes from an e-Learning DevCon session by Steve Hancock of Rapid Intake that I attended this summer. Steve's session was about SCORM and he demonstrated his testing process for verifying custom SCORM lessons before delivery to the customer. It occurred to me that the "one-page" Learning Management System (LMS) that we use internally and demonstrated at TBCON this year could serve this function if we not only displayed the SCORM Runtime Environment (RTE) messages as they go by but also save and display them on the page. This then allowed the lesson (SCO) to be re-launched with the new data. Making the data editable allowed the developer to configure the "LMS" to send exactly the information with which to test the SCO. Add support for SCORM 1.3 (2004), the ability to save "state" to a file, correct operation in other browsers like Netscape, collapsible screen areas, etc., and you have a product that we have named "SCORM Watch."
SCORM Watch is $395 per developer. Here is a link for more information.
http://www.plattecanyon.com/productDisplay.aspx?id=14
In addition to hitting Steve up for some beta testing (and some great feature suggestions), we also enlisted our friend and TBCON faculty member, Bill Hurley. Thanks to you both for the help!
SCORM Watch: Building the Perfect SCORM
We released this exciting new version of our flagship Tracker.Net product on July 5, 2005. Here is a list of some of its new features:
· Fully multilingual with simultaneous support of six languages
· Supports Netscape, Mozilla, and Firefox browsers
· Supports SCORM 2004 Runtime Environment
· User-configurable Alert, Critical, and Expired Statuses
· Send students notification emails when they are assigned a course
· New "My Courses" interface options
· Filter courses and lessons by status or keyword
· View or email reports as Word, Excel, or HTML
· Assign courses and classes by organization
· Improved password-changing options
· Ability to customize and close the lesson window
· Many new reports
· Downloadable trial version
· More notification email options
· Required course completion dates
· Notification messages for individual courses, lessons, and classes
Here is an online PowerPoint presentation describing the new features in more detail:
http://www.vbtrain.net/documents/tracker3new.htm
Pricing is unchanged at $5,995 for up to 500 users or $8,995 for unlimited users on a single web site. You may purchase the source code for an additional $4,995.
More information including a free evaluation version is available at:
http://www.vbtrain.net/trackerinfo.aspx
The reception for service pack 2 (previously codenamed Decaf in a reference to its decoupling of the ToolBook HTML from Java) has been outstanding. And now service pack 3 is available as well. We won't repeat the list of features from the well-written articles listed below, but just wanted to pass along kudos to Tim Barham, Charley Delaney, and the rest of the SumTotal team!
With Chris Bell's relocation to
http://www.learningandmastering.com
The 2005 edition of the
Other highlights include:
SumTotal Systems ToolBook Design Awards
Congratulations to Michael Hersh of USASMDC for winning the Best ToolBook Online Training award. A big pat on the back also goes to the Verizon team of Tom Hall, Lee Karns, and Peter Hoyt for winning the best ToolBook Productivity Tool for "The Verizon CIS Rapid Development Suite." Both teams won Apple iPod Minis. Here is the SumTotal press release:
http://www.sumtotalsystems.com/press/2005/09/07/1
VBTrain.Net Design Awards
Bob Culver won first place in the "Best VBTrain.Net Training Application" while Kim Halat won second place. Mauro Rech won first place for the "Most Innovative Use of VBTrain.Net" while the U.S. Army team of Steve Stacy, Marvin McFarland, and Shannon Taylor won second place. First place winners received $200 while second place winners received $100. Here is a link for more information as well as links to winning entries:
http://www.vbtrain.net/designawards.aspx
To view the famous group photo as well as more information about TBCON 2005, go to:
http://www.tbcon.com/resources_2005.aspx
Mark your calendars for June 19 - 21, 2006 (preconference training June 17 and 18), when the fun starts again!
If you couldn't make the conference but would still like to download the sample applications and presentations from most of the 60+ TBCON 2005 sessions, you'll be glad to know that the "Archives for Attendees" is now available for only $50. Past versions are discounted as are bundles of multiple years. To learn more, go to:
http://www.tbcon.com/archives_2005.aspx
We are looking for a couple more beta testers for "Learning & Mastering ToolBook Assistant 2004." If you have some time in the next week to give it a thorough test, please email Chris Bell at cbell@plattecanyon.com. Beta testers who go through the whole training and give feedback receive a free copy.
This tool goes all the way back to 1997 when we wrote the ToolBook Synergy product under contract to what was then Asymetrix. The idea was to take a Designer's Edge storyboard and create a matching ToolBook module. Text, graphics, and media obviously had corresponding places on a ToolBook page. But what to do with things like programming instructions? We decided to put those into user properties. But we then needed an easy-to-use editor that had lots of space for displaying the properties. We saw the value of this editor to the Plug-In Pro as well as for Synergy, so we developed that part on our nickel and used it for both (which made our Asymetrix budget manager happy of course).
In addition to providing a big area for viewing and editing user properties, the other main innovation of the User Properties Editor is the ability to select an object on the page/background from a drop-down list and then be able to view/edit THAT object's properties. Here's a link to the help topic to learn more:
http://doiop.com/userProperties
More information on Plug-In Pro is available at:
http://www.plattecanyon.com/pluginpro.aspx
by Denny Dedmore
Check for ActiveX Using Undocumented Functions
There is an undocumented R.SBK function which is used by various widgets (UMP for example), which can check to see if a class identifier (CLSID) is in the user's registry (from which we can assume this means the control is installed).
The function is called:
ASYM_fileFromCLSID(<CLSID of control>)
A non-null return value indicates that it is installed.
Here are some common control values you can use.
Flash: {D27CDB6E-AE6D-11CF-96B8-444553540000}
WMP: {22D6F312-B0F6-11D0-94AB-0080C74C7E95}
Real: {CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA}
What good will this do you? If instead of launching your main app, you launch a little app that checks to see if all controls are installed, you can warn the user, tell them to go get the controls and install them and then gracefully exit. Or if all are installed, silently run the main book.
by Jeff Rhodes
The page level mouseEnter script below is a good example of the benefits of putting code at the page rather than in individual objects. Taken from the "Resource Manager" page of "Learning & Mastering ToolBook," this script takes care of 14 different rectangles covering a screen capture of the Resource Manager dialog box. It uses the target property to determine if the object is even a rectangle and, if so, which of the 14 it is. The lrn_hideCharacter line hides the Agent narrator. We change the mouse cursor and then determine the "rectangle num" based on the name of the rectangle. We next change the color of the last rectangle we looked at to white, and then change the current one to blue. We show specific information about the topic in a "Display Field" (this is a good example of a user defined message), using the rectangleNum. Lastly, we keep track of the steps completed, so that we can change the next page button to blue when completed. As an exercise, you might try to achieve the same effect with either a script or shared script on the individual rectangles.
to handle mouseEnter
local string tarName
local word rectangleNum
tarName = name of target
if object of target = "rectangle" and
tarName <> null
sysCursor = cursor "mouseEnterCursor 3"
rectangleNum = word 2 of tarName
if lastRectangleShown of this page <> null
fillColor of (lastRectangleShown of this page) = white
else
send lrn_hideCharacter
end if
lastRectangleShown of this page = target
fillColor of target = 180,50,100 -- blue
send lrn_showTextInDisplayField rectangleNum
get lrn_checkSteps(rectangleNum, 14)
else
forward
end if
end mouseEnter
to handle mouseLeave
sysCursor = default
forward
end mouseLeave
by Tim Barham
OnPropertyChange Event
You can use the "On property change" event to determine when the text in a field changes. This event will fire if the user changes the text and presses enter (for a single line field, at least), or tabs out of the field.
One parameter of the property change event is the name of the property that changed. The first line of script should be an "if" statement, checking that the property name is "text". Then do whatever you like based on the text of the field.
The LmsApi product has one role in life: to help e-Learning developers who are using ASP.NET make the various SCORM runtime environment (RTE) calls. As many of you know, these calls are made via JavaScript. Dynamically generating this JavaScript from server-side code in .NET can be tricky. For example, you would typically keep track of the student's time in the lesson using the Session object. But this data needs to be sent back to the LMS when the student exits. So you typically want to generate the appropriate JavaScript when each page loads just in case the student exits. LmsApi helps make this possible. For example, in the case mentioned, your code looks like this:
jsString = apiObject.GetJsSetValue(SetValueEnum.core_session_time, sessionTime, True)
RegisterClientScriptBlock("setTimeInfo", jsString)
We are working on a new version of LmsApi where you can specify whether to generate SCORM calls in 1.2 or 1.3 format. You will then even be able to pick the SCORM version via the query string with URL's like ...training.aspx?SCORM=12. LmsApi is $245 on its own or is part of the $995 VBTrain Bundle.
Information: http://www.vbtrain.net/productDisplay.aspx?id=6
by Jeff Rhodes
This issue's Nugget comes from a recent update to the plattecanyon.com and vbtrain.net web sites. For several years, we've wanted to show user comments and testimonials about our products that have been emailed to us or posted online. Our first step was to get the comments into a SQL Server database. We added a single ProductComments table with Product Id (1 for Learning & Mastering ToolBook, 9 for Tracker.Net, etc.), comment text, and comment date. We then added a user control (comments.ascx) to the web site. A user control can be shared among multiple pages on the site and can have their own behavior, properties, and events. When the control is added to each page, its tags look like this:
<uc1:comments id="Comments1" runat="server" ProductList="4"></uc1:comments>
The ProductList value of "4" refers to TBK Tracker. We designed this property so that multiple product Id's could be separated by a comma (4,100 would list both TBK Tracker comments and technical support comments). Or you could put "all" to show the comments across the board. The control also has these optional properties: NumItems (how many comments to display), Year (limits the comments to a particular year), and CommentLabel (used if you don't want the label to say "User Comments").
Here's what the comments.ascx page looks like:
<h5><asp:label id="typeLabel" Runat="server">User</asp:label> Comments</h5>
<table class="CommentText">
<asp:repeater id="CommentsRepeater" runat="server">
<ItemTemplate>
<tr class="navBarRow">
<td><img src="images/bullet.gif"></td>
<td><%# Container.DataItem("CommentText") %>
</td>
</tr>
</ItemTemplate>
<SeparatorTemplate>
<tr>
<td></td>
</tr>
</SeparatorTemplate>
</asp:repeater>
</table>
<br>
<a class="paragraf" id="commentsAnchor" runat="server">View all comments</a>
The first line shows "User Comments" unless the CommentLabel property is different as described above. We then start an HTML table and use the ASP.NET Repeater control to make as many rows as there are records in the data that we "bind" to. The data needs to have a "CommentText" column in order for the Container.DataItem("CommentText") bit to work. The Separator Template puts a blank row in for readability. Finally, we put a hyperlink (anchor tag) to a popup page that shows all the comments. The runat="server" part shows a great capability of ASP.NET where we can take a normal HTML element and make it "server-side," allowing us to set its properties with server-side code. In this case, we dynamically set the href so that we can read the Product Id and other properties via the query string:
javascript:void window.open('usercomments.aspx?id=4&year=&label=User', 'Comments', 'width=640, height=480, status=no, resizable=yes, scrollbars=yes, toolbar=no, menubar=no');
The last part is the server-side code for the user control. I've shown the Page_Load code below with a few non-essential parts removed. I've interspersed explanations along the way.
If IsPostBack = False Then
Dim prodList As String = Me.ProductList
Dim tableId As DataTable = Me.CommentsTable
Dim labelText As String = Me.CommentLabel
Dim numComments As Int32 = Me.NumItems
The code above reads the properties previously discussed as well as the list of all comments in the database. These comments are cached by the server and thus are only read from the database very infrequently. This greatly improves speed.
Dim hrefString As String = String.Format("javascript:void window.open('usercomments.aspx?id={0}&year={1}&label={2}', 'Comments', 'width=640,height=480,status=no,resizable=yes,scrollbars=yes,toolbar=no,menubar=no');", prodList, Me.Year, labelText)
commentsAnchor.HRef = hrefString
typeLabel.Text = labelText
We create the href string based on the property values and then set that property of our anchor object. We also set the text of the label that is "User" by default.
If IsNothing(tableId) = False Then
Dim builderId As New StringBuilder
Dim viewId As DataView = tableId.DefaultView
Dim prodString As String = "ProductId={0}"
viewId.RowFilter = ""
If prodList.ToLower <> "all" Then
Dim prodArray As String() = prodList.Split(CChar(","))
Dim prodNum As Int32
Dim prodLength As Int32 = prodArray.Length
For prodNum = 0 To (prodLength - 1)
With builderId
If .Length > 0 Then
.Append(" OR ")
End If
.Append(String.Format(prodString, prodArray(prodNum)))
End With
Next
If builderId.Length > 0 Then
viewId.RowFilter = builderId.ToString
End If
End If
This code uses a very helpful object called a DataView. It allows us to filter the table without losing the original data. That's how we show only the comments for the product(s) of interest on this page.
If Me.Year <> "" Then
' code to limit to a year omitted
End If
Dim endingNum As Int32 = viewId.Count
If endingNum > numComments Then
' code to pick random comments out of the list omitted
End If
We omit the further filtering of the DataView based on the year or based on randomly grabbing the rows we want from a bigger list.
With CommentsRepeater
.DataSource = viewId
.DataBind()
End With
Most of the work was in getting the DataView. Actually "binding" it to the Repeater is only the two lines of code above.
End If
End If
You can see an example of this page at:
http://www.plattecanyon.com/tbkTracker.aspx
Most of the other pages on both the plattecanyon.com and vbtrain.net sites now use this control as well. The tbcon.com site has a variation that displays reviews by category for the conference.
One last note: the new "Master Page" functionality of the upcoming ASP.NET 2.0 would have allowed us to code this functionality without needing a user control. We'll discuss this new .NET version along with Visual Studio .NET 2005 in a future newsletter as well as at TBCON 2006.
Our speaking and exhibit schedule is quite full this year. If you are attending any of the following shows, we hope to see you.
Training Fall (
Booth: 306
DevLearn (
Jeff Rhodes session (10:15 AM on November 17): "Beyond Templates: Creating Interactive, Database-driven e-Learning using ASP.NET"
Chris Bell session (3:30 PM on November 17): "Interacting with Flash Using JavaScript"
ASTD Techknowledge (
Booth: 212
Jeff Rhodes session (11:00 AM on February 1): "Talking SCORM with ASP.NET"
http://www.astd.org/astd/conferences/tk06/tk06_home
Training (
Booth: TBD
Jeff Rhodes session (time and date TBD): "Why E-learning Should Be Database-Driven"
http://www.trainingconference.com
ASTD International (
Booth: TBD
Look for "Learning & Mastering ToolBook Assistant 2004" very shortly, followed by LmsApi version 2. After that, we'll be updating Question and Exam Engine.
· Another Plug-In Pro Tool Spotlight
· More Expert Information, OpenScript Tips, and Web Hints from the "Learning & Mastering ToolBook" series
· Another VBTrain Control Spotlight
· Another VBTrain.Net Nugget
· More
The EnterPage is distributed up to four times per year, with occasional special issues. Individuals who have expressed interest in Platte Canyon Multimedia Software Corporation or its products receive The EnterPage. 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
To subscribe or unsubscribe, please send email to ep@plattecanyon.com. Please include your name and company with new subscriptions.
All content Copyright Platte Canyon Multimedia Software Corporation, 2005.