Calculate Expiry Date (Expression, variables)


Today a user asked for help with coding to get an expiry date for a certificate slide,  see thread

It is a nice use case for the use of both system and user variables, and the use of the mysterious Expression command which is only available in the Advanced Actions dialog box (not as simple action in the Actions tab of the Properties panel). If  you are totally new to the use of variables, here are some links:

Using System Variables – part 1

Using System Variables – part 2

User Variables – Intro

Workflow described here step-by-step will show how to get the expiry date, 3 years from the present date can be calculated and stored in a user variable. It can of course also be done with JS, but I kept to one advanced action. Since I live in Belgium, I used the date format ‘day/month/year’. It is rather easy to change this to another sequence like the one used by ISO or in the USA.  Maybe I’ll post an interactive output, where you can choose the sequence of the 3 parameters. It is also possible to go for another way of presenting the date, but that is not treated here. Insertion in the Learning Interaction  ‘Certificate’ is not included neither.


1. Variables

You will be using these system variables, all from the category System information:

  • cpInfoCurrentYear: its value is a 4-digit number, at this moment 2019
  • cpInfoCurrentMonth: its value is a 2-digit number, still January at this moment, will be 01
  • cpInfoCurrentDate: its value is a 2-digit number, for me at this moment it will be 29; it may seem bit confusing that I don’t use cpInfoCurrentDay, but that gives a 1-digit number for the sequence in the week. Monday will result in 2 if t Sunday is considered to be the first day of the week in your OS settings.

You need two user variables (how to create them, see third link in the Introduction ‘Why?’)

  • v_year: will be used to calculate the expiry year, which would be 2022 for this user (3 years from now).
  • v_date: will have the full date of expiration after the calculations explained later.

The third variable v_choice has been used to offer a choice between the sequence for the date numbers. That is not part of this workflow.

2. Advanced action – creation

You need to create this advanced action, which is non-conditional I will explain each command:

  1. First Expression calculates the expiry year from the present year (cpInfoCurrentYear) and stores it in the user variable v_year. This is possible since the system variable can be seen by Captivate as a number, and using the mathematical operator +. Result will be of course 2022.
  2. The mathematical operator becomes here a ‘concatenation’ operator: it will add the string “/” to the day number. Do not forget the quote marks, because / is a mathematical operator. Result after this expression is the text:    29/   which will be stored in v_date
  3. Another concatenation replaces the value in v_date  by 29/01   
  4. Third concatenation results in v_date = 29/01/
  5. Last expression gives the final result v_date = 29/01/2019

The need for 4 expressions to get to the final value for v_date is due to the fact that the Expression command can have only one operator. You can use the Copy/Paste functionality in the Advanced Actions dialog box to speed up the process.

3. Assign action to Slide On Enter event

Attach the Advanced Action to the On Enter event of the slide, where you need to insert the variable v_date.

How you can insert a variable has been explained in the very first link I posted under ‘Why’.


  • Change the Advanced action to present the date in another sequence, like ‘Year/Month/Day’. If you are on CP2017 or later, maybe this blog could help.
  • For the fans of conditional actions: try to create a version where the learner can choose the sequence. You’ll need probably another user variable in that case and a multiple decision conditional action.
  • Which dangers exist for ‘cheating’ (I am a former professor) in the use case as described here? How would you cope with those dangers?

The post Calculate Expiry Date (Expression, variables) appeared first on eLearning.

User Variables – introduction


In a recent post I described how you can create a variable to replace the generic variable associated with a Text Entry Box., by using the X button next to the Variable field:

This was a very specific but rare situation in Captivate: the variable needed for a TEB is created automatically, it has by default the same name as the TEB itself. There were two reasons to replace it: to recognize it easier in any dropdown list, and because I really don’t like to use the same name twice for two different items (the TEB and the variable), which in most situations is not a good practice, could cause problems.

In that same post I also mentioned that two user variables are created automatically for each project: cpQuizInfoStudentName and cpQuizInfoStudentID. They can be populated with data from the learner’s account by some LMS’s and are used for reporting to an Internal Server. In all other circumstances you need to create user variables.

A typical use case are those Learning Interactions which can have one or more  associated variables. You can consult my table in this post to find these.  You can type in a variable in the Properties dialog box for those interactions, but that variable will not be automatically created, contrary to the situation with a Text Entry Box. You need to create it separately. There is also no way to select the variable from a dropdown list neither. Be careful: remember that variables are case sensitive, typos would lead to problems. Look at this screenshot for the Checkbox interaction, I associated 4 variables but have to create them (see further)

Defining a user variable

User variables are defined using Project, Variables. You’ll see the two default user variables cpQuizInfoID/Name and eventually variables defined with the TEB-workflow. To create a new user variable you click the button ‘Add New’. You could limit the definition to the variable name and clicking ‘Save’ button, but I strongly recommend to add a description as well. It makes it a lot easier to identify the variable when you have to edit the course weeks/months/years later. In this screenshot I still have to click the Save button or the ‘Discard’ if after all I don’t want this variable.

