The EnterPage 10-01

The Source for ToolBook, VBTrain.Net, and FlashTrain news
from Platte Canyon Multimedia Software Corporation

 

February 12, 2007

 

In This Issue

 

Introduction

 

TOP STORIES

Sign Up for the ToolBook User’s Conference / e-Learning Authoring Conference

Dan Carr and Adam Brown Headline the Flash Track

Tim Barham, Denny Dedmore, Tom Hall, and Lee Karns Lead the ToolBook Track

Mark Henry, Joe Ganci, Bill Hurley, and Mike Cline Provide Management Insight

Jeff Rhodes, Stu Moriens, Simon Price, and Peter Hoyt are Featured Web Technology Faculty

Preconference Training is the Most Comprehensive Yet

Training Studio Update

 

TOOLBOOK TIPS AND NEWS

Blackcomb Preview Available

Plug-In Pro Tool Spotlight – Special Characters

Expert Information

OpenScript Tip

Web Hint

 

VBTRAIN.NET TIPS AND NEWS

VBTrain.Net Nugget

 

FLASHTRain TIPS AND NEWS

ActionScript Tip

 

MORE NEWS AND INFORMATION

Platte Canyon Products in the Pipeline

Coming in the Next Issue of The EnterPage

About The EnterPage

Information on Subscriptions

 

Introduction

 

Welcome to The EnterPage newsletter. Like many of you, I’m sure, we are up to our eyeballs in developing new products and updating existing ones. But we wanted to take a brief time out to share our excitement about our line-up for The ToolBook User’s Conference / e-Learning Authoring Conference this summer as well as share useful information on ToolBook, Flash, and .NET. Until next time, enjoy!

 

 

Top Stories

 

Sign Up for the ToolBook User’s Conference / e-Learning Authoring Conference

 

An attendee wrote in the evaluation for the 2006 conference, “You could have doubled the price and it still would not outweigh the value.” We didn’t take him up on that though. In fact, we’re pleased to announce that we were able to keep the low prices from last year’s ToolBook User’s Conference (TBCON) / e-Learning Authoring Conference (eLearnCon) unchanged for this year. This ninth edition of the conference continues the tradition of having 18 one-hour session blocks over three days, with each block having sessions on Flash, Management, ToolBook (Intermediate/Advanced), ToolBook (Introduction), and Web Technologies. And if that isn’t enough, we have a great lineup of preconference workshops as discussed later in this newsletter. In addition to all the scheduled learning, there will be three great receptions, the always popular “Hack Ack” contest, and the Help Desk where you can get answers to your individual questions. We hope you will join us!

 

Dates

 

July 30 – August 1, 2007

Preconference Training July 28 – 29, 2007

 

Pricing (All Options Include Three Meals per Day Plus Snacks)

Price is based on your lodging selection. The prices shown include the conference itself, all meals, and the specified lodging.

 

Off Campus - $750

Double Dorm Room - $825

Single Dorm Room - $895

Shared Apartment or CC Inn - $945

Single Apartment - $1,145

 

Preconference Training

Training can be taken in addition to the conference or on its own. Includes lunch but not lodging or meals.

 

One Preconference Session - $150

Two Preconference Sessions - $285

Three Preconference Sessions - $420

Four Preconference Sessions - $555

 

Links

Registration https://ssl2.securewebs.com/tbcon/register.aspx

Sessions: http://www.tbcon.com/tbconsessions.aspx

Preconference Workshops: http://www.tbcon.com/tbconPreconSessions.aspx

Faculty: http://www.tbcon.com/tbconpresenters.aspx

 

 

Dan Carr and Adam Brown Headline the Flash Track

 

We are thrilled to welcome Dan Carr, the developer of the Flash Learning Interactions for then Macromedia as well as a recognized guru in Flash video and other areas, to the e-Learning Authoring Conference faculty for the first time. Dan will show you how to create Flash components, how to synchronize your content and video, and the “do’s and don’t’s” of creating Learning Interactions.

 

Making his encore appearance on the faculty, Adam Brown of Oncall Interactive will teach you all about ActionScript 3, how to create an object-oriented architecture in Flash, how to build e-Learning games, and how to deploy Flash to mobile devices.

 

Jeff Rhodes will add some sessions on implementing SCORM with the ExternalInterface class, the in’s and out’s of Training Studio and the Army’s Enhanced Learning Flash templates, calling web services from Flash, and more.

 

