Where is Null?

Update

An upgraded version of this blog can be found under this link.



Confession

Today I realized that one of my (hidden) reasons for starting this blog 5 months ago, is ... my laziness!
 
Why? Some questions appear often on the user forums, Twitter, Linkedin. Most of my postings here just give an answer to those popular questions. Now it is so easy: just point at the appropriate blog post, no need to having to repeat the same answer again and again. And the subject of this article is such a question.
 

Question 

This popped up yesterday on Twitter, quote:
"Any idea how to reference null value in CP5 advanced action? As in v_SomeVar is not equal to null? Is it a system variable?"
My answer (in less than 140 characters);
No system variable in AdobeCaptivate: vreate user variable, value empty and conditional action.

Use case: account

To explain this cryptic answer, I will show the rather common use case where a user has to type in his name (login) and password. Beware: I will not check here if the password is the correct one, only check if the user has indeed typed a name and a password, if the fields are not left empty by the user.
 
Most programming languages do have something like 'Null' if you want to check if a variable is empty, but this is not the case for the simple scripting solution, called advanced actions, in Captivate. As I answered there is no system variable provided. It is also not possible to create a condition like:
IF  v_name =
Such a condition will be marked as incomplete, because there is nothing to compare the variable v_name with. Strings (text) are not between " " as in some programming languages, so this solution is not working either:
IF  v_name = ""
This will be interpreted as if the variable needs to have the content ''" which is not the case of course.
 

Try it

Please play with this movie to catch the workflow. You will be asked to type in your name. Clicking on Submit wil result in checking if the Text Entry Box is left empty. In that case a text caption will pop up to warn you. If you have typed in a name, another text caption pops up (using your name) and the Text Entry Box for the Password will be enabled while the Name TEB is disabled. Same scenario for this password field: if it is left empty wjen submitting a Text Captino will pop up. If you typed a password (be sure to remember what you typed) you will navigate to the next slide. There you will be asked to confirm the password.

Variables

I created 4 user variables:
  • v_null  is the magical replacement of Null, be sure to put nothing in the Value on defining this variable, it has really to be empty
  • v_name  will store the entry in the TEB for the name
  • v_password   will store the entry in the TEB for the password
  • v_pass2   will store the entry in the TEB on the last slide, where the password has to be repeated.

Text Entry Boxes

None of the TEB's has the 'Validate user iinput' checked, because we do not have any correct entries, user is free to choose a name/password. The Text Entry Boxes for the password have both 'Password field' checked so that the input characters while typing are replaced by asterisks. Each TEB triggers an advanced conditional action:
  • Checkname   is triggered by the TEB for the name

  • CheckPassword    is triggered by the TEB for the password

  • PassSecond    is triggered by the second password TEB
In the Image Gallery you will find those three advanced actions. I'm prepared to offer you the file (Captivate 5), but cannot include it here. Please send me a DM on Twitter with your e-mail address or post it in the comments here and I'll send you a link. If you really want more explanation about the actions, leave a comment.

 

One Submit button for Multiple Text Entry Boxes?

Intro

Yesterday I published an article explaining in detail a use case that I worked out, based on the question of someone on the Captivate forums. Here is a link to the thread, because I think it is an interesting 'conversation'; this article is not an answer to the original question, so please scroll down in the long thread:

Question

She wanted to create a slide with multiple Text Entry Boxes to be filled in by the user. The entry should be validated and only one correct entry possible, with multiple attempts allowed. But the sequence of the fields was to be chosen by the user, not imposed. And the use should be able to check at any moment if his entries were correct/incorrect, by using a unique Submit button. Only after having all entries correct, a button Continue should appear. If possible, the shortcut key TAB could be used to navigate between the text fields, as well as clicking in the text fields to start input.

Result

You will be able to watch the result. But I did simplify a little bit:

  • I worked it out for only three Text Entry Boxes on the slide, but it can easily be extended to more of course.

  • The user can choose the sequence, but he has to click in the text field. Only then the sequence is not imposed. The principal reason is however that it is not possible to assign the same shortcut key to different objects on one slide as I explained in this blog post: Warning tip: shortcut keys. You cannot use TAB twice or more on the same slide as shortcut key.

  • There is a unique Submit button. The user can click it whenever he wants: after filling in 1, 2 or 3 Text Entry Boxes to get feedback.

  • I choose a symbol (correct/incorrect) as feedback. Those symbols can easily be replaced by Text Captions if wanted, work flow will be the same.

  • After validation of the three entries, a second button Continue appears that triggers (in my example) the action 'Go to Next slide'. But of course it is possible to trigger another action.

Published SWF