You see in the screenshot that I left the Value field blank, because for these variables I didn’t need a default nor start value at all. Those variables will be linked to an interaction.

As mentioned multiple times, the choice of the names is very important in Captivate. Except for some rare situations, you cannot use the same name for two or more different items (objects, variables, actions, ….). Using the first character(s) of the name to indicate the type of item is a way to avoid that. In most dropdown lists, you can use filtering to find a name (see the interactive video in Custom Play/Pause button).  That makes the name choice even more important.

The other buttons in this dialog box are:

  • Remove:  if you want to clean up, check which variables are not used anymore after finishing the project and use this button. You can open the Variables dialog box from the Advanced Actions dialog box (see this article). In that case, the Remove button will be missing however.
  • Usage: will list up where the variable is used. That will mostly be an action (simple/advanced.shared), can be compared with a similar button in the Library, and in the Advanced Actions dialog box.
  • Unused items: also to be compared with a Library functionality. In the example of the dialog box, the two user variable cpQuizInfo…. would pop up.
  • check box Geolocation: if you want to use a conditional action based on comparison between the system variable cpInfoGeolocation and the present location of the learner, you need to define a user variable. Since both variables need exceptionally 3 numbers (all other variables have only one string or number) you need to check this box to be able to define a user variable of that type. The dialog box will then look like (I used the Map button and typed an address):

You can edit each field of a the variable dialog box, except the Name field. Do not forget to save the changes with the Save button in the top of the dialog box.

Variable commands

Captivate doesn’t allow to define the type of a variable: toggle, numeric, string but is smart enough to detect which variable you have based on the commands you use. Typical for variables are these simple commands:

  • Assign: allows to fill a variable with a value or to change that value. This command can be used for any type of variable
    Example: Assign v_name with Lieve
                       Assign v_score with 7
  • Increment …. by …: variable will be recognized as a number, and its value will be increased by the indicated amount
    Example:  Increment v_counter by 1
                        Increment v_score by 3
  • Decrement …. by …: variable will be recognized as a number, and its value will be decreased by the indicated amount
    Example:  Decrement v_counter by 1
                        Decrement v_score by 2
  • Toggle: variable will be recognized as a Boolean variable. Its value will switch to the opposite value (0/1 or true/false).
    Example:  Toggle v_visb

These commands are of course also available in the dropdown lists of the Advanced Actions dialog box. For those actions you also will find variables often in:

  • Expression (command): which allows you to do some simple mathematical operations. The variables will be recognized as numeric. Here is a simple example, where the percentage is calculated from a score and the maximum amount of points (not using the quizzing system variables):
    Example:   Expression v_total = v_score/v_max
                         Expression v_total = v_total * 100
  • in Conditions (for a conditional action or a while loop)  you will often use variables, either to compare with a literal or with another variable
    Example: IF v_visib is equal to 1    or
    IF v_name is equal to v_null    or
    While v_counter is equal or greater than 1

My favourite variables

In the examples above, and in other blog posts you’ll find often these variables. Read till the end to see how I avoid to define them from scratch in each course:

  • v_counter: often used to show the number of clicks, of visits (to a chapter), and/or to create a progress bar or show a ‘reward’.
  • v_null: an empty variable to check if the learner has entered at least one character in a field (see Where is Null?)
  • v_visib: a variable to track if an object/group is visible or hidden (see Multiple toggle buttons with 1 Shared Action)
  • v_name: often associated with a TEB
  • v_start: often used to store the first frame number of a slide when using micro-navigation (see Force First View)
  • v_one, v_two…..:  variables which I use for multiple goals like a dashboard, the checkbox widget,

I use a shared action which I drag to each new course to avoid having to redefine these user variables. This is described in detail in the first tip in Rare Use of Shared Actions.

The post User Variables – introduction appeared first on eLearning.

States and State Commands

Recently a user posted a question about using the ‘Go to Next State’ command used in Advanced actions. You can read our discussions in this thread.

Time to write out some tips for multistate objects. This blog wants to give an answer to the user, and has its focus only on that solution. I plan to publish more about the basics of states and their commands later on. To me personally the introduction of multistate objects is in the list of my favourite features in Captivate, closely following Shared/Advanced actions and Shape buttons.

Example movie

Watch this published rescalable interactive movie. The second slide has three shape buttons, navigating to three slides where you can read and confirm reading, or click hotspots, or answer questions. Each of your actions will result in changes to the progress bar on that second slide. Beware: whenever you have clicked an interactive object it will be disabled!


Terminology Multistate objects

InBuilt States and Custom States