Check out the web site at http://www.tbcon.com/tbconsessions.aspx for other sessions on the Flash track.

 

 

Tim Barham, Denny Dedmore, Tom Hall, and Lee Karns Lead the ToolBook Track

 

If there is a face of TBCON, it is Tim Barham, the ToolBook Development Manager for SumTotal Systems, Inc. As in past years, we’ll fly Tim all the way from Australia so that he can update you on the latest happenings in ToolBook, show you inside information on great new features such as “SmartPages” and “SmartStyles,” and perhaps even entertain us on the piano. Another staple of the conference, Denny Dedmore of SumTotal, will share his technical support insights and help you keep your ToolBook products on track. Look for many other members of the SumTotal development, management, and training teams to be on hand to share their insights, share the product roadmap, and gather your feedback.

 

Tom Hall, a leading ToolBook author, trainer, and consultant, will be on hand to show new ToolBook users how to use the Actions Editor, create simulations, HTTP Post to web sites, and make SCORM calls.

 

As he has every year since 1999, Lee Karns will share his expertise in such topics as simulations, templates, question objects, and extended property editors.

 

With both Introductory and Intermediate/Advanced tracks, virtually every aspect of ToolBook will be covered by such experts as Simon Price, Stu Moriens, Jeff Rhodes, and Dan Richards. Check out the web site at http://www.tbcon.com/tbconsessions.aspx to see the whole lineup.

 

 

Mark Henry, Joe Ganci, Bill Hurley, and Mike Cline Provide Management Insight

 

The e-Learning Management track that we introduced last year was universally popular with attendees. We’ve made it even better this year with the addition of Mark Henry, industry expert and the host of The Alternative Authorware Conference. Mark will show you how to implement e-Learning games, model business practices, get your students to practice their new skills, and avoid pitfalls in rapid development.

 

Joe Ganci, president of Dazzle Technologies, will share his insights on how to put Murphy in his place when things start going horribly wrong, how to add games to your training, how to set up engines and shells for faster, cheaper and better e-Learning, and more.

 

Bill Hurley of American Signature will share his expertise in the Kirkpatrick-Deming model for performance improvement, e-Learning project planning, how to build custom LMS reports with Crystal Reports, and how to validate your test questions.

 

Longtime faculty member Mike Cline of Venturist, Inc. brings his day job of teaching the widely respected “Prometheus Process” of strategic planning to both the conference and preconference.

 

Jeff Rhodes and Dan Richard also contribute to the Management track.

 

See the whole list of sessions at http://www.tbcon.com/tbconsessions.aspx.

 

 

Jeff Rhodes, Stu Moriens, Simon Price, and Peter Hoyt are Featured Web Technology Faculty

 

Many e-Learning projects don’t fit into a single category. You might need to call JavaScript functions from ToolBook, talk to a .NET web service from Flash, store your information in XML, create templates across authoring tools, and more. Jeff Rhodes shares programming tips in JavaScript, Flash, ToolBook, and .NET. He also demonstrates how to use products like Captivate, Training Studio, Exam Engine, and the Army’s new Enhanced Learning tool.

 

Stu Moriens of Tricore Interactive delves into Flash/ToolBook integration, creating templates, and deployment to iPods and other mobile devices. Simon Price of the University of Bristol will cover a plethora of technologies such as AJAX and server-side scripting. Peter Hoyt will demonstrate how to extend both Tracker.Net and ToolBook. XML-guru Mike Cline will show you the ins and outs of XML as well as how to program control structures in various languages. Go to http://www.tbcon.com/tbconsessions.aspx to learn more.

 

 

Preconference Training is the Most Comprehensive Yet

 

We have perhaps our strongest lineup of preconference workshops ever. Attendees for Mike Cline’s “Strategic Planning and Execution” workshops on Sunday, July 29 will receive a free copy of “Winning in FastTime” by John A. Warden III and Leland Russell. These sessions are limited to 20 participants, so don’t delay. We’re also thrilled to have Mark Henry’s “Gaming and Simulation - Design and Development” workshops (parts I and II) the same day. Every time I have seen Mark Henry speak, the room has been packed!

 

For those of you needing to learn ToolBook for the first time or brush up on your skills, Lee Karns, Tom Hall, and Bill Hurley have you covered. Finally, Jeff Rhodes will train you in programming, Training Studio, JavaScript, and ActionScript.

 

