Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

How can I store more than one piece of information in a ComboBox item?

Posted on 2012-03-13
9
Medium Priority
?
394 Views
Last Modified: 2012-03-13
Hi all,
Sorry if this is a stupid question, but how should I store more than one piece of information in a ComboBox Item?
For example, say I have 3 entries:
'Red'
'Blue'
'Green'

Open in new window

but when I select the item, I want a 'hidden' field to be available, such  as:
'R'
'B'
'G'

Open in new window

Ideally I would like to do something like:
MyCombo.AddItem('Red', 'R');
MyCombo.AddItem('Green', 'G');
MyCombo.AddItem('Blue', 'B');

Open in new window

and be accessed:
HiddenValue := MyCombo.Items[MyCombo.SelIndex].Value;

Open in new window

Any ideas how I can achieve something resembling this?
Any help would be appreciated...
Best regards,
James
0
Comment
Question by:James Atkin
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 2
9 Comments
 
LVL 9

Expert Comment

by:wellhole
ID: 37715026
You could bind your combobox to a datasource (ie MyCombo.Datasource = table) and set the display and value members to the columns in the table.

table = new datatable
table.columns.add("description")
table.columns.add("value")
table.rows.add("desc1", "value1")
table.rows.add("desc2", "value2")
table.rows.add("desc3", "value3")

combo.displaymember = "description"
combo.valuemember = "value"
combo.datasource = table

When you want to get the value of the selection you would simply use MyCombo.SelectedValue.
0
 
LVL 4

Author Comment

by:James Atkin
ID: 37715073
Thanks for the suggestion but this is required for Delphi....
0
 
LVL 9

Expert Comment

by:wellhole
ID: 37715110
My mistake. This new website makes it much more difficult to tell what kind of questions I'm reading.
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
LVL 19

Accepted Solution

by:
Thommy earned 2000 total points
ID: 37715112
Set your combobox items to <name>=<value>

MyCombo.AddItem('Red=R',nil);
MyCombo.AddItem('Green=G',nil);
MyCombo.AddItem('Blue=B',nil);

Open in new window




Retrieve values and names...

var
  AValue: string;
  AName: string;

AValue :=MyCombo.Items.ValueFromIndex[0];  //returns 'R'
AValue :=MyCombo.Items.Values['Red'];  //also returns 'R'

AName:=MyCombo.Items.Names[0];  //returns 'Red'

Open in new window

0
 
LVL 4

Author Comment

by:James Atkin
ID: 37715162
Thanks...
That makes the selection filter correctly, but how do I stop the 'Red=R' from being displayed in the dropdown? It should only display 'Red'
0
 
LVL 4

Author Comment

by:James Atkin
ID: 37715231
Ah!
I can owner draw the ComboBox:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
    ComboBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, ComboBox1.Items.Names[Index]);
end;

Open in new window

Is this a 'correct' way to achieve this?
0
 
LVL 19

Expert Comment

by:Thommy
ID: 37715269
if you don't want both, name and value, displayed in your combobox I suggest to use a separate stringlist...

 
  sl: TstringList;  //global var

  ComboBox1.AddItem('Red',nil);
  ComboBox1.AddItem('Green',nil);
  ComboBox1.AddItem('Blue',nil);

  //create separate stringlist with names and values derived from combobox
  sl:=TStringList.create;  
  sl.AddStrings(combobox1.Items);
  sl[0]:=sl[0]+'=R';
  sl[1]:=sl[1]+'=G';
  sl[2]:=sl[2]+'=B';

Open in new window


Retrieve data using current combobox item data...

var
  AValue: string;
  AName: string;

//returns value of your current combobox item
AValue :=sl.ValueFromIndex[combobox1.ItemIndex];  

//also returns value of your current combobox item
AValue :=sl.Values[combobox1.Text];

//returns name of your current combobox item
//same as combobox1.Text
AName:=sl.Names[combobox1.ItemIndex];  

Open in new window

0
 
LVL 19

Expert Comment

by:Thommy
ID: 37715373
Using OwnerDraw is also possible, but keep in mind to set style property of your combobox to csOwnerDrawFixed or csOwnerDrawVariable to activate OnDrawItem event...
0
 
LVL 4

Author Closing Comment

by:James Atkin
ID: 37715392
Thanks for the help :-)
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a q…
In response to a need for security and privacy, and to continue fostering an environment members can turn to for support, solutions, and education, Experts Exchange has created anonymous question capabilities. This new feature is available to our Pr…
Suggested Courses

722 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question