Watch this movie to check the functionality. It has 3 slides. On the Welcome slide you will find the correct entries for the Text Entry Boxes on the second slide. Try out the second slide: fill in text fields, click the Submit button to check input. Whenever a Text Entry box is validated, it will be disabled, you cannot change the entry anymore. When all entries are correct the Continue button appears that gets you to the last slide.
There is an extra button on the slide 'Show/Hide'. It is a copy of the toggle button, explained in a previous blog post, that will show/hide a text caption with the values of different user variables. This will normally not be done, but it shows how I do a debugging of an advanced actions by observing the way user variables are reacting to actions on the slide.

Link

De tailed explanation of my work flow, for the user variables and advanced actions can be found in this article:
Multiple TEB's - one Submit
You will see, as a reaction to one of the last questions,that I created user variables to store the correct entries. That way the advanced action will be more easily be reused in other projects. My work flow, to save time and avoid typos was:
  • define the user variable and add the value (= correct entry)

  • copy the value to the clipboard

  • define the Text Entry Box, and paste the clipboard content as entry to be validated in the HUD

Toggle button

Update: If you are a recent version of Captivate (9, 10 or 11) please have a look at :

http://blog.lilybiri.com/1-action-equals-5-toggle-buttons

Intro

In this blog posting To blog or not to blog (scroll to the end of the text please) I offered a tip to create a toggle button to turn on/off audio, playbar etc. This tip works only if a Boolean type system variable is available. Such a variable has in Captivate only two possible values: 1 (= true, yes) and 0 (= false, no).

Yesterday got this question on the user forum: How can I create a toggle button to show/hide a text caption? And I thought offering my answer in a blog post could be useful for other users. Moreover, I remember when starting this blog that it was meant to offer small tips, but now I see that a lot of my postings are not small at all :-)

Variable

To realize such a toggle, I transformed the forementioned tip a little bit. Since there is no system variable that stores the visibility of an object like a Text Caption I started by creating a user variable that would take over that role. Like the system variables (examples like cpCmndShowPlaybar,cpCmndCC, cpCmndMute) this user variable should store the value 1 when the object is visible or 0 when it is invisible. I labeled this variable  v_visib.

 

Advanced action

The advanced action to be triggered by the toggle button is a conditional action with one decision. In the Image Gallery you'll find the script for this action, labeled Toggle.

Condition is simple: check the value of v_visib

IF

v_visib is equal to 1

If this condition results in a positive answer, this means that the object (here the tekst caption labeled MyTC) is visible. It has to be made invisible (using the Hide command). Then you have to change the value of the user variable v_visib to 0. This can be done with a Assign command, but I used the same Expression as in the previous blog post about toggle, because it saves me some time: the scripts for THEN and ELSE are now identical with the exception of the first statement.  To avoid that the playhead moves on after releasing the pause of the button I rewind the playhead using the system variables rdcmndGotoFrame and rdinfoCurrentFrame.  

THEN

Hide

MyTC

 

Expression

v_vsib = 1 - v_visib

 

Assign

rdcmndGotoFrame with rdinfoCurrentFrame

If this condition results in a negative answer, this means that the object (here the tekst caption labeled MyTC) is invisible. It has to be made visible (using the Show command). Then you have to change the value of the user variable v_visib to 1. To avoid that the playhead moves on after releasing the pause of the button I rewind the playhead using the system variables rdcmndGotoFrame and rdinfoCurrentFrame

ELSE

Show

MyTC

 

Expression

v_vsib = 1 - v_visib

 

Assign

rdcmndGotoFrame with rdinfoCurrentFrame

 

More ideas

  • This toggle is not limited to show/hide captions only of course, you can use it for any object and even for more objects, edit first statement and/or add similar ones.
  • You can use a similar script for Enable/Disable too.
  • Pity that it is not possible yet to export/import small scripts like this example. However you can add the script to a template. That is a way to be able to reuse the script and not have to create it all the time.

Tiny Timeline Tidbits

Intro

No one can doubt about the importance of the timeline panel in Captivate projects, but from frequent questions during webinars and on the forum, it seems that not all aspects, functionality are that well known. With this posting I want to explain a little bit and offer personal tips. Screenshots are from Captivate 5 but a lot  is also valid for version 4.


Timelines in Captivate  (illustrated by Image Gallery)