Here is the complete preconference lineup:

 

Saturday, July 28, 8 AM – Noon

 

A Detailed Look at Creating Simulations in ToolBook Instructor – Tom Hall

Programming 101 – Jeff Rhodes

ToolBook for Absolute Beginners (Hands on) – Lee Karns

 

Saturday, July 28, 1 – 5 PM

 

ToolBook Question Objects and Media (Hands on) – Lee Karns

Training Studio – Jeff Rhodes

Using the ToolBook Instructor Actions Editor – Tom Hall

 

Sunday, July 29, 8 AM – Noon

 

Gaming and Simulation - Design and Development I – Mark Henry

JavaScript for ToolBook, ASP.NET, and Flash – Jeff Rhodes

Strategic Planning and Execution Workshop (Part 1) – Mike Cline

The Actions Editor for Beginning and Intermediate ToolBook Developers – Bill Hurley

ToolBook Templates (Hands on) – Lee Karns

 

Sunday, July 29, 1 – 5 PM

 

Creating Catalogs and Catalog Objects (Hands on) – Lee Karns

Gaming and Simulation - Design and Development II – Mark Henry

Introductory and Intermediate Flash ActionScript – Jeff Rhodes

OpenScript for Beginning and Intermediate ToolBook Developers – Bill Hurley

Strategic Planning and Execution Workshop (Part 2) – Mike Cline

 

 

Training Studio Update

 

We are on track to release Training Studio by the end of March. Its basic concept is that the subject matter expert (SME) enters the training content into a database rather than inside an authoring tool. At the same time, the SME selects an interaction type (Timed Bullets, Rollover Hotspots, Multiple Choice Question, etc.) from a supported list. Media and graphics are stored externally and referenced in the database. The e-Learning itself is then generated at runtime by loading the database and the external media/graphics. Advantages of this approach include the ability to quickly update content, the reduced tool-specific training needed for SME’s, the ease of supporting multiple languages, and greatly reduced development/maintenance time. Training Studio uses Flash templates and will possibly support other output formats in later versions. Flash developers can edit the templates and create new ones if desired. There is a wide array of built-in functionality including SCORM 1.2/2004 support, a complete review/comment tracking system, pausing and restarting of audio, and page completion display. Learn more at: http://www.trainingstudio.net.

 

Pricing

 

Development license (includes all templates and their Flash source, up to three licenses of the Training Studio Content Editor, one license of the Training Studio Publisher, unlimited copies of the Training Studio Comment Administrator, and the Training Studio Comment Tracker web service with its Visual Studio.NET 2005 source files) - $1,995

 

Additional Licenses of Training Studio Content Editor (for use by subject matter experts) - $295 each

 

 

TOOLBOOK TIPS AND NEWS

 

Blackcomb Preview Available

 

As many of you already know, there is a new ToolBook “Blackcomb” preview edition available. We’re particularly excited about the new “SmartPages” and “SmartStyles” concept that Tim Barham explains in the blog (http://www.toolbook.com/blog) and will be covering at TBCON. You can sign up for the preview at http://www.toolbook.com/preview.

 

 

Plug-In Pro Tool Spotlight – Special Characters

 

Have you ever found yourself searching for the right ANSI number for special characters like £ (163), À (192), or © (169)? Or after you figure out the right combination, do you have to work hard to remember to press Alt - 0 followed by the number (using the numeric keypad)? Do you need a faster way? If so, the Special Characters option in the Plug-In Pro is for you. You just show its floating toolbar and you can choose the desired character from the menu. The Plug-In Pro then automatically inserts it into your field or recordfield.

 

Here is a link to the help topic for this tool: http://www.plattecanyon.com/help/pluginpro/Characters_-_Insert_Special.htm

 

 

More information on Plug-In Pro and a free trial version are available at:

 

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

 

 

The following are from the "Learning & Mastering ToolBook" series

 

Expert Information

 

By Simon Price, University of Bristol

 

JavaScript for OpenScript Programmers

 

I thought I'd chip in with a few comments relating to JavaScript

 

1. JavaScript for OpenScript programmers

 

If you already know OpenScript (OS) then JavaScript (JS) is pretty easy to learn.

 

- OS has "to handle", "to set" and "to get" whereas JS does everything through "function". To return a value, both languages use "return" (although OS only allows that in a "to get"). JS has no direct equivalent of "to set".

 

- OS has (according to Claude Ostyn) a "containment inheritance" object model (i.e., it's up to the programmer to stick "forward" statements in) and messages bubble up the object tree. JS has a "prototype based" object model which is much simpler (and less sexy) than the OS one. In fact, most JS programmers write their code in a non-object orientated way and this is likely to be the most appropriate way of writing little JS functions to work with the ToolBook (TB) web runtime. (i.e., you probably don't need to know much about the JS object model unless you plan to write a JS application)).

 

