... ..

The EnterPage

The Source for ToolBook and VBTrain.Net News
August 4, 2004
Issue 7-02

...

From Platte Canyon Multimedia Software Corporation.

In This Issue

Introduction

Top Stories
One-Day TBCON Events - Come a Day Early and Learn
TBCON 2004 Follow-Up
TBCON 2004 "Archives for Attendees" Now Available
Check Out a New Database-Driven VBTrain.Net Example
Come Visit Us at Training - Fall

ToolBook Tips and News
Plug-In Pro Tool Spotlight - Show Page Objects
Expert Information from the "Learning & Mastering ToolBook" Series
OpenScript Tip
Actions Editor Tip

VBTrain.Net Tips and News
VBTrain.Net Tidbit

More News and Information
Come See Us: The Platte Canyon World Tour
Platte Canyon Products in the Pipeline
Coming in the Next Issue of The EnterPage
About The EnterPage
Information on Subscriptions
 

   

Introduction

We've now hopefully all recovered from TBCON and are focused on "One-Day Events" to be offered before the main U.S. training conferences. This issue contains information on both as well as the associated "Archives for Attendees."

We update you on products in the pipeline as well as include our normal collection of ToolBook and .NET tips and tricks. New with this issue is the "Tracker.Net Tip."

We hope to see many of you at one of our events or via the ToolBook or VBTrain.Net ListServ. Thanks for being part of this community!

Back to Top
 

   

Top Stories

One-Day TBCON Events - Come a Day Early and Learn

If you couldn't make it to Colorado Springs this year or don't want to wait another year to sharpen your skills, these events are for you. Platte Canyon will be hosting one-day TBCON events before the major training conferences throughout the year. The fun starts on Sunday, October 10, 2004 in San Francisco (before Training – Fall). Your next opportunity is Sunday, February 27, 2005 in New Orleans (before Training – Spring). The last one in this cycle is Sunday, June 5, 2005 in Orlando (before ASTD).

Each event will provide eight hours of technical sessions on ToolBook and VBTrain.Net topics. Attendees will choose the exact topic covered out of a large list of possible sessions! Beginning, intermediate, and advanced developers are all welcome! For larger groups, we will split into separate groups by development tool (ToolBook or VBTrain.Net) or skill level. Price is $285 per person, which includes lunch, snacks, and beverages. Here's a link for more details or to sign up:

http://www.tbcon.com/1dayevents.aspx

Back to Top

TBCON 2004 Follow-Up

About 100 ToolBook and .NET developers traveled to Colorado Springs from June 18 - 23 to hone their craft, meet their peers, and have some fun. In the words of one attendee who has attended every year except 2003, "I enjoyed it a lot. It was probably the BEST TBCON that I have been to so far!" We didn't let a bit of rain on the preconference weekend bring us down and then the weather cooperated nicely for the main event.

Tim Barham and other key SumTotal members (Charley Delaney, Denny Dedmore, Michael Ormes, and Mukesh Singh) filled us in on some of the exciting ToolBook plans. Here's a brief summary taken from list posts:

A release later this year code-named Decaf. All AICC and SCORM logic will be moved - from a Java applet to JavaScript. AICC support will still require Java just for the HTTP post communication. SCORM and "normal" DHTML will not need Java at all.

The 32-bit "Blackcomb" project is being worked in parallel. Much of the development team in India is dedicated to this task.

On the VBTrain.Net side, we announced that the big ticket items for the next year will be Tracker.Net 3, Question 2, Exam Engine 2, and Web Player 2.

A few other highlights:

SumTotal Systems ToolBook Design Awards

Congratulations to Dawn Sekel of the U. S. Courts for winning the award for the "Most Creative Use of ToolBook." Big kudos also go to Peter Hoyt of Verizon Data Services, Inc. for the "Best ToolBook Online Training." They both won Apple iPod Minis.

Thank you to SumTotal Systems for sponsoring this contest. Charley Delaney and Michael Ormes did their usual superb job of judging all the outstanding entries!

Hack-Ack

Brad Shuck won the Olympic-themed contest this year, decided once again by audience vote. The Buckman Labs team of Tony Lin, Oscar Posada, Michele Nix, Mauro Rech, and Catherine Walker came in a strong second. The other entries were so outstanding that the audience decided they all tied for third: Andrew Gould and Simon Price; Jose Rodriguez, Mike Pritchett, Launa Mallett, Doris Ford, and April Whitson; and George Maggelet and Richard Kilmer. Denny Dedmore created a demonstration application on path animation from ToolBook while Jeff Rhodes built a PocketPC application in .NET that allowed attendees to draw their own interpretation of Tim Barham .

Back to Top

TBCON 2004 "Archives for Attendees" Now Available

