... | .. |
The EnterPage The Source for ToolBook and VBTrain.Net News |
... | From Platte Canyon Multimedia Software Corporation. In This IssueIntroduction ToolBook Tips and News VBTrain.Net Tips and News More News and Information |
|
IntroductionWe'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! |
||
Top StoriesOne-Day TBCON Events - Come a Day Early and LearnIf 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 TBCON 2004 Follow-UpAbout 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 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 . TBCON 2004 "Archives for Attendees" Now AvailableIf 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 Check Out a New Database-Driven VBTrain.Net ExampleOne 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.Come Visit Us at Training - FallIf 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 |
||
ToolBook Tips and NewsPlug-In Pro Tool Spotlightby 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 Expert Information from the "Learning & Mastering ToolBook..." Seriesby 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! OpenScript Tipby 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.Actions Editor Tipby 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. |
||
VBTrain.Net Tips and NewsVBTrain.Net Tidbitby 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. . |
||
MORE NEWS AND INFORMATIONCome See Us: The Platte Canyon World TourHere are the upcoming conferences and events that we have firmed up at this time: TBCON One-Day Event Training Fall TBCON One-Day Event Training Spring TBCON One-Day Event ASTD International Conference & Exposition Platte Canyon Products in the PipelineWe'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! |
||
Coming in the Next Issue of the EnterPage
About The EnterPageThe 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. Information on SubscriptionsTo subscribe or unsubscribe, please send a message to EP@plattecanyon.com. Please include your name and company with new subscriptions.
All content copyright Platte Canyon Multimedia Software Corporation, 2004. |