Captivate has different kind of timelines:
  • Slide timeline, which is really the timeline for the background of the slide: Question slides (including Score slide) and Full Motion Recording slides (when created by Captivate during capturing) by default have only this timeline, although you can add objects later on.
    Have a look at image 1 (SingleTimelines) that shows a FMR, a Question slide and a Score slide. All other images have the slide timeline at the bottom of the stack (example in image 2: Normal).
  • Audio timeline: if there is audio on the slide it will have its own timeline, and this will be under the slide timeline; audio attached to an object has not an individual timeline, you have to look for a small audio-icon next to the object.
    An audio timeline (and audio attached to an object, in this case TEBChoice) is visible in image 3 (EffectsAudio)
  • Object timeline: on most slides you will have objects on the background, each object has its own timeline and the location in the stack defines the priority (Arrange command or dragging allows you to change which object will be in front). Have a look at the object timelines in image 2 (Normal) and watch the color code and information on those object timelines.
  • Effects timeline (only in CP5) is visible in image 3 (AudioEffects); duration of this timeline is synchronized with the duration of the object timeline. 
  • Slidelet timeline: a rollover slidelet has its own timeline as you can see in image 4 (SlideSlidelet)
  • Pro ject created from a Powerpoint-Presentation, before adding any object will have typically one of the timelines you'll see in the image 5: if you choose to use 'Automatically advance' on creation, you will have a slide timeline with a duration that is taken from Powerpoint. This is really a FMR-timeline, because animation will be included, but the typical red bar doesn't show up here. If you choose to use 'On Mouse Click', there will be a click box inserted at the end of the slide (0,3sec before end) that pauses at the end of the slide. If you want to have the possibility to click earlier, change the start time of this click box. Both typical timelines are visible in image 5 (PPTImport).
There are also timelines in the Audio and Video edting dialog boxes.

Color code of timelines

Yellow = mouse object  (not in CP6 it is more 'beige')  
Grey = slide background, audio
Blue = if no action from user necessary: Text Caption, Highlight box, Drawing object, Text Animation, Animation , Video
Green = when action from user: Zoom Area, Rollover Text/Image, Rollover slidelet, Click box, Button, Text Entry Box

In CP6: selected timeline will be dark blue. Groups of objects are light grey.


Tiny buttons and symbols

 The timeline panel has a lot of tiny buttons/symbols. Watch this Captivate-SWF where I try to explain the functionalities of those buttons.
 

Hiding is not always hiding?

On the timeline by clicking on the dot under the Hide and the Lock heading you can hide or lock. I had to answer different questions like 'Why should you hide/lock something on the stage? What are the consequences? What is the difference with desetting the visibility for an object ?

Lock is easy to explain: if you lock a slide, you cannot edit anything on that slide, no moving, no resizing no adding/deleting/editing objects.
If you lock an object: you cannot select, duplicate, move, resize, edit nor delete that object. This feature is useful when editing slide to avoid accidentally editing.
Locking slides/objects has no consequences whatever on your published SWF, no need to unlock before publishing.

Hide is a different 'beast':
  • If you hide a slide (click the Hide dot on the level of the slide Timeline) it will not be visible when previewing, not when published. It has the same effect as using Hide Slide from the right-click menu on the slide in the filmstrip or the stage. Shortcut is SHIFT-CTRL-H. In all the cases an 'eye' icon will appear in the filmstrip under the hidden slide.
  • If you hide an object by clicking on the Hide dot on the level of the object timeline, the object becomes invisible on the stage but not in the filmstrip. Moreover: when previewing or after publishing to SWF you will see this object. This 'Hide'-action is totally different from setting the visibility of the object to false. It is meant only to make selecting and editing of objects on a complicated slide easier. If you have such a slide there will be a lot of timelines and it is not easy to select an object that is under other objects in the stacking order of those timelines. You can always select the object on the timeline, or you can hide objects that are on top of other objects. One example: you have a click box on top of the timeline that covers up all the slide, you will not be able to select any other object on the stage in that case.  No need to unhide those objects before publishing normally, except when you want output to a Word-document: hidden objects will not be printed. That can be welcome if you want to hide some success/failure captions on the printed output.


Shortcut keys

Perhaps you know already that love using shortcut keys. And the timeline panel has a lot of them.
 

Zooming : In CP4 you could zoom in/out on the timeline using CTRL-mousewheel but that is no longer possible in CP5.  In CP4 there was also a menu (loupe icon with several settings) to change the zoom of the timeline, this is gone in CP5 too. You have to use the slider at the bottom of the Timeline panel in CP5. But for exact timing the timing part in the Properties panel is of course always available.

Spacebar or F3: alternative shortcuts for the play button on the timeline panel; use this for editing timing, for synchronizing but do know that it is not a real Preview like the other options under Preview! Use this 'Slide Preview' (you can also scrub) to position the Playhead, and you can then easily synchronize start times of objects with this Playhead position. If you insert a new object it will always have its start time set to this Playhead position.

CTRL-E: to extend the duration of a selected object till the end of the slide

CTRL-L: to move the start of an object timeline to the Playhead position, a great way to have multiple objects appearing on the same moment  (still waiting for CTRL-R to align end of timeline with playhead)