- The one thing you will need to know is how to refer to JS built-in objects. TB uses a notation "x of y" or "x of y of z". JS uses the C++/Java-style dot notation "y.x" or "z.y.x".

 

- Both JS and OS use untyped variables. Naughtily, they both automatically declare variables on first use if they're not declared already.

 

- Nice things in JS, not built into OS are regular expressions (these "regex" are amazingly useful once you get used to them) and content addressable arrays (aka hashes). Regex are great for extracting info from strings or validating content. Hashes allow you to have arrays indexed on strings instead of numbers (e.g., a["hello world"] = "fred") which makes life a lot easier. OS system books have a set of functions to do this but they're not as fast or clean as the built-in JS ones.

 

2. Authoring Web content using ToolBook

 

TB is great for producing mini authoring environments that generate (static) Web content based on your own templates. I've been doing this using a combination of TB and the free MSXML4 library. You can generate hundreds of web files in no time at all based on content edited with TB and processed with XSLT. But this is hard

 

A few years back I also created a simple version of ASP, which for want of a better term, I'll call OSP that lets you compose page templates just as you would ASP pages (using <% %> and <%= %>). These are compiled by a short OS script to generate OpenScript functions that can be called to generate Web pages (or XML data).

 

 

OpenScript Tip

 

By Jeff Rhodes

 

Hierarchy

 

As a general rule, you should "forward" Instructor's standard OpenScript messages such as enterApplication, leaveApplication, enterPage, leavePage, mouseEnter, and mouseLeave. You are also perfectly free to handle these messages. This points out a very useful concept:  the ability to handle the same message on multiple levels. This allows you to do "specific" things at a local level and "general" things at a higher level. The OpenScript below shows a simple example of the enterPage and leavePage handlers at the page and book levels.

 

Notice that we forward the message first (which unlocks [on enterPage] or locks [on leavePage] the screen) before performing our desired actions.

 

to handle enterPage  -- page script

       forward -- unlocks screen at book level

       mmPlay clip "xyz" wait

       show field "explanation"

end enterPage

 

to handle enterPage -- book script

       sysLockScreen = false

       forward

end enterPage

 

to handle leavePage -- page script

       forward -- locks screen at book level

       hide field "explanation"

end leavePage

 

to handle leavePage -- book script

       sysLockScreen = true

       forward

end leavePage

 

 

Web Hint

 

By Denny Dedmore

 

Numeric Formatting in the Actions Editor

 

A ToolBook List user asked: "Is there any way, using the Actions Editor, to format a number? We need to show a number with two decimal places. That is, 34.20 rather than 34.2 or 34.00 rather than 34."

 

Denny's response:

Here's one way to do it, via code.

 

If you will be using it often, in many places, it would be better to convert this into a Shared Action so that it can be called like a function.

 

****

Define local variable "pos" (Initial value: "")

Define local variable "val" (Initial value: "")

Define local variable "ct" (Initial value: "")

 

Display query: "Enter a number:"; store response in val

If val contains "."

       Set ct to charCount(val)

       Comment: If only 1 decimal place showing, add a 0 to pad it to 2

       If offset(".",val) = ct - 1

              Set val to val & "0"

       Else

              Comment: To get here, number must be showing decimal value

              Comment: with 3 or more decimal places...so lets round it to 2

              Set val to round(val*100)/100

       End if

Else

       Comment: If the number does not contain a decimal, add one and 2 zeros

       Set val to val & ".00"

End if

Display alert: "The rounded to 2 places answer is: " & val

 

 

VBTRAIN.NET TIPS AND NEWS

 

VBTrain.Net Nugget

 

by Jeff Rhodes

 

Web Service “Comment” Categories

 

