Monday, July 06, 2015

Southwest Fox/Southwest Xbase++ 2015 Are a Go!

I’m delighted to tell you that Rick, Tamar, and I met (via Skype) and made the decision to move forward with this year's conferences. Registrations to date are almost identical to last year's on the same date, giving us confidence that the conferences remain financially feasible.

We're also happy to tell you that we've added Rick Borup to the speaker list. I’m especially looking forward to his Version Control Faceoff: Git vs Mercurial session, because while I use Mercurial daily, I’m not that familiar with Git.

See you in October!

Wednesday, June 24, 2015

Southwest Fox 2015 Super-Saver Deadline Approaches

The countdown clock is ticking! The Super-Saver deadline for Southwest Fox and Southwest Xbase++ 2015 is June 30th, less than a week away. We still need people to register to make the conferences happen.

The conferences take place October 15-18, 2015 in Gilbert, Arizona and we really hope you can be there. We would hate to see you miss out on the $125 discount, the FREE pre-conference session, and an opportunity to win a scholarship or a license of Stonefield Query SDK (a $6,000 value).

After checking out our list of amazing speakers and digging into our session tracks for VFP and Xbase++, head over to the registration Web site today:

Friday, June 12, 2015

Listen to the FoxShow #80

Andrew MacNeill posted the latest version of the FoxShow featuring an interview with Rick, Tamar, and I about Southwest Fox and Southwest Xbase++ 2015.

Wednesday, June 10, 2015

Displaying Balloon Tips with Listboxes

Stonefield Query makes it very simple to create a report: select the fields you want, set the properties of those fields as necessary, and click Preview to run the report. However, sometimes it’s hard to tell exactly what the report will look like until you do preview it: you may have grouped on one field, summed another, changed the font for a third, and so on. You have to go into the Properties dialog for each field to see how it’s formatted in the report. For example, in this report, you can’t immediately tell how each field appears in the report:


One of the things we wanted to add is the ability to see the formatting for each field without having to go into the Properties dialog for each one. We decided to do that using balloon tips.

ctl32_BalloonTip is a class created by Carlos Alloatti that’s part of his ctl32 library. It provides the ability to display balloon tips in a VFP form. Balloon tips are similar to tool tips but are much more attractive, give you greater control over their appearance, and can display a lot more text. I discussed this class in detail in the July 2011 issue of FoxRockX. Here, you can see that the Freight field is summed at group breaks, displays the percentage of the total, and is formatted as a currency value. All you have to do is hover your mouse over the field in the list and the balloon tip tells you what you need to know.


Getting the balloon tip to display the settings for the field under the mouse pointer was a little tricky. The biggest issue is how to know what “line” the mouse is over in the list. There isn’t a property of the Listbox class that tells you that so you have to calculate it using the following factors:
  • The current mouse position. If you do this in the MouseMove event like I do, the X and Y coordinates are passed as parameters; it’s the Y value we need. However, the Y value is relative to the form, so we have to subtract the location of the top of the Listbox. We can’t use the Top property because the Listbox may be inside a container (in this case, it is), so we’ll use OBJTOCLIENT() to get the top of the Listbox relative to the form.
  • The height of a line. We can get that using FONTMETRIC(1) to measure the height using the Listbox’s FontName and FontSize properties. We’ll then divide the calculated mouse Y position by the height to get the line number.
  • Where the Listbox is scrolled to. If the user scrolls the list, the line number of the item under the mouse needs to be adjusted by how far down the user scrolled. Fortunately, the TopIndex property of Listbox tells us that, so we’ll add that to the value calculated above.
Here’s the code for the MouseMove method of the Listbox:

lparameters tnButton, ;
     tnShift, ;
     tnXCoord, ;
local lnHeight, ;
    lnLine, ;
    lcLine, ;
    lcField, ;
lnHeight = fontmetric(1, This.FontName, This.FontSize) + 2
lnLine   = int((tnYCoord - objtoclient(This, 1))/lnHeight) + ;
lcLine   = transform(lnLine)
lcField  = This.List[lnLine, 2]
if This.Tag <> lcLine and not empty(lcField)
      loField = Thisform.oReport.oFieldsCollection.Item(lcField)
      if vartype(loField) = 'O'
      endif vartype(loField) = 'O'
      This.Tag = lcLine
endif This.Tag <> lcLine ...

