Using Option Menus

This tutorial describes how to use the option menu for selecting an item from a list of items.

Introduction

The option menu is a configurable list of a fixed number of items from which you can select an item. For example, you may want to use this kind of menu when selecting the title someone has, or the color of paint when you are buying a new car. In this tutorial we cover how to set up an option menu and return the value someone selected.

Creating the Option Menu Control

Open LiveCode and select New Mainstack from the File menu. This creates a new stack window on which to create the option menu. Drag and drop an option menu control onto the LiveCode card (1). By default, this control has three values from which you can select an item. Open the Property Inspector by right clicking the option menu and selecting Property Inspector (2). In the Basic Properties view, you can change the name of the Label to a default value that is displayed when the option menu is first displayed. You can also change the Menu Items (3) to the values that should be selectable from the list of items.

In this example we are setting the Label to "cat", and the Menu Items to "cat", "dog", "mouse", "elephant", "whale" and "crocodile".

Adding the Option Menu Code

Once you have specified the options that are to be displayed in the option menu, you can add the code that processes the selection. Right click on the option menu you created and select Edit Script (1). This opens the script editor with four lines of default code, as is shown in the figure above. The code provides you with a handler that is called when someone makes a selection, and a framework that allows you to process the selected item. The switch statement provides you with the means to identify what item was selected from the options menu.

Processing the Selection

In order to process the selections from the list, it is necessary to expand the case statement in the default code. In this example the case statement creates small dialog boxes with information about each animal that is selected. Individual case statements are ended with break statements.

on menuPick pItemName

switch pItemName

case "cat"

answer "A cat is larger than a mouse." with "Okay"

break

case "dog"

answer "A dog is man's best friend." with "Okay"

break

case "mouse"

answer "A mouse does not only eat cheese." with "Okay"

break

case "elephant"

answer "An elephant has a good memory." with "Okay"

break

case "whale"

answer "A whale is not a fish." with "Okay"

break

case "crocodile"

answer "A crocodile is reptile." with "Okay"

break

end switch

end menuPick

Also notice the way the items are displayed (1). Only five of the possible selections are displayed on the screen. This is because Display in the Property Inspector is set to 5. Try changing this value and see if you can make the scroll bar disappear.

20 Comments

David Smith

Cannot get " whale" to answer!
Have enough options available.
Checked spelling , grammar and layout -stumped any ideas?

Elanor Buchanan

Hi David

Is it only "whale" that will not answer? Have you checked that you have the break statements in each case?

You could also try stepping through the script using the debugger to see what values you have and which case is being matched.

I hope that helps.

Kind regards

Elanor

Erick Franco

How would I set up an option menu to go to a certain card that
is related to a certain option in the menu? For example, if the user chooses the option "Chest" ( for muscle group in fitness app) and I want the user to be taken to a "Chest" card that lists Chest exercises when they hit the Next button OR a "Triceps" card that lists Triceps exercises when they choose that option out of the list and hit the Next button.

Hanson Schmidt-Cornelius

Hi Erick,

here are the steps to set up this kind of process.
1. Create a card that contains an "Option Menu" and a "Button"
2. Open the "Property Inspector" for the "Option Menu" and call it "ComboBox"
3. Create the "Menu Items" in the "Option Menu" and name them something like: "chest", "arms", "hips", "legs" …
4. Edit the script of the button and add the following code:
on mouseUp
go to card the selection of button "ComboBox"
end mouseUp
4. Create a number of cards.
5. Use the "Application Browser" to set the name of each card to the names you created for the "Menu Items" of the "ComboBox": "chest", "arms", "hips", "legs" …
6. Test the application

A sample stack "chest.livecode" is attached to this lesson.

Kind Regards,

Hanson

John

Brilliant! going through all these lessons and loving LiveCode more and more!

Thanks for the tutorial!

Mark Smith

Couple of things not mentioned here.

1. The "choice" is recorded in the button label so you could just read that to get the result: "If the label of btn "Option Menu" is "Go" then... or "put the label of btn "Option Menu" into fld (or custom property) "xxx". In other words, depending on what you want to do you don't necessarily need to use a case statement.

2. You can dynamically set the default value of the option menu by setting the value of the label.

Dave

i cannot seem to get more than the three choices up on the option menu ,can only do cat, dog ,mouse, how do i expand the choices please ..newbie, thanks.

Hanson Schmidt-Cornelius

Hi Dave,

I am not quite sure at what stage you are having the problem. Either inserting the option values in the Property Inspector or actually only seeing three of the options appear when you are trying to select them from the Option Menu.

If you are having trouble inserting more than three items into the Menu Items field of the Property Inspector, then note that each entry is separated by return and not by comma. You can add a new entry by pressing return after the last entry in the Menu Item field of the Property Inspector.

If you are having trouble displaying more than three items when you try to select an item from the Option Menu, then you can try to increase the number of items to display in the Property Inspector. Under the Menu Items field you can find a Display Items entry that has a number associated with it. Increase that value and you should see more entries.

Kind Regards,

Hanson

Rick

Do option menus work in Android? My code is running fine, but the option menu does not work in Android

Hanson Schmidt-Cornelius

Hi Rick,

mobile and desktop operate slightly differently and some features that you would expect on the desktop are not not available in a mobile form and vice versa. This is the case for the "Option Menu".
You can use the mobile equivalents, such as "mobilePick" and the "Pulldown Menu".

Kind Regards,

Hanson

bill wester