One of the things that we wanted to add to our upcoming Training Studio was a mechanism for a reviewer of the content to be able to send comments that would be stored on a web server. A separate “Administrator” application can then view the comments by application and reviewer, document the actions taken, close comments, etc. We implemented this with a .NET 2.0 web service with some methods that can be called from the training (Flash) and others that are called by the Administrator application (.NET Windows Forms).

 

One such method called by the training is RetrieveCategories. We call this method from Flash to get the list of both Comment categories (comment, problem, suggestion, etc.) and Reviewer categories (management, student, subject matter expert, etc.). The developer can thus use the same comments movie for different customers and change the types of comments and reviewers by customer.

 

This method is shown below:

 

<WebMethod()> _

Public Function RetrieveCategories() As DataSet

Dim catDataSet As DataSet = Me.CategoryDataSet

 

Return catDataSet

End Function

 

The method turns around and looks for the CategoryDataSet property, which is implemented like this.

 

Private ReadOnly Property CategoryDataSet() As DataSet

       Get

              Dim dataSetId As DataSet

 

              If Current.Cache("CategoryDataSet") Is Nothing Then

                     dataSetId = Me.GetCategoryDataSet(Me.ConStrBase)

                     Current.Cache("CategoryDataSet") = dataSetId

              Else

                     dataSetId = CType(Current.Cache("CategoryDataSet"), DataSet)

              End If

 

              Return dataSetId

       End Get

End Property

 

The property is read only since we only want to read what the categories are. There is no mechanism from within the web service to set the categories. Rather, this is done by editing the Access database directly.

 

Our first step is the check the Cache of the web server to see if the DataSet (a .NET collection of database tables) CategoryDataSet is already stored. Since it is much quicker to read it out of memory than to query the database, we store it in memory as long as the web server has room. This means that if 100 comment windows are populated via the web service per hour, only the first one has to take the time to actually read the database to get the list of categories.

 

If the DataSet is not in memory, we call the GetCategoryDataSet method, passing in the connection string stored in the ConStrBase property:

 