A few things about this code:
  • There’s a little space between lines in the list, so we have to adjust the value returned by FONTMETRIC(1). I thought adding FONTMETRIC(4) (the leading) would be reasonable but that ended up being too high. I hate using a constant like “2” here but am not sure what the adjustment value can be derived from.

  • Not everyone knows this, but the List and ListItem members of Listbox can be 2-dimensional arrays. In this case, the first column of the current row contains the caption of the field displayed to the user and the second column contains the field name, which is used as an index into a collection of the fields in the report. To add a second column to List and ListItem, use code like:

    list.AddListItem(lcFieldName, list.NewItemID, 2)

  • MouseMove fires when the mouse moves even a pixel. We really only need to update the balloon tip when the user moves the mouse to a new line, so we put the line number into the Tag property (I could’ve added a specific property to a Listbox subclass but didn’t want to change the class used in the existing form) and only call the form’s HandleBalloonTip method when the line changes.

  • HandleBalloonTip does the actual work of displaying the balloon tip. I’m not going to show the code here because it’s fairly lengthy and specific to Stonefield Query. Basically, the code consists of building a string of the contents to display in the balloon tip and then displaying it using:

    This.oBalloonTip.ctlShow(6, lcText, toField.cCaption, 1)

    6 means display the balloon tip at the mouse location and 1 means use the information icon in the balloon tip.
That’s it. Not a lot of code, but it took a few minutes to work out the calculations to get the item under the mouse. Hopefully, this blog post inspires you to look at Carlo’s balloon tip control and saves you some time if you want to use it with listboxes.

Monday, June 01, 2015

Registration for Southwest Fox 2015 now available

Registration for Southwest Fox ( is now available. See for a list of speakers and for a list of sessions. Super-Saver Registration, which saves you $125, is available only through June 30th, so don't wait.

Putting on a conference is a risky endeavor. Conference centers require a guaranteed minimum income to block the dates of a conference; for a conference like Southwest Fox, that minimum is in the tens of thousands of dollars. We have to commit to the conference center by July 2nd and need your support by July 1st to make that commitment. We will not send out any "We need your help" appeals so please do not wait; register by June 30th! We know most of you like to wait until the last minute to avoid the credit card bill arriving too soon. We will not charge any attendee credit cards or cash any checks until we have committed to going forward (sometime after July 2), so this is not is a reason to wait.

Rick, Tamar, and I look forward to seeing you in October!

Tuesday, May 05, 2015

Southwest Fox and Southwest Xbase++ 2015 Speakers and Sessions Announced

Speakers and sessions for both conferences have been announced.

As Tamar blogged a few weeks ago, this year was the hardest it’s ever been to select speakers and topics. Not only were the submissions outstanding, economics have forced us to cut back on the number of speakers a little this year (although as Tamar notes, we’ll change that if registrations before July 1 allow us to do so).

Some sessions I’m personally looking forward to seeing are:

  • Toni’s An Introduction to SQL Server Reporting Services: I haven’t played with SSRS much so this sounds like a great introduction, and Toni is such a great speaker. I’m not sure I’ll be able to attend—it’s a morning pre-con session and we’re usually busy with registrations on Thursday morning—but I’ll try.
  • Christof’s GemBox: An Alternative to Microsoft Office Automation: another topic I’m very interested in. Christof is a speaker’s speaker: his sessions are always insightful and well-researched. Another pre-con so again I may not be able to make it; if not, I know his white paper will be top-notch.
  • Cathy’s Extending VFP Reports with XFRX and VFP Reports: A Potpourri of Cool Ideas: I’ve been using XFRX for more than 10 years and my company’s product, Stonefield Query, uses it extensively. However, Cathy’s session touches on some features I haven’t used, including its drawing API. Her potpourri session sounds like it’ll discuss how to do some really complex things that only Cathy can figure out how to do. I always learn a lot in Cathy’s sessions so these two should be gold.
  • Phil’s The New Rules of Marketing and Sales: last year, Phil hit it out of the park with his SWFox sessions. I’ve already implemented some of the tips he presented to great success (and by that I mean making money!), so I’m expecting this year’s session to be equally as great.

I’m also really interested in Tamar’s Can't This Application go any Faster? and Rick’s Your Developer Life Improved By Thor sessions, but hopefully they’ll present those sessions at the German DevCon in November so I can use those timeslots at SWFox to see other sessions.

Registration opens soon; send an email to if you want us to email you when it’s ready. See you in October!

Wednesday, February 18, 2015

Southwest Fox/Xbase++ 2015 Call for Speakers

The call has gone out!

We’re inviting anyone interesting in speaking at this year’s conferences to submit topics. You'll find the Call for Speakers at Please read the complete Call for Speakers document (linked from that page), and use our proposal submission application at Session proposals are due by March 9. (Yes, this is earlier than in prior years. We have some publicity plans that require us to have a little more lead time than in the past.)

As in the past few years, we plan to offer a good selection of topics in core VFP development, extending VFP, using VFP with other technologies, and VFPX, as well as technology sessions to help VFP developers become better developers, not just more expert at VFP. We are looking for a few sessions on paths forward for VFP developers and we’re looking for a few deep-dive post-conference sessions. The Call for Speakers also lists some topics last year’s attendees specifically requested.

Please don’t hesitate to ask if you have any questions. We’re looking forward to seeing your proposals. We expect that, as usual, choosing among them will be one of the hardest things we do all year.