You can add custom states to any object, static or interactive. In those states you can have many object types: graphics, video, audio… but no interactive objects nor hyperlinks. The Normal state is the default state, which will always appear unless you have changed to a custom state using a command (in a simple or an advanced/shared action). Nothing is locked to the default normal state for custom states . You can have objects in a custom state that are in a totally different position from the Normal state. Custom states are always controlled by commands, not by a situation. If you want a custom state to remain for future visits to the slide where the multistate object is sitting, you need to check the option ‘Retain state on slide revisit’.

Inbuilt States exist for these object types:

  • All types of buttons Shape buttons, Image buttons, Transparent buttons and Text buttons.  You have four of those styles: Normal, Rollover, Down and Visited. The first three are part of the button style.  You don’t have the same freedom for location of those states, they are locked to the Normal state (look for the Lock indicator).
  • Drag sources and Drop targets on a D&D slide. For more information see: InBuilt states for D&D

I will only talk about shape buttons here. Contrary to custom states Inbuilt states appear automatically in a situation: when not hovering over button (Normal), when hovering over button (Rollover), when pressing button (Down) and when after clicking/tapping (Visited, if it has been created). You can only control Normal and Visited by a command if necessary, not the Rollover/Down states.

State commands

These commands are available both in a simple action (dropdown list in Actions) and in the Advanced Actions dialog box, to be used in advanced or shared actions:

  • Change State of …. to
  • Go to Previous State  …..
  • Go to Next State ….

When you use these commands as a simple action, from the dropdown list inthe Actions tab, they can only be applied to multistate objects on the same slide as the event triggering the action (Slide event, interactive button events) The Hypelink even thas only the first command (Change State).

If you insert one of the commands in an advanced/shared action they seem to be able to apply also to multistate objects on other slides. That is indeed the case for the ‘Change State’ command, but is NOT functional for the commands Go to Next/Previous States. I have logged this as a bug, because you are able to choose multistate objects on other slides, however without any effect. That was the reason of the question in the forums, described in the Intro.

You could see in the Example movie that I have a workaround. How?

Solution with variable and While loop

YOu will need one user variable v_counter,  to track the number of clicks while being on other slides than slide 2 with the Progress indicator SS_Progress (a multistate object). This progress indicator starts with a Normal state which is a shape with Alpa and Stroke = 0.

That variable starts with a default value = 0. The clicks on the OK buttons in slide 3, on the hotspots in slide 4 and on the correct answers in slide 5 do increment the variable, besides other commands.

When returning to slide 2 (which has the progress indicator) using the shape button ‘Back to….’ (is on the used content master slide) an advanced action On Enter for that slide is launched, using the While loop:

Example: if the user has performed 3 actions on any slide, v_counter would be 3. The while loop will then be done 3 times, which means the 4th state of the progress indicator will appear. At the same time, the variable will be set back to 0 at the end of the loop. The learner can continue to visit another slide, and the variable is ready to track again.

This is just an example, many variations are possible. Maybe you want to allow visits and actions to consecutive slides before returning to the main slide, this can easily be achieved. Or have feedback appearing on the main slide after all slides have been visited, based on the obtained progress..


I didn’t explain all actions in this post. The slide with the hotspots is based on a recent article about Hotspots in a 2D image.

Maybe you are wondering if I used the Visited state or a custom state for the OK buttons (slide 3) or the hotspots? What the quickest workflow is to create the states for the Progress bar? Did I use shared actions or advanced actions, and why did I choose that way? Why did I disable the buttons? If you are interested, I can explain… on demand.

The post States and State Commands appeared first on eLearning.

What is Branch Aware?


Branch aware feature appeared with Captivate 6.  I created a blog post to explain it, but I regularly meet users who are still unaware of its existence, or its possibilities. So I decided to refurbish that old post, and create a new example movie with CP2019. You have seen a first version of that movie in my recent post about localisation with CSV import. That post discusses the workflow to create quiz slides in different languages in the same project. The example did use the Branch aware feature, but some of the features were not fully localised: the score slide was the default score slide which is in English since I am using a version in that tongue.

In this post I will also talk a lot about the quizzing system variables. If you didn’t download my explanatory table yet, please do so. You’ll find a link in this blog post: Creative with Quizzing variables.

What is Branch Aware?

Look at the Advanced Interaction panel of the example movie. It gives you a lot of information, not only about the events and the triggered actions, but also about all scored objects, including question slides.

You see that the total score is set at 60 points, result of the 9 graded questions in the file. For each of those graded slides both the individual score and the penalty are shown. There are also 3 Survey slides, without a score. Those values are also stored in quizzing system variables:

  • Total score in cpQuizInfoTotalQuizPoints
  • Score per question in cpQuizInfoPointsPerQuestionSlide (reusable variable)
  • Penalty per question in cpQuizInfoNegativePointsOnCurrentQuestionSlide (reusable variable)