If you couldn't make the conference but would still like to download the sample applications and presentations from most of the 60+ TBCON 2004 sessions, you'll be glad to know that the "Archives for Attendees" are now available. At only $50, this is a real steal! There are also various low-cost bundles available if you would like the archives or CDs from previous years. To learn more, go to:

http://www.tbcon.com/archives_2004.aspx

Back to Top

Check Out a New Database-Driven VBTrain.Net Example

One of the most powerful aspects of creating training in .NET is the ability to load all your content from a database. For several of the TBCON sessions, we created both a Windows application and an ASP.NET application from the same database and media. The content was "The History of TBCON." You can see the web version at:

http://www.tbcon.com/wbtexample2004/default.aspx

If you want to download and compare the database to the sample, you can download it at:

http://www.tbcon.com/wbtexample2004/database/trainingcontent.mdb

The complete source code to both the Windows and ASP.NET versions is available as part of the Archives.

Back to Top

Come Visit Us at Training - Fall

If any of you are planning to come to the Training Fall conference in San Francisco (October 11 – 13, 2004 with a one-day TBCON event on October 10), please stop by our booth (316) and say hello. If you just want to visit the expo, send us an email ( info@plattecanyon.com ) and we'll mail you a free Expo Pass. Here's a link for more information about the conference.

http://www.trainingfall.com

Back to Top

   

ToolBook Tips and News

Plug-In Pro Tool Spotlight

by Jeff Rhodes

CBT Question Editor

Show Page Objects

One of the earliest Plug-In Pro tools is "Show Page Objects." It addresses the situation where you have an interactive page with various objects that are hidden. It is easy enough to open the Command Window and type "show objects" to get them all visible or to right-click on the page and choose "Show Objects". The tricky part is getting the right ones hidden again! The "Show Page Objects" dialog takes care of this by changing the "Show All Selected" button to the "Restore to Original" button. Clicking it after showing the objects will return everything to its original state. The button caption is "Show All Selected" because there is a drop-down list where you decide to show all objects or just fields, buttons, etc. There is a matching tool for showing and hiding objects on the background.

If you want to see what the dialog looks like, check out the help topic:

http://www.plattecanyon.com/help/pluginpro/Showing_Objects.htm

More information on Plug-In Pro is available at:

http://www.plattecanyon.com/pluginpro.aspx

Back to Top

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

by Chris Bell

Anatomy of a TBR file

The product of running the Sim AutoBuilder Recorder is a TBR file. We import the TBR file into ToolBook using the Insert Simulation from Recording menu item. That's really all that we need to know about TBR files. But if you're really interested in digging deeper, here's what you'll find:

A TBR file is a zip file with a different extension. This means that you can open it with WinZip, PKZip, or another unzip routine.

Inside the TBR zip file, we find two types of files:

BMPs - these are the captured screens. One image per step. These are the same images that you'll see if you were to click "preview" at a step while going through the TBR import wizard.

XML file - this is the data file that the simulation import process uses to create the simulation. It is a highly structured and detailed account of the full capture. Every menu item, button, dialog box, is represented here for reproduction in ToolBook.

Have fun digging into the file!

Back to Top

OpenScript Tip

by Jeff Rhodes

Both the OpenScript and Actions Editor tips this month come from our continuing work for the Army in support of automating their development process. Since the last EnterPage issue, I've written a tool to save the content of a ToolBook book to an Access database. We've done this previously with our special database structure as part of Content Connection. But in this case, we needed to account for any changes that developers may have made between the time the book was loaded from a database. So we know the database structure but still need to match up the fields, buttons, media, graphics, etc. For performance, we save all the information to an array (storyWriteTable[][] in the code below). We show the book in a viewer to avoid problems with the ActiveX control getting in the way of our ADO (ActiveX Data Objects) code. That is what viewerId below means. One of the more challenging parts is getting the data out of the question objects. The code below shows the handler that we use once we have found the question object (questionId).

to handle story_writeQuestionData word num, word columnNum, object questionId, object viewerId

	system storyWriteTable[][] -- num is row number and columnNum represents the location 
		--of the questionType column (followed by the answer and answerCorrect columns)
	local string qType
	local tempAnswerArray[][]
	local word numAnswers, answerNum, arrayNum
	local string answerValue, answerCorrect
	
	in viewerId
		if questionId <> null
			qType = asym_wid_qType of questionID
			storyWriteTable[num][columnNum] = story_formatFromQuestionType(qType)
			
			tempAnswerArray = ASYM_WID_AnsArray of questionId
			
			if qType <> null
				numAnswers = item 1 of dimensions(tempAnswerArray)
				step answerNum from 1 to numAnswers
					arrayNum = columnNum + (2 * (answerNum - 1)) + 1
					answerValue = null
					conditions
						when qType = "matchItem"
							answerValue = tempAnswerArray[answerNum][17]
						when qType is in "multiChoice,typeIn,trueFalse,orderText"
							answerValue = tempAnswerArray[answerNum][1]
							-- else do nothing
					end conditions
					answerCorrect = tempAnswerArray[answerNum][10]
					storyWriteTable[num][arrayNum] = answerValue
					storyWriteTable[num][arrayNum + 1] = answerCorrect
				end step
			end if
		end if
	end in