CTRL-P: to move the start of an audio timeline to the Playhead position

LEFT/RIGHT: moves start of an object timeline 0,1sec in the indicated direction, works also for audio timelines (they do not have a Timing part in the Properties panel)

CTRL-LEFT/CTRL-RIGHT: moves start of an object timeline 1sec in the indicated direction (also audio timelines)

SHIFT-LEFT/SHIFT-RIGHT: decrements/increments duration of slide timeline or object timeline with 0,1sec

SHIFT-CTRL-LEFT/SHIFT-CTRL-RIGHT: decrements/increments duration of slide timeline or object timeline with 1sec


 

Tips for Advanced Actions

Reader, known or unknown, accept my sincere wishes for an exciting, healthy and peaceful 2011.

And for myself, sorry for the repetition I do hope to have more interaction with you. Please curse me, correct me, tell me blog postings are too long, too short, too many, too few, too serious, too much/bad images, missing audio, missing information about me, ... anything you want. I do welcome any comment, suggestion, question, issue, usecase.

Some people on the Captivate user forum asked how I did learn to use advanced actions and variables? To be honest, my way of learning is mostly by jumping in, bumping my head, making mistakes, restarting, trying to avoid those mistakes, etc. Since I started using Advanced Actions, by that process of trial and error I came to adopt a certain workflow. And in this blog post, I want to offer some tips to let you perhaps avoid some bumps on the head ;-). Here I suppose that the Captivate slides themselves are already created, that you have decided how to put up the project.

1. Prepair
  • Take time to "write" a detailed description (I do use Evernote or Onenote, but a piece of paper is also OK) of what you want to realize, and take into account every possible situation that could occur.
    Examples (situations): multiple attempts, going back, typos by user.

  • Initializing: is often needed for variables, for (in)visibility of objects etc; has this to be executed only once, or several times?
    Movie is linear (going back not allowed): no need for an advanced action to initialize.
    Going back allowed: initialize using an advanced action (on entering slide)

  • Identify system variables you will use

  • Redaction of a list of necessary user variables, choose labels for them

2. Identify triggers/events

Advanced actions have to be triggered, to be attached to events. It is easier to create several advanced actions on different triggers than one complex advanced action on one trigger. But the number of available triggers is limited, and moreover some triggers do not support all possible statements in an advanced action. To see which statements in an Advanced action will be possible, open the drop down list in the Properties panel, region Action for this trigger. Here is the list of possible triggers in your project:
  • On Enter slide: normally any statement can be added to an Advanced action attached to this kind of trigger. Very suitable for initializing, for preparing the objects as you want them to look on this slide. Only limitation: "Show" statement is only possible for objects that do exist on this slide (not for objects on another slide that are timed to display for the project - you can use the "Hide" statement however). On Exit slide:you cannot use the "Show" statement, not even for objects that are on that slide. You cannot use the "Hide" statement either! This trigger is suited for calculating variables that are changed by (user) actions on this slide, to increment/decrement a counter etc.

  • Button/Click Box: can trigger an advanced action on Success and another one on Failure (after last attempt); same kind of statements as for entering a slide, with moreover jump to other slides possible.

  • Text Entry Box: can also trigger both on succes and on failure, if you validate the user entry. If you do not validate the entry only the success action is available as trigger.

  • Question slides: can trigger an advanced action on Success and another one on Failure (after last attempt); this action will be executed, not when the user clicks the Submit button, but when he clicks on the slide or uses the shortcut Y (if you keep the default Success/Failure captions).

3. Choose proper action type

Which advanced action(s) do you need?
  • Standard action: if you need a sequence of actions to be performed, be sure to choose the proper sequence because statements will be executed from top to bottom. If such an action seems not to work well, it can help to add as last statement the action 'Continue'. You can create AND, OR combinations, but also customized conditions (AND + OR, watch the sequence and logic in that case).

  • Conditional action: if the actions to be executed depend on a question (decision), there are at least two sequences of statements needed:
      If you only need two sequences, use a single decision and put one in the THEN, the other in the ELSE part
      If you need more sequences, use multiple decisions, and only the THEN part.

  • Combination Standard+Conditional action: be sure to put the standard action in the first decision. I discussed this situation in this article

4. Label

I blogged already about the importance of good labeling. Some extra tips:
  • Prefer short names, starting with really identifying characters (works better in dropdown lists).

  • Normally you will have similar objects, variables, advanced actions where you will use the Duplicate functionality and do some editing; choosing small, significant differences in the names (1 or 2 characters) makes editing a lot easier.

  • If you have a lot of advanced actions, using characters in the name that indicate the trigger that it has to be attached to, will avoid a lot of searching.
    Examples: EntSlide1, ExtSlide1

  • Do not start user variables with r or c (both are first characters for system variables), but use another first character.

