Solution to being able to use ItemTips smartly in Listboxes.

A few months ago, I posted a problem on the Foxite forum about a problem with FoxPro listboxes and ItemTips.

ItemTips, for those who weren't aware, is a property that when turned on, will show the entire item text when there isn't sufficient space in the width of a listbox.

The problem arises however if you are using two (or more) columns with the listbox and the total width of the list is sufficient but the first column doesn't.

Example
x = createobject("Form")
x.addobject("listbox","listbox")
x.listbox.columncount = 2
x.listbox.columnwidths = "125,50"
x.listbox.additem("This is my long item in my listbox")
x.listbox.additem("This is my longer item in my list")
x.listbox.additem("This is my short item")
x.listbox.visible = .t.
x.listbox.itemtips = .t.
x.listbox.width = 200
x.show()

If you move your mouse over the first item, you will see the tip.
If you move your mouse over the second item, you won't - because the actual text WOULD fit into the text box if you weren't using 2 columns.

Here's the BEFORE picture:

The only solution I had come up with was to pad the text of the items in the list with a bunch of spaces and then some final text, which looks completely bizarre.

Thanks to Rod Lewis of Data Developers - the solution was Found!

It all comes back to the super duper ability to Hide columns. Usually FoxPro developers are used to hiding a column that they want to use as a primary key field but don't want to show it. As in:

listbox.addItem("My company name")
listbox.list(1,2) = "XIFIDSIS"
listbox.columnwidths = "200,0"
listbox.boundcolumn = 2

But this time, think about reversing the logic! When adding the items to your list, add a column before anything else and make the width 0.

Using the previous example:

x = createobject("Form")
x.addobject("listbox","listbox")
x.listbox.columncount = 3
x.listbox.columnwidths = "0,125,50"
x.listbox.additem("This is my long item in my listbox")
x.listbox.additem("This is my longer item in my list")
x.listbox.additem("This is my short item")
x.listbox.list(1,2) = x.listbox.List(1,1)
x.listbox.list(2,2) = x.listbox.List(2,1)
x.listbox.list(3,2) = x.listbox.List(3,1)

x.listbox.visible = .t.
x.listbox.itemtips = .t.
x.listbox.width = 200
x.show()

Et voila!

The ItemTip will reference the very first column which isn't really hidden - but has a width of 0 so it is invisible.

Here's a picture showing the tip:


One gotcha here: it's a good idea to keep the first part of the hidden column the same as your visible column so users can still use the auto-search with the first few letters.


Foxite.COM Visual FoxPro Forum - www.foxite.com - The Home Of The Visual FoxPro Experts
5 comments

Popular Posts