end story_writeQuestionData

to get story_formatFromQuestionType string questionType
	local string returnType
	
	conditions
		when questionType = "ORDEROBJ" 
			returnType = "Definable Arrange"
		when questionType= "MULTIDROP"
			returnType = "Definable Drop"
		when questionType = "MULTIOBJ"
			returnType = "Definable Multiple Choice"
		when questionType = "NAMEPART"
			returnType = "Drag and Drop"
		when questionType = "TYPEIN"
			returnType = "Fill In The Blank"
		when questionType = "MATCHITEM"
			returnType = "Matching"
		when questionType = "MULTICHOICE"
			returnType = "Multiple Choice"
		when questionType = "TAQUIN"
			returnType = "Sequenced Steps"
		when questionType = "SIMULATION"
			returnType = "Simulation"
		when questionType = "TRUEFALSE"
			returnType = "True or False"
		else
			returnType = "Multiple Choice"
	end conditions
	
	return returnType
end story_formatFromQuestionType

The logic is fairly simple. We figure out the question type to use a lookup function (story_formatFromQuestionType) to translate that into the values used in the database. We then read the ASYM_WID_AnsArray property of the question into a temporary variable. We then loop through the number of answers to grab the answers and whether each one is correct. We don't need to store the actual weights since our "loading" code takes care of figuring this out on the way in.

Some of you alert readers may have noticed that we are not grabbing either the immediate or summary feedback. That is because the program's design is to implement feedback based on the number of tries. The feedback is then stored in hidden fields on the pages rather than in the question object. See the Actions Editor Tip below for details on this part of it.

Back to Top

Actions Editor Tip

by Jeff Rhodes

For the Army project discussed in the OpenScript Tip above, the requirement is to give different feedback on try 1, try 2, and try 3. After the third try, the training shows a "Reset" button. Since this "multiple try" functionality is not built-in to ToolBook question objects, we needed to code this in the Actions Editor. The "On click" action for a multiple choice question is shown below:

Define local variable "numTries" (Initial value: 0)
Define local variable "currentScore" (Initial value: 0)

Score Definable Multiple Choice Question "Definable Multiple Choice"
Set numTries to tryCount of button "Definable Multiple Choice"
If currentScore = 1
  If numTries = 1
    Set text of Field "questionFeedback" to text of field "allCorrect 1"
  Else if numTries = 2
    Set text of Field "questionFeedback" to text of field "allCorrect 2"
  Else
    Set text of Field "questionFeedback" to text of field "allCorrect 3"
  End if
  Set visible of Button "resetBtn" to true
Else if currentScore = 0
  If numTries = 1
    Set text of Field "questionFeedback" to text of field "allIncorrect 1"
  Else if numTries = 2
    Set text of Field "questionFeedback" to text of field "allIncorrect 2"
  Else
    Set text of Field "questionFeedback" to text of field "allIncorrect 3"
  End if
Else
  If numTries = 1
    Set text of Field "questionFeedback" to text of field "partialCorrect 1"
  Else if numTries = 2
    Set text of Field "questionFeedback" to text of field "partialCorrect 2"
  Else
    Set text of Field "questionFeedback" to text of field "partialCorrect 3"
  End if
End if
If numTries >= 3
  Set visible of Button "resetBtn" to true
End if

The logic is fairly simple. We score the question and grab the tryCount property. Based on the score and the try, we set the text of our "questionFeedback" field to the text of the corresponding field ("allCorrect 2" for example if they get the question right on the second try). This design works particularly well for the situation where we load the text of the various "correct" fields from the database since that text can change independently of this action.

Back to Top
 

   

VBTrain.Net Tips and News

VBTrain.Net Tidbit

by Jeff Rhodes

One of the challenges of the "Database-Driven" VBTrain.Net example described above was in creating a "timed field" interaction. The idea was to have the fields show up in a timed sequence, much like you can do with a PowerPoint slide. One of the tenets of web development is that interaction should be done in JavaScript. Posting and reloading the page is for new content or complex server-side logic. Timed fields, rollovers, and so forth are implemented in JavaScript. When we are loading all the content from a database, however, we only want to have this JavaScript if the "interaction type" is one of the timed types (timed10, timed20, or timed30 in our example). The rest of the time we need other JavaScript or none at all.