5. Create user variables

You can start creating user variables with Project, Variables. This dialog box has all the functionalities. There are two other possiblities:
  • To create a user variable to be associated with a Text Entry Box, you can use the small X in the Properties accordion, region General. It is a pity that the defautl associated variable (something like Text_Entry_Box_x) is not replaced by this better labeled user variable (see below: cleaning up the list with variables).
  • If you forgot to create one user variable, you can also do it using the button Variables in the Advanced Actions dialog box. But: although the look of the opening Variables dialog box is identical to the one that opens with Project, Variables, you will not be able to remove variables if you choose this workflow.
Please, clean up your list with user variables (use Project, Variables), when you have finished creating your properly labeled variables. It is always easier to manage a shorter list.

6. Create advanced actions

  • Use the Save/Update button as often as possible (pity that there is not a shortcut like CTRL-S)

  • If you have similar actions - where you will use the duplicate action functionality - create one of them, test it thoroughly before duplicating; that will you save a lot of time.

  • If you have a complex conditional action, do not put in all decisions, start with one, test it, add a second, test it etc. Sometimes I even test out first a sequence in a standard action, then copy the statements to the conditional action regions.

7. Test, test, test..

No one likes this, but please do test all situations. It will help for testing to put up on the slides some (temporary) Text Captions showing the user variables you are manipulating. This makes it easier to trace them and to detect bugs.


Did you read everything up till now? Congratulations! Whow, this was the most difficult post I wrote since I started blogging. And I'm very curious how it will be received. I should have added audio, images or a worked out project as an illustration. I have tried to "compilate" what is floating in my head, but am not sure this compilation is OK. Anyone to help with the debugging? Other suggestions? If you want me to apply what I described to one of your projects, add a comment. Please?

Creating a Game Results Board with Captivate 5

Challenge

This question (from the forum)

"I'm trying to create a board for a game.  In the game there is a red team and a yellow team.  Once a team has control of the "board" the subsequent points earned should go to that team"
 

sounded like a challenge. And I like challenges, certainly when advanced actions in Captivate have to be used. Until today I had never imagined using Captivate for such a goal. And I had some difficulties to understand the rules of this game. The user gave me his graphics and was very patient explaining those rules. It took less time to create the advanced actions :-) . For those interested in the creation of the actions, I did publish an article explaining in detail those actions, here is the link:

 Creating a Game Results Board


In the article you can download the cptx-file and the cheat sheet for the moderator.

Game rules

The resulting SWF is displayed later on. But let's start explaining the rules (as I understood them):
  • The board is used by the moderator of the game, not by the teams
  • Two teams are playing: the 'yellow' and the 'red' team
  • A toss decides which team is starting: the moderator enters the result by clicking on the red or yellow rectangle
  • Each round corresponds with one slide and has one question
  • There are different correct answers, but not always the same number (first round has 5 correct answers, second 6, last 3); a round is finished when all correct answers have been given; total score for each round is 100 points, but the score for each correct answer is different.One example for first question: since 'dog' is the most popular pet it gets a much higher score than a 'rabbit' that is less popular.
  • The moderator has a cheat sheet, with the place of the correct answers; if the team gives a correct answer he clicks the corresponding rectangle: the answer is displayed with the corresponding score and this score is added to the result of the team.
  • If the answer is incorrect, the moderator clicks the last rectangle (bottom right); a big black cross shows up with the number of attempts left. When the team has given 3 incorrect answers, the other team can continue and gets the score already obtained by the first team.

Cheat sheet

Included a pdf with the cheat sheet for the moderator. There are 3 rounds with these questions:
  1. What are common household pets?
  2. Which day of the week is the most relaxing?
  3. What is a common side dish for lunch?
I got the explanation that the scores for the answers are based on statistics.


Game Results Board - result
Try it out please:


Some ideas

I' m thinking about creating a template for this scoreboard. It would allow customizing, for the backgrounds as well as for the questions, when using placeholders. Important is to have the advanced actions available in the template and an easy way to adapt them. It should be possible too to replace the textual answers by graphics.

What is your idea?


Quiz showing Elapsed Time

Intro

Today's posting is about advanced actions but not complicated. This is why this is very well suited for users who want to start with advanced actions and variables. I'm trying to answer a question from the Captivate user forum: "I would want the total time taken for the quiz to be displayed...".

Example

Play with this example to see a possible solution, realized with some advanced actions. After the introduction slide the time spent on each question slide will be stored and displayed on the next slide. The total time spent on the quiz will be visible as well. Both will be showed in seconds. On the score slide the total time of the quiz is displayed, either in seconds or in minutes. If it is a really long quiz, it would also be possible to display in hours of course  :-). I will explain briefly the variables and advanced actions used. In the Gallery you'll find a screenshot of each advanced action.