Private ReadOnly Property ConStrBase() As String

       Get

              Dim baseString As String

 

              If Current.Cache("ConStrBase") Is Nothing Then

                     baseString = String.Format("provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}App_Data\", Current.Request.PhysicalApplicationPath)

                     Current.Cache("ConStrBase") = baseString

              Else

                     baseString = CStr(Current.Cache("ConStrBase"))

              End If

 

              Return baseString

       End Get

End Property

 

This whole property is the “provider” for reading the database (the Jet provider in this case since we are using an Access database) and the path to the database. Notice how we use Request.PhysicalApplicationPath to dynamically determine the location on the actual web server. This allows the web service to be placed anywhere on the web site (though it must be a virtual directory using ASP.NET 2.0).

 

The implementation of GetCategoryDataSet uses the dbName and reviewTableNameArray variables as shown below.

 

Private Const dbName As String = "TSTracker.mdb"

Private reviewTableNameArray As String() = {"CommentCategories", "ReviewerCategories"}

 

Here is the implementation.

 

Private Function GetCategoryDataSet(ByVal baseString As String) As DataSet

       Dim conStr As String = String.Concat(baseString, dbName)

       Dim dataSetId As New DataSet

       Dim oledbConId As New OleDbConnection(conStr)

       Dim dbCommandId As New OleDbCommand

       Dim dbAdapterId As OleDbDataAdapter

       Dim tableName As String

       Dim tableNum As Integer = 0

 

       If oledbConId.State <> ConnectionState.Open Then

              oledbConId.Open()

       End If

      

       With dbCommandId

              .Connection = oledbConId

              .CommandType = CommandType.StoredProcedure

       End With

 

       For Each tableName In reviewTableNameArray

              dbCommandId.CommandText = String.Format("Read{0}", tableName)

              dbAdapterId = New OleDbDataAdapter(dbCommandId)

              dbAdapterId.Fill(dataSetId)

              dataSetId.Tables(tableNum).TableName = tableName

              tableNum += 1

       Next

 

       oledbConId.Close()

 

       Return dataSetId

End Function

 

The first step is to build the entire connection string conStr. We then make a new DataSet, dataSetId, that we’ll fill with the appropriate information. We connect to the database, storing the connection in oledbConId, and then create the OleDbCommand object to query the database and the OleDbDataAdapter object to fill our dataSetId DataSet. We open the database and tell the command object that we are going to be using stored procedures (queries in Access). We then step through each of the table names we want to read (CommentCategories and ReviewerCategories). We judiciously named the queries in Access that we use to read the information ReadCommentCategories and ReadReviewerCategories. That allows us to call each of those queries within the loop, fill the DataSet with its information, and then name that table. Finally, we close the connection and return the DataSet.

 

Calling this method from returns this XML:

 

<?xml version="1.0" encoding="utf-8" ?>

<DataSet xmlns="http://www.trainingstudio.net/trainingStudiotracker/">

<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

// Schema information deleted for space reasons

- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">

- <NewDataSet xmlns="">

- <CommentCategories diffgr:id="CommentCategories1" msdata:rowOrder="0">

  <CommentCategoryId>1</CommentCategoryId>

  <CommentCategoryName>Comment</CommentCategoryName>

  </CommentCategories>

- <CommentCategories diffgr:id="CommentCategories2" msdata:rowOrder="1">

  <CommentCategoryId>3</CommentCategoryId>

  <CommentCategoryName>Problem</CommentCategoryName>

  </CommentCategories>

- <CommentCategories diffgr:id="CommentCategories3" msdata:rowOrder="2">

  <CommentCategoryId>2</CommentCategoryId>

  <CommentCategoryName>Suggestion</CommentCategoryName>

  </CommentCategories>

- <ReviewerCategories diffgr:id="ReviewerCategories1" msdata:rowOrder="0">

  <ReviewerCategoryId>5</ReviewerCategoryId>

  <ReviewerCategoryName>Instructor</ReviewerCategoryName>

  </ReviewerCategories>

- <ReviewerCategories diffgr:id="ReviewerCategories2" msdata:rowOrder="1">

  <ReviewerCategoryId>4</ReviewerCategoryId>

  <ReviewerCategoryName>Management</ReviewerCategoryName>

  </ReviewerCategories>

- <ReviewerCategories diffgr:id="ReviewerCategories3" msdata:rowOrder="2">

  <ReviewerCategoryId>7</ReviewerCategoryId>

  <ReviewerCategoryName>Safety</ReviewerCategoryName>

  </ReviewerCategories>

- <ReviewerCategories diffgr:id="ReviewerCategories4" msdata:rowOrder="3">

  <ReviewerCategoryId>2</ReviewerCategoryId>

  <ReviewerCategoryName>Student</ReviewerCategoryName>

  </ReviewerCategories>

- <ReviewerCategories diffgr:id="ReviewerCategories5" msdata:rowOrder="4">

  <ReviewerCategoryId>1</ReviewerCategoryId>

  <ReviewerCategoryName>Subject Matter Expert</ReviewerCategoryName>

  </ReviewerCategories>

- <ReviewerCategories diffgr:id="ReviewerCategories6" msdata:rowOrder="5">

  <ReviewerCategoryId>3</ReviewerCategoryId>

  <ReviewerCategoryName>Training Developer</ReviewerCategoryName>

  </ReviewerCategories>

</NewDataSet>

</diffgr:diffgram>

</DataSet>

 

We will show the Flash part of this below in the ActionScript Tip.

 

 

 FLASHTRAIN TIPS AND NEWS

 

ActionScript Tip

 

By Jeff Rhodes

 

As described in the VBTrain.Net Nugget above, we wanted to read Comment and Reviewer categories from a web service and display them in a List component for the reviewer (the user) to choose from when adding a comment (the web service also stores the reviewer’s information and the comment itself, but that is beyond the scope of this article).

 

The first step on the Flash side is to declare the WebServiceConnector component and set its WSDLURL parameter to the URL of the web service definition. In our case, this is http://www.plattecanyon.com/TrainingStudioTracker/TSTracking.asmx?WSDL. The available operations (which correspond to the WebMethods in the web service) are available via the drop-down list. We select RetrieveCategories. When the comment movie loads, it calls the web service (if the array of categories has not already been read this session) using this ActionScript:

 

function callInitializationWebService():Void {

       var connectorId:mx.data.components.WebServiceConnector = WSConnector1;

      

       connectorId.addEventListener("send", onSendResult);

       connectorId.addEventListener("result", onInitializationResult);

       connectorId.addEventListener("status", onInitializationStatus);

       connectorId.trigger();

}

 

We define methods to be called in response to the send, result, and status events. For send, we just display a message saying that we are connecting to the web service. For status, we display any error message returned from the service. The heavy lifting comes when we receive the resulting XML from the web service:

 

function onInitializationResult():Void {

       var connectorId:mx.data.components.WebServiceConnector = WSConnector1;

       var resultsXml:XML = connectorId.results.diffgram;

       var arrayCounter:Number = 0;

      

       resultsXml.ignoreWhite = true;

      

       var docElementId = resultsXml.firstChild; // NewDataSet

       var categoryList = docElementId.childNodes; // Has both Comment and Reviewer categories

      

       categoryArray = new Array();

      

       for(var n=0; n<categoryList.length; n++){

              // loops through each category entry

              var categoryElements = categoryList[n].childNodes; // categoryId, etc.

              var categoryData:Object = new Object();

             

              for(var m=0; m<categoryElements.length; m++){

                     categoryData[categoryElements[m].nodeName] = categoryElements[m].firstChild.nodeValue; //categoryId, FirstName, etc.

              }

              categoryArray[arrayCounter] = categoryData;

              arrayCounter ++;

       }

       TSCommon.commentCategoryArray = categoryArray;

       loadCategories(categoryArray);

       statusTextId.text = "";

       connectorId.removeEventListener("send", onSendResult);

       connectorId.removeEventListener("result", onInitializationResult);

}

 

The return value from the web service call is in the connectorId.results property. By experimenting and looking at this property in the Flash debugger, I discovered that if I referenced the diffgram node directly (see the returned XML in the previous article), I could read the .NET DataSet directly as XML. This is a nice result. We then read the XML into an array of arrays so that we don’t have to call the web service again during the current session. We store the array in a static variable of the TSCommon class. We then call the loadCategories method that takes the array and populates the displays for the reviewer. We remove the send and result events because we reuse the WebServiceConnector later on when sending a comment.

 

Here is the implementation of loadCategories.

 

function loadCategories(categoryArray:Array):Void {

       var arrayCounter:Number;

       var categoryData:Object;

       var catId:Number;

       var catName:String;

       var isComment:Boolean;

      

       for(arrayCounter=0; arrayCounter<categoryArray.length; arrayCounter++) {

              categoryData = categoryArray[arrayCounter];

              for (var keyId in categoryData) {

                     switch(keyId)

                     {

                           case "CommentCategoryId":

                                  isComment = true;

                                  catId = Number(categoryData[keyId]);

                                  break;

                          

                           case "CommentCategoryName":

                                  isComment = true;

                                  catName = categoryData[keyId];

                                  break;

                                 

                           case "ReviewerCategoryId":

                                  isComment = false;

                                  catId = Number(categoryData[keyId]);

                                  break;

                          

                           case "ReviewerCategoryName":

                                  isComment = false;

                                  catName = categoryData[keyId];

                                  break;

                     }

              }

              if (isComment == true) {

                     CommentCategoryList.addItem({label:catName, data:catId});

              }

              else {

                     ReviewerCategoryList.addItem({label:catName, data:catId});

              }

       }

       CommentCategoryList.selectedIndex = 0;

       ReviewerCategoryList.selectedIndex = 0;

}

 

In this method, we step through each category and determine if it is a Comment Category or a Reviewer Category. We then add it to either the CommentCategoryList component or the ReviewerCategoryList component. The syntax for adding an item ({label:catName, data:catId} ) is significant. We display the name of the category (such as “Suggestion”) but store as data the primary key (2). When it comes time to save the content back to the web service, we use this primary key.

 

 

MORE NEWS AND INFORMATION

 

Platte Canyon Products in the Pipeline

 

First up on our release schedule is Training Studio as discussed above. We are also working on an intermediate release of ToolBook Translation System and a new version of Plug-In Pro. Once there is a 32-bit build of ToolBook Blackcomb, we will be updating our Learning & Mastering ToolBook product.

 

 

Coming in the Next Issue of The EnterPage

 

·         Another Plug-In Pro Tool Spotlight

·         More Expert Information, OpenScript Tips, and Web Hints from the "Learning & Mastering ToolBook" series

·         Another VBTrain.Net Nugget

·         Another ActionScript Tip

·         More

 

 

About The EnterPage

 

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

 

 

Information on Subscriptions

 

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