Select Case intType
	Case "timed10", "timed20", "timed30"
		Dim timerNum As Integer = CInt(intType.Substring(5, 2)) * 100
		Dim jsString As String = BuildTimerScript(6, timerNum)

		HideContentTemporarily()
		ShowHideTrainingText(ShowHideEnum.Hide)
		LoadContent(contentArray)

		Me.RegisterClientScriptBlock("timerScript", jsString)
End Select

In the code above, we have already read the intType variable and the contentArray from the current record of the database. If we are one of the timed cases, we convert the number at the end to milliseconds. Then, very importantly, we build a chunk of JavaScript using the BuildTimerScript function shown below. The first parameter, 6, is the number of content fields on the page. The second is the length of the timer. The JavaScript starts a timer (setInterval) and defines the function (setTimerContent) to be called when the timer fires. In this function, we find the next content field in sequence and show it by setting its display style to "inline." Once all the fields are shown, we stop the timer (clearInterval).

Back in the first set of code, we hide the content fields by setting their display style to "none." We hide some other objects (training text) that are not needed for this interaction and then load the content fields from our content array (which was in turn read from the database). Finally, we use the extremely helpful RegisterClientScriptBlock method to dynamically add the JavaScript to the page.

Private Function BuildTimerScript(ByVal numItems As Integer, _
	ByVal numMilliSeconds As Integer) As String

	Dim jsBuilder As New StringBuilder

	With jsBuilder
		.Append(CR)
		.Append("<script language = javascript>")
		.Append(CR)
		.Append("var curTimerNum=1;")
		.Append(CR)
		.Append(String.Concat("var timerId = setInterval('setTimerContent()', ", _
			numMilliSeconds, ");"))
		.Append(CR)
		.Append("function setTimerContent(numItems){")
		.Append(CR)
		.Append("var contentName = 'Content' + curTimerNum;")
		.Append(CR)
		.Append("var contentId=document.getElementById(contentName);")
		.Append(CR)
		.Append("if (contentId != null) {")
		.Append(CR)
		.Append("contentId.style.display='inline';")
		.Append(CR)
		.Append("curTimerNum = curTimerNum + 1;")
		.Append(CR)
		.Append("if (curTimerNum >= numItems) clearInterval(timerId);")
		.Append(CR)
		.Append("}")
		.Append(CR)
		.Append("}")
		.Append(CR)
		.Append("</script>")
	End With

	Return jsBuilder.ToString
End Function

A bit of programming to be sure. But once you have dozens, hundreds, or even thousands of training pages using this code to generate their interactions, it is well worth it. .

Back to Top
 

   

MORE NEWS AND INFORMATION

Come See Us: The Platte Canyon World Tour

Here are the upcoming conferences and events that we have firmed up at this time:

TBCON One-Day Event
San Francisco, California
King George Hotel
October 10, 2004
http://www.tbcon.com/1dayevents.aspx

Training Fall
Booth 316
San Francisco, California
October 11 - 13, 2004
http://www.trainingfall.com

TBCON One-Day Event
New Orleans, Louisiana
February 27, 2005
http://www.tbcon.com/1dayevents.aspx

Training Spring
New Orleans, Louisiana
February 28 - March 2, 2005
http://www.trainingconference.com

TBCON One-Day Event
Orlando, Florida
June 5, 2005
http://www.tbcon.com/1dayevents.aspx

ASTD International Conference & Exposition
Booth 326
Orlando, FL
June 6 - 8, 2005
http://www.astd.org/astd/Conferences/ICE/ASTD2005.htm

Back to Top

Platte Canyon Products in the Pipeline

We're a couple of months away from releasing the updated "Learning & Mastering ToolBook Instructor 2004." That will be followed later this year by the Assistant 2004 version. Also on the scope for later this year is Tracker.Net version 3. On the medium horizon are new versions of Question, Exam Engine, and Web Player. Stay tuned!

Back to Top

   

Coming in the Next Issue of the EnterPage

  • San Francisco Report (TBCON One-Day Event plus Training Conference)
  • Another Plug-In Pro Tool Spotlight
  • More OpenScript Tips
  • More Actions Editor Tips
  • More VBTrain.Net Tidbits
  • Expert Information (from the "Learning and Mastering ToolBook..." Series)
  • More

Back to Top

About The EnterPage

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. 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.

Back to Top

Information on Subscriptions

To subscribe or unsubscribe, please send a message to EP@plattecanyon.com. Please include your name and company with new subscriptions.

Back to Top

 

All content copyright Platte Canyon Multimedia Software Corporation, 2004.