Variables

I used the system variable cpInfoElapsedTimeMS and created some user variables:
  • v_start will store the start time for a question (in milliseconds), reused on each question slide
  • v_end  will store the end time for a question  (in milliseconds), reused on each question slide
  • v_duration will store the time spent on a question (in seconds), reused on each question slide
  • v_total will store the time spent on the quiz so far (in seconds)
  • v_help is a variable used to transform the total time to minutes 
  • v_minutes will store the total time spent on the quiz in minutes
On the second question slide, a text caption, labeled InfoTime shows the value of the variables v_duration and v_total. This Text Caption is set to display for the rest of the project and will be hidden by an advanced action on entering the Score slide. For the moment there is no possibility to have a 'mask' to display the time, sometimes you'll see a lot of decimals.
 

Advanced actions

I have included all the advanced actions as screenshots. Have a look at the image gallery. There are 3 advanced actions:
 

1. SetStart

This standard action is executed on entering the first Question slide. It populates the variable v_start with the value of the system variable cpInfoElapsedTimeMS at that moment. 

2. StartNext

This standard action is executed on entering all Question slides with the exception of the first one. There are more activities here:
  1. the user variable v_end gets the value of  the system variable cpInfoElapsedTimeMS at that moment;
  2. the variable v_duration is calculated from  v_end and v_start; it is in milliseconds after this statement
  3. the variable v_duration is translated to seconds
  4. the variable v_total is recalculated (in seconds)
  5. the variable v_start is reset to the  value of  the system variable cpInfoElapsedTimeMS at that moment to start the chrono for this question

3. EnterScore 

This conditional action is triggered on entering the score slide. It has 2 decisions, the first Standard is really a standard action, the second Minutes is a conditional action. If you are puzzled about this combination of standard and conditional action, please check this article Combining Standard and Conditional in one Advanced Action.

3.1 Standard decision
  • hides the Text Caption TimeInfo (that was displayed for rest of project)
  • repeats the statements 1-4 of the action StartNext; we do not need 5, because there is no question slide anymore
3.2 Minutes decision
On the score slide you have 2 Text Captions to show the total time spent on the Quiz; initially both are invisible: 
  • YesMinutes shows the total time in minutes and will be set to visible if the total time is greater than 60 sec; you'll find this in the Then part of this decision
  • NoMinutes to show the total time in seconds, will be set to visible if total time is smaller than 60 sec;  you will find this in the Else part of this decision
Let me know if you disliked or liked this explanation. And if you have more questions, do not hesitate...

Strings, Text Entry Boxes and Associated Variables

On the Captivate blog recently two tips for using advanced actions were published: Few tips on Advanced actions. If you have been watching my blog, you'll know that advanced actions is my favourite subject. And after reading the Captivate blog posting, I felt some more details about the first tip would be welcome. If that tip was perfectly clear to you, please do not continue reading this post.

The forementioned tip is about checking the possible emptiness of a variable by comparing it with an empty user variable, which is indeed the proper, even the only way. The basic reason is that in the simple Captivate scripting language a string shouldn't be included in double quotes as is the case in other scripting languages, at least not when the string is only one word. If it contains more than one word, double quotes will be automatically added by Captivate, no need to type them. Here are some examples of conditions (words starting with v_ are always user variables in my self-imposed scripting grammar):
  • v_counter is equal to 12
  • v_name is equal to Lieve
  • v_score is greater or equal to 20
  • v_name contains Lieve
  • 1 is equal to 1
  • Lieve is equal to Lieve
Those examples work perfect and here quotes are totally missing, there is no visible difference bewteen a string and a number. The two last (absurd) examples can be used to create a decision to simulate a standard action that has to be combined with conditional action(s) as explained in the second tip of the Captivate blog. A couple of weeks ago I published an article about this workflow:
 
The tip about the empty variable is illustrated by a user variable associated with a Text Entry box. For those users who did try out advanced actions in the previous version (Captivate 4) I thought it appropriate to explain the changes concerning Text Entry Boxes and associated variables. This change has been puzzling me when I started with advanced actions in Captivate 5, and maybe I'm not the only one ;)

In Captivate 4, when you create a Text Entry Box, it will be labeled by Captivate like any other object. The default label for the first created Text Entry Box is TTextEntryItem1.  Immediately an associated variable is provided too, and it gets the default label TTextEntryItem1Var. That is great, because you can insert the variable later on in a Text Caption. I include a screenshot to show those default labels. Personally I will always attach a more significant label, you know me already as a labeling freak. 