If you don’t activate the option ‘Branch Aware in Quiz Preferencesn Settings (see screenshot later on), the default score slide will show 60 as maximum score. If the learner takes only one branch (language) of the quiz, the percentage (cpInfoPercentage) will be calculated as the obtained score (cpQuizInfoPointsscored) divided by that maximum score of 60. Same with the number of correct answers and total number of answers. This means the learner would be very confused, and never succeeds in that case. Reason is that those system variables are fixed when the course starts, I label them as being ‘static’.

When turning on Branch Aware, the system variables become ‘dynamic’, they will be changed on runtime based on the branch, thse slides visited by the learner. In this example movie that has been my choice: if the learner succeeds in one branch (maybe Dutch) the maximum possible score will be changed to 20, the percentage will be calculated with that maximum and the obtained score and the learner will see correct data on the score slide, can reach the passing score. No problem if a trilingual learner did visit the three branches, since the variables are dynamic, he will be judged on the maximum score of 60. This is the setup of Quiz Preferences, Setting for the example movie:

Example Movie


Setup Project

The project has 16 slides: Title slide, Dashboard slide, 3 groups each with 4 questions, the default score slide and a custom score slide. This is the Filmstrip, I expanded the group ‘Dutch questions’:

Dashboard slide (slide 2)

I will not explain the effects on the dashboard slide, where I used a loop action (While) triggered by the On Enter event.

I created a user variable v_all The four buttons on this slide trigger a shared action which has two parameters: which value has to be assigned to the variable (1=All, E=English, D=Dutch, F=French) and the slide to jump to. Here is the instance for the button ‘Nederlands’ (Dutch):

Start slide of question groups Dutch/French

On all quiz slides a shape is displayed with info about the obtained score and correct answers so far. That shape, labeled SS_Info is a multistate object. In the Normal state the English version is displayed, there are two more states:  Dutch and French. Switching to the appropriate state is done with the On Enter event of the start slide of the Dutch and the French group. It is a simple action:

Because the project is pure linear, and there is no opportunity to go back, this setup is sufficient.

Last slide of each group (Survey slide)

The event ‘After Survey’ is used to navigate to the appropriate score slide. For the learners who did take the three branches, the default score slide (ScoreDefault = slide 15) is used, for the others the custom score slide 16. The same advanced action ‘LastAct’ can be used for the last slide in each group. If that last slide was a normal quiz slide, not a Survey slide, the same action could be used but for both Success and Last Attempt events.

Custom Score slide (16)

On this slide I used several multistate objects: where I added two states (Dutch/French) to the Normal state which has the English text. The On Enter event of this slide is used to trigger this action which will take care of showing the correct language information, and of the appearance of the Tropy image if the learner has passed.

One warning: the maximum score on the custom score slide is not created by using a system variable, but typed in (can also be calculated, as I explained in an older post about intermediate score slides). The variable cpQuizInfoTotalQuizPoints will not have changed from the original 60 points which took into account all quiz slides. It is strange because cpInfoPercentage where that maximum score is used, is correctly displayed as is  cpQuizInfoPointsscored.


I know that more improvements are possible, but blog post is already pretty long. If you really want to show a custom progress indicator on the quiz slides, maybe you’ll find some inspiration in this old post. 

If you allow backwards navigation, even give the opportunity to choose another branch on the dashboard, there will be some more editing needed. This article was meant to explain what happens when using the Branch Aware feature. Hope it helps some people.

The post What is Branch Aware? appeared first on eLearning.

Comparing Knowledge Check and Quiz Slides


Knowledge Check Slides have been introduced as one of the new quizzing features with version 9. The Help documentation is ‘spartan’ as usual. You can read this as Features (quote from the Help):

  • Knowledge check slide imbibes similar features of question slide without any results, reporting structure and interaction ids. 
  • Knowledge check slides do not participate in reviews. 
  • Random questions are not applicable to this knowledge check slide. 
  • Master slide and controls usage is similar to question slide. 
  • Knowledge check slides can be used to impart the learning on specific topics. 

I explored those KC slides in preparation for a workshop about new Quizzing features, and want to give you some more tips. Since the KC slides are very similar to normal quiz slides, I’ll start with ‘Recognizing KC slides’. Then I’ll show the differences in default setup, and in some other aspects not mentioned in the Help,  the relationship with the quizzing system variables and – what did you expect? – a tweaking tip.

Recognizing KC slides

This is possible in different locations:
    • in the Filmstrip, KC slides get a special indicator at the bottom right, which the Quiz slides do not have; in this screenshot slides 1&3 are KC slides and have that indicator:
    • in the Quiz Properties panel you see more differences with normal quiz slides, most are due to the fact that KC slides are not scored by default:

The mention (KC) next to the type of question
The lack of the possibility to choose between Graded and Survey (because KC slides are not scored)
No partial scoring for MCQ slides with multiple correct answers
No points
No penalty

  • in the Advanced Interaction panel you don’t see a specific indicator. The score of the KC slides is set to 0,  they are not set to be reported but… contrary to what the Help tells, the KC slides have an individual Interaction ID. This is probably not used. Look at this screenshot:

There is no way to convert a KC slide into a question slide, nor a question slide into a KC slide!

Default setup KC slide

The default settings for a KC slide are bit different from those for a question slide:

  1. For a KC slide only the Incomplete feedback message is activated, not the Correct message as for Quiz slides
  2. For both KC and Question slide only the Submit button is checked off. The Back, Skip and Clear buttons can be activated, but they are not by default.
  3. Attempts are set to Infinite, with the Retry Message enabled. For question slides by default Attempts is set to 1. Because the attempts are set to infinite, you don’t have a Failure message enabled for KC slides. You can decrease the attempts and in that case you can provide up to 3 Failure message, same as for Question slides.

You read in the Help that KC slides will not be visited during Review, they are not in the Quiz scope, except of course if they are nested in between normal quiz slides. Contrary to Pretest slides, the KC slides will not prevent navigation by playbar or TOC.

It is not possible to use question pools (see Help), random questions but it is also not possible to use GIFTformat to import KC slides.

Some options in the Quiz Preferences do work for KC-slides: if you check the option to Hide Playbar in Quiz, this will be valid both for question slides and KC slides. Unchecking the option ‘Allow Backwards Movement’ will only prevent backwards movement on question slides, not on KC slides. However, KC slides do not get a Progress indicator! IIf you want a progress indicator (question X of Y) you can have a look at this older blog post..

When you leave a KC slide, it is reset immediately which is not the case for question slides which are frozen until a new attempt on Quiz level is started. In that way a KC slide behaves like a Drag&Drop slide that is not set to be reported, had no score. There is no possibility to freeze the answer on a KC slide, which may be a game stopper sometimes.

As the Help mentioned, design of the KC slides depends on the same master slides as the normal question slides, with the exception of the new Review buttons which will never appear on KC slides. For navigation on KC slides you can use the Back/Skip buttons or add custom shape buttons.

System variables

Contrary to the Pretest slides, there are no specific system variables available for Knowledge Check slides. I have been looking for quizzing system variables that do get a value from a KC slide. Here is an overview of the variables that are not used by KC slides:

  • cpInQuizScope and cpInReviewMode, both Booleans will not be toggled from the default ‘false’ to ‘true’ when you enter a KC slide. If the KC slide is in between normal question slides, it can be ‘true’ but that is not due to the KC slides.
  • Variables linked with scoring are not used: cpInfoPercentage, cpQuizInfoLastSlidePointScored, cpQuizInfoNegativePointsOnCurrentQuestionSlide, cpQuizInfoPassFail, cpQuizInfoPointsPerQuestionSlide, cpQuizInfoPointsscored, cpQuizInfoPartialScoringOn, cpQuizInfoTotalProjectPoints, cpQuizInfoTotalQuizPoints 
  • cpQuizInfoAttempts: gives the attempts on Quiz level, as specified in ‘Quiz Preferences, Pass or Fail’. Those attempts have no sense for KC slides, since the user can come back as many times as he wants to retake the KC question which is always reset when leaving the slide.
  • cpQuizInfoPassPercent and cpQuizInfoPassPoints: since KC slides have no score, those settings of the Quiz Preferences have no meaning for KC slides.
  • cpQuizInfoTotalQuestionsPerProject: contrary to the Pretest questions which are counted in this variable, as are the normal Question slides, the KC slides are not included in this variable. Same for the variables cpQuizInfoTotalCorrectAnswers, and cpQuizInfoTotalUnansweredQuestions

As you see not many variables are used by KC slides, but some are used! Moreover they can be very useful if you want to do more with KC slides:

  • cpQuizInfoAnswerChoice: one of my favorites as you could read in this old blog postIt can be used to tweak the work flow with KC slides as you’ll read more later on. One exception: it is not populated when you use Advanced Answer option.
  • cpQuizInfoMaxAttemptsOnCurrentQuestion: can be useful as well, although having a similar system variable to cpQuizInfoAttempts for current attempt on question level would be even better. You need a user variable as a counter for attempts on question level. If you keep the default setting of Infinite attempts, this variable will have the value 32767 (no idea why?).
  • cpQuizInfoQuestionSlideTiming and cpQuizInfoQuestionSlideType are available for KC slides as well.

For an overview of all quizzing system variables, including a free table to download, check: Creative with Quizzing System Variables

Tweaking tips

