Tuesday, December 29, 2015

New White Papers

I added a half-dozen new white papers to my web site, all from sessions or articles I wrote in 2014: http://doughennig.com/papers/default.html.

Monday, December 07, 2015

What do you want to learn in 2016?

Help us plan for Southwest Fox and Southwest Xbase++ 2016. Comment on recommended topics and add your own on our conference blog.

Make a difference by participating in the conversation!

Wednesday, August 26, 2015

Southwest Fox/Soutwest Xbase++ 2015 Deadline Approaches

Simple, quick reminder: the Early-bird registration deadline is this Monday, August 31st. We would hate to see you lose out on the $50 discount.

If you still need to register, please head over to the registration Web site today: http://geekgatherings.com/Registration

Every registered attendee gets admission and white papers to all regular conference sessions. Don't miss this chance to learn from the best and mix with your peers.

Only 50 days until we gather in Gilbert.

Wednesday, August 19, 2015

Changing Windows 10 Title Bar Colors

In Windows versions prior to 10, the color of window title bars is determined by what theme you’re using. In Windows 10, most applications have a white title bar. It doesn’t matter to me much what color they are, but since I’ve upgraded to Windows 10 and I’m updating the documentation for Stonefield Query as we get ready to release version 5.2, the screen shots I’ve taken for updated forms don’t match the existing screen shots for forms that weren’t changed. I have a few choices:

  • Ignore it, because who else but me will notice? Unfortunately, I’m too anal to take this approach.
  • Redo all screen shots. A cool feature of the Stonefield Query SDK is that it automates the taking of screen shots for about 50% of the dialogs. The reason for that feature is that Stonefield Query is highly configurable and some of the configuration settings affect the appearance of many forms. To make the documentation for a customized version of Stonefield Query match what the user sees, we have a function that regenerates the help, including running the app and automatically taking shots of any such forms. Unfortunately, that still leaves 50% of the forms I’d have to do manually. Life is too short.
  • Somehow change the title bars of the updated forms to use the same color as the existing screen shots.

I wasn’t sure the latter was possible but fortunately came across a blog post by Daniel Rubino that explains how to do it. One thing he doesn’t explain is how to select the desired color for the title bars. To do that, right-click the desktop, choose Personalize, select Colors, turn off Automatically pick an accent color from my background, and select the desired color from the palette that appears.

Monday, August 10, 2015

Southwest Fox News

Bad news and good news. First, the bad: Cathy Pountney had to pull out of speaking at Southwest Fox this year due to a heavy work load. The good news: Tuvia Vinitsky, who’s spoken at Southwest Fox several times, has agreed to take her place. I doubt he’ll be bringing as many shoes as Cathy usually does, but he will be bringing his A-game with two very interesting sessions: dbSchema: SQL Server Database Design and Maintenance Made Easy and PCI Compliance: Facts and Fear. Thanks for stepping up, Tuvia!

Also, a reminder that the September 1 early bird deadline is less than a month away. Sign up today to save $50.

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: http://geekgatherings.com/Registration.

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 (http://www.swfox.net/register.aspx) is now available. See http://www.swfox.net/speakers.aspx for a list of speakers and http://www.swfox.net/sessionsswfox.aspx 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 info@geekgatherings.com 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 http://www.swfox.net/callforspeakers.aspx. Please read the complete Call for Speakers document (linked from that page), and use our proposal submission application at https://geekgatherings.com/Submission. 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.

Thursday, February 12, 2015

Blog Posts on Improving Performance in Stonefield Query

I posted a couple of entries today on the Stonefield Query blog about improving the performance of calculated fields and formulas. If you’re a Stonefield Query customer, I strongly recommend checking them out as they can improve the performance of your reports by orders of magnitude for not a lot of work:

Improving the Performance of Calculated Fields and Formulas, Part 1

Improving the Performance of Calculated Fields and Formulas, Part 2

Wednesday, February 04, 2015

Making TaskScheduler More Useful

A long time ago, I blogged about a couple of classes I wrote to schedule tasks using the Windows Task Scheduler. We use these classes in Stonefield Query to schedule report runs.

Recently, I add a few methods to the VistaTaskScheduler class (so named because it works using the Task Scheduler 2.0 API, which was added starting in Windows Vista; it works in Windows 7, 8, 8.1, and I’m guessing 10 as well) to enumerate tasks (GetTask), get a specific task (GetTask), and delete a task (DeleteTask). I added these because we’re adding a Scheduled Tasks dialog in the next version of Stonefield Query that’ll allow you to see which reports you’ve scheduled, see when the last time a schedule was run and what the result was, edit the settings of a schedule, and delete a schedule, all without having to open the Windows Task Scheduler.

You can download the updated code from the Technical Papers page of my web site.

Sunday, January 04, 2015

You Can Still Buy VFP 9 But Not For Much Longer

If you’re a VFP shop, you need to purchase a new license of VFP when you hire a new developer. Since Microsoft discontinued VFP, that’s been getting harder and harder to do. Fortunately, the German FoxPro User Group still has a license to sell copies of VFP 9. Unfortunately, that license expires on January 12, 2015, which is next week. So, if you still need licenses of VFP, it may be a good idea to stock up now. See http://afp.dfpug.de/message.afp?msgid=738531 for details.