In Captivate 5 however, both the Text Entry Box and the associated variable will get the same label. Have a look at the second screenshot with a partial view of the Properties panel. I highllighted (in yellow) both the TEB-label and the label of its associated variable. If it is the first Text Entry Box, both object and variable will get the default label Text_Entry_Box_1. Although I'm always complaining about the fact that so many different ID's are needed in a CP-movie,  I do not really like this situation where one label covers two different 'objects. When both are used in advanced actions it can be confusing. Perhaps an example can better explain my "dislike":
Three statements of an advanced action:
    1.  Assign Text_Entry_Box_1 with Lieve  
    2.  Apply Effect Text_Entry_Box_1 Fly In From Bottom Left
    3.  Assign Text_Entry_Box_1 with "Lieve Weymeis"

In this action the first statement will give a value to the user variable Text_Entry_Box_1. If you have a Text Caption visible with this user variable inserted, you will see the content (Lieve). The second statement has the Text Entry Box flying in. Later the user will type an entry for the TEB and the variable Text_Entry_Box_1 will change to this new value. In the last statement the content is changed again, and double quotes will be inserted by Captivate because there are two words.  Perhaps you'll understand now why I was confused. But luckily, in the Properties panel of the Text Entry Box you can immediately create another user variable: in the second screenshot watch the green highlighted X which will open a small dialog box where you can enter a new variable name. This workflow however is not possible in Captivate 4, where you have  to create the user variable first (in the Project, Actions dialog box) before being able to associate it to a TEB.
 
BTW will publish shortly another article about Advanced actions, to create a game control panel. And it has some examples of standard actions combined with conditional actions. Watch this blog, I'l post the movie to play with and a link to the article.

Stack Order and Master Slides

Intro

When preparing the usecase for a previous blog post about creating cleaner Captivate-files (Playing Hide-and-Seek with Captivate objects), by using the possibility to show non-interactive objects for the rest of the project, and hiding them with advanced actions, I bumped into an issue that puzzled me. So I turned to the proper place, the Captivate user forum and opened a thread. I did not have to wait long, Ashwin Bharghav (from Adobe) answered and offered a workaround.  And I want to explain the issue and its solution. 


Problem

For the pretest, one of the usecases in this previous posting I wanted to streamline the workflow in a template because its re-usability.  It meant not having to recreate the advanced actions all the time. To make the template as versatile as possible I decided:
  • not to use one simple image for the Yes and No buttons, but to split them up in a Shape + Text. Both for localizing, and adapting the formatting this is an advantage. I appreciate a lot the roundtripping feature with Photoshop in the - eLearning Suite 2 (such as being able to import layer comps) :-)

  • not to choose a background image for the master slide, but inserting an image on top of the background to enable swapping and editing the image in Captivate. In the example I used an image with both saturation and alpha adapted (alpha to about 40%).

In this usecase, a lot of non-interactive objects were timed to 'Display for the rest of the Project': the images of the buttons (both shapes and Text) and the questions. And when previewing or after publishing I did see this phenomenon: on slides where the objects were not really inserted but showed up because of their timing, they took over the alpha of the Image on the master slide. Have a look at the first picture included: watch the questions and buttons;  the last question and buttons are on the slide itself, the previous ones are on previous slide but display on this slide, and they are partially transparent!

Answer

I quote the answer of Ashwin
 "By default when the objects are timed to display for rest of the project, they will have the lowest order on other slides in the project. So as per this logic the objects are shown under the master slide image on other slides". 