Here are some tips, which I tried out with success but will not explain in detail.

  1. If you do not want to keep the Attempts set at Infinite, but to a limited number it would be possible to count the number of correctly answered KC slides. Create a user variable v_counter with a default value of 0. Use the Success action of the KC slides to increment that counter. Later on you can show the obtained value for v_counter, and even use that value in a conditional action to offer feedback or navigate the user back to content slides.
  2. There is no Review possibility for KC slides as mentioned. If you offer limited attempts on question level, you could show a custom feedback message on the KC slide for the questions answered correctly, something like ‘You have answered this question correctly’. When simulating a ‘Review‘ situation, the user will be invited to answer only the KC questions that do not show that message. Be careful: all embedded question slide objects are always on top of the stack, you don’t want the feedback to be hidden by those objects. That can be done by having a shape before the KC slide, timed for the rest of the project and always on top. This tweaking work flow was described in this article: Buttons on Question/Score slides?
  3. The use case described in this thread of the Captivate forums could be solved using the same system variable cpQuizInfoAnswerChoice in conditional actions, combined with a counter to track the number of attemptsl. You cannot leave a normal question slide to a content slide for remediation unless you follow the strict rules for remediation. If you want to limit the attempts to get a correct answer, remediation rules are broken. With a KC slide, the answers are reset every time, which allows a lot more freedom. However: if you need a real score for the slide, you’ll have to use the workaround I described in this blog post: Report Custom Questions – part 2
  4. All features of the KC slides are also available in a responsive project developed with Fluid Boxes. Check this blog post about the setup of quizzing master slides in Fluid Boxes

The post Comparing Knowledge Check and Quiz Slides appeared first on eLearning.

Forced Clicking Hotspots in Fluid Boxes Project


A couple of weeks ago I proposed two workflows for a common use case: learner has to click a number of hotspots which show explanations before being able to continue in the course. That example was for a non-responsive (maybe rescalable) project. If you missed it: Comparison Workflows for Hotspots

At the end I promised a follow-up article discussing how this can be realized in a responsive project, developed with Fluid Boxes. I will use exactly the same example, same variables (use both my custom theme and a shared action to get them quickly into the Fluid Boxes project –  see Shared Actions Tips).

Preparation – Changes

The shape buttons (arrows) used as hotspots had 4 InBuilt states in the original article. I want to use as much normal fluid boxes as possible. For that reason I have to simplify the Visited state where originally I added a checkmark image. This is not possible in a normal fluid box. The new object states look now like::

Object States Hotspot Fluid Boxes

Show/Hide Workflow – Changes