I want to use a script to load a "Title" option menu from a CSV file. If the CSV file changes the number of items in the option menu will change. I have been able to do this in Visual Basic, but am switching to LiveCode.

Any help? Thank you.

Hanson Schmidt-Cornelius

Hi Bill,

you can do that in LiveCode too.

Load the file into memory. Have a look at this lesson for some info on loading text files: http://lessons.runrev.com/s/lessons/m/4071/l/9600

Then you may want to use a loop that goes through the data in memory and extracts the information you want to appear in the options of the option menu.

Some relevant items to look up in the dictionary may be: repeat, itemDelimiter, item, word.

You would then populate the content of the option menu as follows:

set the text of button "Button Name" to "item 1" & return & "item 2" ....

Hope this helps.

Kind Regards,

Hanson

David

I have a slightly different issue. I'm using an SQLite database to populate the option list. I have a text string I'd like to show the user and an associated ID number that refers to the db record. What I'd like to do is easily map the option choice to the ID number. I don't want to show the ID number - i.e. I could have the menu text include the number - but that's not the goal. I've solved this in the past with a hidden field that contains the ID numbers in the order in which they're presented, then have to do an itemoffset search for the line number, but what a pain. Is there a more direct mechanism?

-- Thanks, David

Hanson Schmidt-Cornelius

Hi David,

well there is no direct way to store hidden information with an item in the option menu. So what you describe certainly is a valid approach. A look up of kind is necessary.

You could create a lookup array or list of items that is stored in the custom properties of an option menu.
This allows you to wrap the lookup information into the option menu control, without needing other controls outside of the option menu.
I would then also suggest to add some code to the option menu script, hiding the lookup functionality through simple commands/functions that you can call from your main code.

Kind Regards,

Hanson

Darrin

Hello,

New to LC but looks like a better way to build apps rather than struggling with xcode.

I have a mysql database and am connected to it. I am able to insert data into it.

I have two buttons that the user will selection year and sex results. When I add the record to it, all of the possible selections are added to the database. For example the choices include: male, female and coed. I select male however all of the items are inputted.

Below is the code I am using. Any help is appreciated.

Thank you.

on mouseUp
    -- check the global connection ID to make sure we have a database connection
    global gConnectionID
    if gConnectionID is not a number then
        answer error "Please connect to the database first."
        exit to top
    end if
        -- edit these variables to match your database & table    -- this assumes a table called Table1 with 3 fields
    put "Teams" into tTableName
    put "TeamName, City, Year, Sex" into tFields
    put field "TeamName" into tTeamName
    put field "City" into tCity
put button "Year" into tYear
put button "Sex" into tSex
        -- this is nonsensical but gives some variation to the data
    
    -- construct the SQL - the :1, :2 & :3 placeholders in the SQL will be filled by variables in the revExecuteSQL line
    put "INSERT INTO " & tTableName & " (" & tFields & ") VALUES (:1, :2, :3, :4)" into tSQL
    
    -- send the SQL to the database, filling in the placeholders with data from variables
    revExecuteSQL gConnectionID, tSQL, "tTeamName", "tCity", "tYear", "tSex"
    
    -- check the result and display the data or an error message
    if the result is a number then
        answer info "New record added."
    else
        answer error "There was a problem adding the record to the database:" & cr & the result
    end if
end mouseUp

Hanson Schmidt-Cornelius

Hi Darrin,

try the following:

put the selection of button "Year" into tYear

Kind Regards,

Hanson

Tracy

I really wanna to use the label which is selected from option menu. And put the label into the SQL.

The name of my option menu is "TYPE".
put "Table1" into tTableName
put "typeName, styleName, levelName"
into tFields
============
--Here I open a new card with a field named "f1"--

put the label of button "TYPE" into field "f1"
put field "f1" into ttypeName

Those two commands don't work.

Is there any idea that can help to store in a easy way?

- Thanks, Tracy

Jeff

I'm using an option menu for the user to select between three operational speeds. Based on their selection, a tolerance needs to be calculated. This is the option button structure:

case "900 rpm"
put "5" into var900offset
break
case "1800 rpm"
put "4" into var1800offset
break

I have a button on the same page, when pressed/released performs a movement calculation and also needs to determine if the calculated numbers are in tolerance. So, I'm looking for the syntax for the calculate button to put the variable into my formula when the user selects from the option menu.

It's giving me fits, but this is also the first app I'm working on and have never coded anything before.

Thanks for any assistance!

Elanor Buchanan

Hi Tracy

If you are referring to a control that is not on the current card you just need to tell LiveCode where to find that control. So, I think, the option menu is on one card (Card 1) and the field is on another, in that case you need to say

put the label of button "TYPE" of card 1 into field "f1"
put field "f1" into tTypeName

this is assuming you are on the card that has field "f1" on it.

I hope that helps.

Elanor

Elanor Buchanan

Hi Jeff

When you create a variable in LiveCode it is a local variable, that means it can only be accessed within the script it is created in. In your example you are setting up the variables in the option menu and then trying to use them in the button script, where they are not available.

You can get around this using global variables, script local variable or custom properties, whichever option seems simplest to you.

Have a look at chapters 5.5: Variables and 7.8: Custom Properties in the User Guide, which can be found in the Help menu.

You might also find these lessons useful

http://lessons.runrev.com/m/4603/l/284467-variables-in-livecode
http://lessons.runrev.com/m/4071/l/13158-what-are-the-alternatives-to-using-global-variables

I hope that helps.

Elanor

Add your comment

E-Mail me when someone replies to this comment