{{tag>category:"presentation server" }}
====== The VALUES and VALUE properties ======
=== Published 04 OCT 2015 at 11:51:16PM ===
When working with ListBox and ComboBox controls it can sometimes be a chore to derive an "internal" value from list of visible items. In many cases this involves creating an associated array of internal values, storing them in the **MISC** property (or a custom "@" property), and then extracting this array and the **SELPOS** property at runtime to arrive at the required data.
For example:
// Set up a LIST and internal items
colorNames = "Red" : @fm : "Green" : @fm : "Blue"
colorVals = 0x0000FF : @fm : 0x00FF00 : @fm : 0xFF0000
call set_Property_Only( @window : ".LIST_1", "LIST", colorNames )
call set_Property_Only( @window : ".LIST_1", "MISC", colorVals )
...
// Then at runtime to access the currently selected internal value
colorVals = get_Property( @window : ".LIST_1", "MISC" )
selPos = get_Property( @window : ".LIST_1", "SELPOS" )
colorVal = colorVals
...
// Or even more long-winded, find an internal value from the external one:
colorNames = get_Property( @window : ".LIST_1", "LIST" )
colorVals = get_Property( @window : ".LIST_1", "MISC" )
locate "Green" in colorNames using @fm setting pos then
greenVal = colorVals
end
...
// or perhaps setting the currently selected item from an internal code:
colorNames = get_Property( @window : ".LIST_1", "LIST" )
colorVals = get_Property( @window : ".LIST_1", "MISC" )
locate 0x00FF00 in colorVals using @fm setting pos then
greenName = colorNames
call set_Property_Only( @window : ".LIST_1", "TEXT", greenName )
end
To make this style of coding somewhat cleaner, OpenInsight 10 introduces the new **VALUES** property, which allows you to set an "internal" value for each item in the control, along with [[https://revdevx.wordpress.com/2013/11/17/property-indexes/|property indexing]] support. There is also a new **VALUE** property, which is the counterpart to the standard **TEXT** property, and provides access to the currently selected item via it's internal value.
Here's the above examples rewritten to use **VALUES** and **VALUE** instead:
// Set up a LIST and internal items
colorNames = "Red" : @fm : "Green" : @fm : "Blue"
colorVals = 0x0000FF : @fm : 0x00FF00 : @fm : 0xFF0000
call set_Property_Only( @window : ".LIST_1", "LIST", colorNames )
call set_Property_Only( @window : ".LIST_1", "VALUES", colorVals )
...
// Then at runtime to access the currently selected internal value
colorVal = get_Property( @window : ".LIST_1", "VALUE" )
...
// Find an internal value from the external one:
greenVal = get_Property( @window : ".LIST_1", "VALUES", "Green" )
// or by position
greenVal = get_Property( @window : ".LIST_1", "VALUES", 2 )
...
// or perhaps setting the currently selected item from an internal code:
call set_Property_Only( @window : ".LIST_1", "VALUE", 0x00FF00 )
**VALUES** and **VALUE** apply to both ListBox and ComboBox controls.
//(Disclaimer: This article is based on preliminary information and may be subject to change in the final release version of OpenInsight 10).//
=== Comments ===
----
=== At 05 OCT 2015 01:29AM Don Bakke wrote: ===
This certainly seems like a helpful improvement. Another way to avoid the cumbersome approach is to create a UDC that displays one value and returns another.
----
=== At 05 OCT 2015 01:11PM Craig Tildesley wrote: ===
I can't remember if you already said but is VALUE read only or can you set your listbox/combo using it?
----
=== At 05 OCT 2015 01:55PM Captain C wrote: ===
Hi Craig - you can use it to set the current selection if you wish - look at the last statement in the second code example to see how it's done.
== Original ID: revdevx.wordpress.com/?p=1457 ==