In the original file the text shapes containing the explanation when a hotspot is clicked, were grouped and stacked in the same location. Grouping allowed to simplify the actions. Each action had the Hide Group command, before showing the appropriate text shape. Two parts of the workflow are impossible in a normal Fluid Box:

  1. Grouping cannot be used. The consequence is that you’ll need to have a command line for each text shape to be hidden. In this example, where only 3 hotspots are used, that is not too bad but it is getting worse when the number of hotspots increases. The advanced actions FlashAct, ThemeAct and ActionAct have to be changed as well as the action On Enter.
    FlashAct (F<img src=” />Enter action for Show/Hide
  2. It is impossible to have objects stacked in the same location. For that reason I marked the Fluid box which will have the text shapes as being static. That is not a very nice workaround. Although I marked the Height and Width of the shapes to be 100% and 90% of the size of the Fluid Box, that setting is not honored, the shape will shrink a lot more for smaller screens, because the width/height ratio of the FB is kept.

Multistate Workflow – No Changes!

Great news! No changes are needed for the Multistate workflow, it works perfectly in a Fluid Boxes project. I didin’t even have to change the fluid box with the multistate object in a static fluid box. You have of course to be careful not to add objects to the states of the object, because no stackng is allowed.

Conclusion is clear to me: avoid the good old Show/Hide workflow when you are working with Fluid Boxes. You have a much nicer result using a multistate object.

I will insert a link to the responsive project for those who want to help testing it on mobile devices. Let me know if you are interested?

The post Forced Clicking Hotspots in Fluid Boxes Project appeared first on eLearning.

Force Clicking Hotspots: Comparison 2 Workflows


 This post is created in CP2017  but most can be done in CP9 as well.
A learner has to click several hotspots. Those hotspots reveal extra information such as explanation, images, video…. Moreover the clicks on the hotspots are tracked, because something has to happen when all of them have been clicked at least once. The clicking is not in a forced sequence. That ‘something’ could be the appearance of a Next button, a congratulation message etc… I have answered with a solution to such a situation multiple times. Although I have such use cases on my personal blog, thought it was time to summarize how this can be done in the present version.
There is third workflow, using Drag&Drop, not included in this post.
Focus will be on non-responsive projects. Both workflows can be transferred to a responsive project developed with Breakpoint views. Situation is different for Fluid Boxes workflow, will be explained in a future article.

Example movie

Watch this short (rescalable) interactive movie. In between the Title and End slides, you’ll have two slides that look identical, but the first was developed using the (older) workflow Show/Hide, while the second uses a Multistate Object.


Common preparation

Sequence to click the hotspots is not imposed. For that reason tracking the clicks cannot be done using a counter variable.  I created one user variable (Boolean type) for each of the hotspots. A Boolean variable is a variable that has only two possible values: True/False, Yes/No or…. what I mostly use 0/1. The user variables have a default value of 0. Once a hotspot is clicked the value will be changed to 1. In the above example  3 variables were needed:  v_Flash, v_Theme, v_Action. I will reuse them for both slides, the one with the Show/Hide workflow and the one with the Multistate object.  You’ll see how this can be done by a Reset action On Enter for the slides, also useful if you want to give the opportunity to revisit the slide.
The hotspots are shape buttons (arrows). I didn’t use the old Show/Hide workflow to indicate that a shape button has been clicked, but used the Visited State, InBuilt state which can be created for all buttons, including Shape buttons. Here is a screenshot of the Object states for the first hotspot SB_Flash:
Object states Hotspot

Show/Hide Workflow

Timeline of this slide is visible in this screenshot, watch the grouping of the (3) Text shapes:

The action triggered when clicking a hotspot (in this case FlashAct for the shape button SB_Flash) has two decisions. Watch the Preview:

The first decision (standard) hides the group with the text shapes, shows the text shape needed for this hotspot (here SS_Flash) and toggles the value of the associated tracking variable (v_Flash). When duplicating the action (see Advanced Actions Outfit) only the Shape text and the Variable have to be changed for the other hotspots.

The second decision (conditional) checks the value of all tracking variables, and if all hotspots are clicked shows the Next button. This decision is the same for all hotspots.

To allow multiple visits to the slide, you need to create an On Enter action that will restore the original situation. That action (standard) is easy to understand:

Multistate object workflow

The timeline of this slide has less lines:

All texts are now in a state of the multistate object SS_Multi. The Normal state of that shape has no fill (Alpha=0) and no stroke. It looks invisible to the learner.
The action triggered by the hotspot (ThemeActBis) looks very similar to the one in the first workflow:
In the duplicate actions, only the state and the tracking variable have to be edited.
On this slide another On Enter action is needed to reset the slide. Because the Normal state is automatically reset when revisiting the slide (Retain state remained unchecked), no need to reset the Multistate object. The action is shown in this screenshot:


Show/Hide workflow

The text containers can have hyperlinks, which is not possible in states of a multistate object. When grouping the texts, even for more than 3 hotspots, the advanced actions are not that complicated.

However, as shown in the last slide of the example movie, the situation become much more complicated when you want to show more than just text, when you want to show multiple itemsi The grouping will then have to be done for each hotspot.  This will complicate both actions. I’ll show the example of 5 hotspots, each having to show a group of items:

  1. Action to be triggered by a hotspot : instead of having two commands ‘Hide Gr_Text’ and ‘Show TextX’ you’ll need 6 commands:
    Hide Gr_2
    Hide Gr_3
    Hide Gr_4
    Hide Gr_5
    Show Gr_1
  2. For the action resetting the situation the ‘Hide Gr_Text’ will have to be replaced by 5 Hide commands.

Multistate Object workflow

Disadvantage is that you cannot have a hyperlink (nor an inserted variable) in a state.

As for the actions to be used both for Hotspot trigger and for resetting the slide On Enter: the present actions can be used, you only have to add the multiple items to the proper state.

The post Force Clicking Hotspots: Comparison 2 Workflows appeared first on eLearning.

About Slides and Frames – Intro to Micro-navigation

Intro micro-navigation

Recently I presented two sessions about the Timeline at the Adobe eLearning Conference in DC (25th of April 2018). Maybe you did read a previous post, where I offered some easy Timeline Tweaks, taken from the first presentation ‘Demystifying Captivate’s Timeline’ which was aimed at clarifying basic features of the timeline, including the different ways of pausing the timeline. The second presentation ‘Mastering Captivate’s Timeline’ plunged deeper into exploring advanced workflows, including use of variables, advanced/shared actions and…. micro-navigation. I created that term in this (old) article. The word has been adopted by many Captivate users. Time to upgrade this article to integrate the changes within newer versions (system variable names) and the switch from SWF to HTML output. If you have a look at that article, please use a Flash Player enabled browser to watch the embedded interactive movie (SWF).  The present post can be considered as an introduction to ‘micro-navigation’.

Slides versus Frames


You, Captivate user,  are aware of slides and master slides. Slides appear in the Filmstrip and each slide is based on a master slide Master slides have a dedicated panel, which looks very similar to the Filmstrip. In the Newbie UI when activating the Master Slide panel it will replace the Filmstrip in the left docking station. The Timeline panel can be used both for slides and master slides. Timing (horizontal scale) itself has no real meaning for master slides,  panel is used to change the stack order (or z-order) of objects. If you insert a shape button having a pausing point on a master slide,  pause will be visible at the end of the timeline.
For sure you have used navigation commands for slides. In the dropdown list of the Actions tab for any event (slide event, interactive object event) or hyperlink navigation commands are available. They allow you to override the default navigation. ‘Default navigation’ means when the playhead reaches the end of a slide it will automatically move to the next slide.
The slide navigation commands are:
  • Go to the next slide
  • Go to the previous slide
  • Jump to slide …
  • Go to last slide visited
Maybe you are not aware of the availability of dedicated Shape buttons in the Shape thumbnail dialog box, that have an advanced action to go to the Last slide or the First slide of a project?
Also less known are the system variables from the category ‘Movie Control’  related to slide navigation. They be used in actions:
  • cpCmndGotoSlide  can be used to replace the simple command ‘Jump to Slide’; beware: index starts with 0, whereas the index of cpInfoCurrentSlide starts with 1 (exceptional to make it possible to use in a progress indicator). If you want to restart a slide without re-entering the slide, you can use “Expression cpCmndGotoSlide = cpInfoCurrentSlide – 1”
  • cpCmndNextSlide  is a Boolean variable with a default value of 0. With ‘Assign cpCmndNextSlide with 1″ has the same result as Go to the next slide
  • cpCmndPrevious is a Boolean variable with a default value of 0. With ‘Assign cpCmndPrevious with 1″ has the same result as Go to the previous slide


A published cptx-file (to HTML or SWF) is an interactive movie. Each movie ‘(and animation’ plays at a certain speed, the ‘professional’ name for that speed is ‘Frames per Second’ rate, or FPS. The quality of a movie depends on the resolution but also on that FPS number. The default FPS for a published cptx-file is 30FPS. You can see this rate in the Project Info panel.

It is possible to change FPS rate in Preferences, Project Publish settings.

With the default rate (30), each second on the timeline has 30 frames, the smallest unit on the timeline  (0,1sec) 3 frames.  I use the word micro-navigation for navigation between frames. Contrary to the navigation to slides, there are no commands available for micro-navigation. It is only possible using advanced or shared actions which allow you to manipulate the system variables available for frames. The relevant frame system variables are:
From the category ‘Movie Information’
  • cpInfoCurrentFrame: your best friend when exploring Captivate’s timeline, debugging projects with advanced actions, micro-navigation etc. You’ll find that variable inserted in a text container quite often in my tutorials. You can watch an example in this interactive movie
  • cpInfoFPS: returns the FPS rate, by default set to 30 as explained above. This variable can be used in calculations (with Expression) to convert from seconds to frames.
  • cpInfoFrameCount: similar to cpInfoSlideCount (total number of slides in project) it returns the total number of frames in the project. It can be used in combination with the previous variales to calculate to the total duration of the project (as shown in the TOC).
    From the category ‘Movie Control’
  • cpCmndGotoFrame can be used to jump to a frame using its frame number (similar to cpCmndGotoSlide); playhead will not be released, project remains paused.
  • cpCmndGotoFrameAndResume can be used to jump to a frame using its frame number and to release the playhead at the same time, project will continue.


It is just a proposal: test out what you learned by creating a one-slide project, similar to the one visible at the start of this post and as thumbnail.  Design is up to you, but this is required for the ‘exercise’:

  1. Replace ‘No action’ for the On Enter event of the slide by ‘Pause‘; the slide shouldn’t start playing automatically.
  2. Insert the system variable cpInfoCurrentFrame in a text container (example has it bottom right); that will allow you to track the location of the playhead. When starting the slide it will pause immediately, it will show 1 (although the system variable starts with 0, there is a small delay).
  3. You need two buttons: one for navigation forward, and one for navigation backwards. I used two shape buttons from the category Buttons, but replaced the action (see below). In the example they are at bottom center.
  4. A number of objects staggered on the timeline. In the example I have 7 shapes aligned in a row. They appear 1 second later than the previous one. All objects are timed for the Rest of the Slide. Result will be that the slide itself will have a duration that is longer (8secs in my case). To move an object on the timeline one second to the right: select the timeline of that object and use shortcut key CTRL-right (see Colors and Keys for Timeline). Here is a screenshot of the Timeline in my example:
    You see a small gap (0,1 sec) before the first object. Reason is the delay I mentioned before: playhead is stopped at frame 1, I don’ want that shape to appear immediately. Because this is a one slide project, I didn’t need to pause the slide at all, not even at the end. Both buttons have no pausing point as you can see in the Timeline.

Three events are used on this slide for actions:

  1. I already mentioned the On Enter event of the slide, which is set to ‘Pause’.
  2. The button SB_Next triggers a one-line advanced action that should look like this:
  3. The button SB_Back triggers a one-line advanced action that should look like this:

Test! You’ll be ready for more advanced workflows with micronavigation. Watch out for a shared action that can be used in different situations: forcing full view of a slide on first visit, but not on later visits is one of the use cases.

The post About Slides and Frames – Intro to Micro-navigation appeared first on eLearning.