This explained the phenomenon: the objects took over the transparency of the image on the master slide. But it was not what I expected from a master slide :( 

Workaround (s)

Proposition of Ashwin: when setting the timing to Display for rest of project, there is an extra option: "Place object on top" (see second image). This will put the object always on top of the stacking order on slides where the object is no really inserted but displayed because of this timing. This may not be really what you want, because the object will also stay on top of the real objects on that slide. In this usecase I could live with that solution, but will not always be happy with it.
Another workaround is merging the image in the background of the master slide, that was my approach when publishing the pretest on the blog.

Article with details about 'Hide-and-Seek'

If you are curious about the advanced actions I have been using in this pretest-project and in the keypad-simulation to realize the Show/Hide objects, I have published a detailed explanation of the workflow in this article: Using Display for Rest of Project to create a cleaner Captivate file

Playing "Hide-and-seek" with Captivate objects

This article was written for version 5. At that moment it was not possible to show an object, timed for the rest of the project, from another slide than the original slide where it was inserted. However this has changed for later versions: in 7, 8, 9 and later you can show an object timed for the rest of the project from any slide.


Hide/Show actions, attached to events like entering slides or clicking a button/click box are popular. They can also be used in Advanced actions. But from several questions on the user forums I concluded that there is some confusion about what is really possible and impossible with those 'simple' actions. So, thanks folks for giving me the inspiration for this blog posting! If combined with the timing option 'Display for rest of project' you can end up with a Captivate-file that looks a lot 'cleaner' (perhaps I'd better try to keep my real desktop as clean as those files).  The examples were created with Captivate 5, but they can be realized in Captivate 4 as well.

  
Please, play with this SWF a little bit. I extracted this file from a larger project where I try to motivate students and colleagues to use Twitter on the college campus. This example is like a pretest, and the result will be used to offer a customized menu of chapters to be viewed by the user (this part is not in the example). And while playing, try to figure out how you would realize this in a Captivate file.
  
Did you know this?
4 important tips you have to be aware of when showing/hiding and using 'Display for rest of project'
  1. You can apply the action Show only to objects that are really on the slide
    p.e. you put a rectangle on slide 1, set to 'Display for rest of project'; if it is initially hidden, you can only show it on slide 1, not on slides 2, 3 etc
  2. You can apply the action Hide to objects wherever this object will be visible on runtime
    p.e. for same rectangle, if it is visible, can be set to be hidden on slide 2, slide 3 etc
  3. You can choose the timing 'Display for rest of project' only for non-interactive objects, not for buttons, click boxes, Text Entry boxes
    some interactive widgets (p.e. Perpetual button) can be displayed for rest of project
  4. When 'Display for rest of project' is applied to an object, it keeps its unique ID for the rest of the project
    if you copy an object to another slide, it gets a new ID; this leads to a lot of repetitive work when creating advanced actions
In the example of the previous blog posting (Creating a keypad-simulation) I did use those tips to have a 'clean' Captivate file. What do I mean by 'clean'? Have a look at the first image in the attached image gallery: it shows the filmstrip of this Keypad-file. Watch slides 2-8: on every slide only objects added on that particular slide are visible in the Filmstrip. On the stage you'll see everything: not only the objects on that slide but also those set to 'Display for rest of project'. In the second image you see the stage focused on slide 6 'In'. Whereas the Timeline of this slide only has the objects Highlight (red), a Text Caption and a click box (third image), on the stage you also see the images 'Keypad' and 'EnterPin' (green display) which are really on slide 2 and displayed for rest of project.
  
Overview visibility objects Keypad-simulation
I really want to recommend, creating an overview before starting to configure Show/Hide actions. Here is a rather simple overview of the 4 image-objects (keypad and 3 displays) of my keypad-file. For more complex projects I would use a table:
Keypad-image         Visible on all slides from slide '2. Digit1' until slide '8. OK'
                                Not visible on slides '1. Intro' and '9. End'
EnterPin-image       Visible on all slides from slide '2. Digit1' until slide '6. In'
                                Not visible on slides '1. Intro', '7. Not-OK', '8. OK' and '9. End'
Pin_NOK-image       Visible on slide '7. Not-OK' only
Pin_OK-image         Visible on slide '8. OK' only
 
Challenge 
Could you figure out how to realize this Captivate file with Hide and Show? If you do not allow the user to repeat the entry of the pincode after the slide Not-OK it is not that difficult. I offer you some tips:
  • set objects to 'Display for rest of Project' only when they have to be visible on more than 1 slide
  • concerning the advanced actions for the click boxes: Article: create keypad-sim
  • use simple standard actions (very few statements) on entering the slides
Example pretest
The example you have been playing with at the start (pretest) is more complicated. Have a look at the 4th image in the Gallery which shows the filmstrip of this project: isn't that clean? And the last image shows the Timeline of one of the slides, slide Question4. On this slide you see:
  • a Text Caption Quest4 with the 4th question, displayed for the rest of the project
  • image SJa4: image of a button, displayed for the rest of the project; a real button is interactive, cannot be displayed for the rest of the project, and moreover it only needs button functionality on this slide, so I preferred an image that is covered up with a click box (CB only on this slide)
  • Text Caption Ja4, displayed for the rest of the project:  have to localize a lot, that is why I imported 4 layers from a Photoshop-file (two button-images and two text layers); if you do not need to change the text that often you can of course merge image and text
  • image sNee4: similar to SJa4
  • Text Caption Nee4: similar to Ja4
  • Click Box CB_Yes4: only on this slide
  • Click Box CB_No4: only on this slide
Imagine what the timeline would have been if all objects from previous slides were copied to this slide (and even worse for next slides)!

This is a typical project for which I do create a template, because it can be used over and over again. The advantage is that the advanced actions will be stored in the project, and since a lot of objects have a unique ID, due to their timing (for the rest of the project), adapting those actions to similar projects will be a lot less cumbersome.

Would you like me to explain the advanced actions used in this project or for the keypad-simulation in an article? Please, post a comment!