tag:blogger.com,1999:blog-249896252024-03-13T13:07:11.812-05:00Doug HennigThoughts on software development in general, projects I'm working on, and anything else I feel like writing about.Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.comBlogger516125tag:blogger.com,1999:blog-24989625.post-58953892754986596532024-03-10T12:07:00.005-05:002024-03-10T12:07:44.393-05:00Virtual Fox Fest 2024: Speakers, Sessions, and RegistrationVirtual Fox Fest 2024 is a one-day event on Wednesday, May 8, 2024. We have some great <a href="https://virtualfoxfest.com/speakers.aspx" target="_blank">speakers</a> delivering great <a href="https://virtualfoxfest.com/sessions.aspx" target="_blank">sessions</a>, live chatting during presentations, and getting to hang out virtually with new and old friends. This event will feature classic sessions (from previous conferences), updated for 2024, along with at least one brand new session. More details here: <a href="https://virtualfoxfest.com/" target="_blank">https://virtualfoxfest.com/</a><br /> <br /> <a href="https://virtualfoxfest.com/register.aspx" target="_blank">Registration</a> is open! Details, deadlines and cost are available on our Web site. You register for the conference here: <a href="https://geekgatherings.com/Registration" target="_blank">https://geekgatherings.com/Registration</a>. Don't procrastinate, get this done today!<br /><br /> In case you missed it, we’ve already announced <a href="https://swfox.net/" target="_blank">Southwest Fox 2024</a> in Arizona, September 26-29, 2024. More details for this hybrid conference coming in May. The in-person event will be held at the Hampton Inn & Suites Phoenix-Scottsdale and the virtual side on the Hopin platform via the Internet.<br />Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-68325568080882611692024-02-27T06:56:00.003-06:002024-02-27T06:56:43.289-06:00Southwest Fox 2024: Call for Speakers<p>We're excited to offer you Southwest Fox 2024, a hybrid conference; you decide whether to come in-person or watch online! The in-person event will be held at the Hampton Inn & Suites Phoenix-Scottsdale. The virtual event will use the Hopin platform (the same platform we use for <a href="https://virtualfoxfest.com/" target="_blank">Virtual Fox Fest</a>). You can get more information on the <a href="https://swfox.net/" target="_blank">Southwest Fox Conference Web page</a>.</p><p>The conference will take place September 26-29, 2024. </p><p><b>Call for Speakers</b></p><p>We've issued the <a href="https://swfox.net/CallForSpeakers.aspx" target="_blank">Call for Speakers</a> for Southwest Fox. If you are interested in presenting, please read the document referenced on that page to learn about submitting sessions.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-76217815174097833602023-12-30T12:06:00.002-06:002023-12-30T12:06:44.785-06:00Introducing FoxGet Package Manager<p>If you've worked with Visual Studio, you've likely used NuGet, which is a package manager for .NET. The idea is that you can search for libraries you'd like to add to your application, download and install them, and then have them managed (automatically download again if files are missing, update to a new version, etc.).</p><p>FoxGet is a new tool that's the VFP equivalent of NuGet. You run FoxGet when you want to add a library to an application. You search for a library you're interested in and if one is found, you can download, install, and add it to your project with a single mouse click. Of course, you'll have to do the coding part such as calling the library yourself.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgKQ5frELhqnbpwijOoNPYttXBU7-Db6BW3qN4hKI8XnBpr2Me2IdzHt7BoQXf4QJamZOxij9fcQQ9fP-JF3gbGGw90WSDcCKdiVRP-srvP14bavPL6F0to7lnDzraRsm066hAVJhT5jtK1IT4snj3ye-3ptEh8RF3LHlEaV2SAgNo-DPJWNZO_TOnEimE6F20" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="850" data-original-width="1022" height="525" src="https://blogger.googleusercontent.com/img/a/AVvXsEgKQ5frELhqnbpwijOoNPYttXBU7-Db6BW3qN4hKI8XnBpr2Me2IdzHt7BoQXf4QJamZOxij9fcQQ9fP-JF3gbGGw90WSDcCKdiVRP-srvP14bavPL6F0to7lnDzraRsm066hAVJhT5jtK1IT4snj3ye-3ptEh8RF3LHlEaV2SAgNo-DPJWNZO_TOnEimE6F20=w633-h525" width="633" /></a></div><br />FoxGet is available now at <a href="https://github.com/DougHennig/FoxGet">https://github.com/DougHennig/FoxGet</a>. In a little while, it'll be available via Thor Check for Updates. All you need is FoxGet.app. There are currently installers for 24 popular VFP open source libraries.<p></p><p>To use FoxGet, open the project for the application you want to add a library to and DO <i>path</i>\FoxGet.app, where <i>path</i> is the folder where you placed FoxGet.app. If you installed it using Thor Check for Updates, you can choose FoxGet Package Manager from the Thor Tools, Applications menu. Select a library (also known as a package) and click Install. FoxGet downloads just the necessary files (no samples or documentation), puts them into a subdirectory of a new Packages subdirectory of your application folder, and adds the necessary files to your project. Uninstalling is just as easy: select the package and click Uninstall.</p><p>I look forward to any feedback you have: create issues or discussions in the GitHiub repository.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-28341565039364540332023-12-22T14:59:00.002-06:002023-12-22T14:59:43.325-06:00Geek Gatherings 2024: Save the Dates!<p>We have locked in our dates for our 2024 conferences and hope you will save the dates to attend.</p><p>Our one-day Virtual Fox Fest 2024 will be Wednesday, May 8, 2024. It still has the same great features everyone loves about VFF: great speakers delivering great sessions, live chatting during presentations, and getting to hang out virtually with new and old friends. This event will feature classic sessions from previous conferences, updated for 2024.</p><p>We’re excited to offer you Southwest Fox 2024, a hybrid conference, September 26-29, 2024. You decide whether to come in person or watch online! The in-person event will be held at the Hampton Inn & Suites Phoenix-Scottsdale in Scottsdale, Arizona. The virtual event will use the Ring Central Hopin platform (the same platform we use for Virtual Fox Fest).</p><p>Web sites will be updated in the new year. Call for speakers will be announced later in February so get your ideas prepared.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-61338542638540980152023-12-16T09:46:00.000-06:002023-12-16T09:46:26.627-06:00Formatting Strings<p>In the category of building on the shoulders of giants, I adapted the idea Eric Selje presented in <a href="https://saltydogllc.com/string-format-for-visual-foxpro/" rel="nofollow">String.Format for Visual FoxPro</a> and added support for string interpolation. This makes it much easier to code and read statements that combine expressions into a string.</p><p>For example, rather than writing (and later trying to understand):</p><pre>lcMessage = 'The balance for ' + lcUser + ' on ' + transform(datetime()) + ;
' is ' + transform(lnBalance)</pre><div>use this:</div><pre>lcMessage = Format('The balance for {lcUser} on {datetime()} is {lnBalance}')</pre><p>You can get Format.prg from my <a href="https://github.com/DougHennig/FormattingStrings" target="_blank">GitHub repository</a>.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com3tag:blogger.com,1999:blog-24989625.post-3226811812507013602023-09-06T09:34:00.002-05:002023-09-06T09:34:14.458-05:00Southwest Fox is ON!<div>We have good news to share today. Thanks to the support of the Visual FoxPro community and our many sponsors, Southwest Fox 2023 will proceed as planned October 19-22, 2023 in Scottsdale, AZ and online via Hopin (now owned by RingCentral).</div><div><br /></div><div>We really appreciate all the support people have shown for the conference with registrations! That said, the decision comes with a calculated risk because we are still many registrations short of covering all the conference expenses. Please continue to spread the word to your colleagues, clients, user groups and anywhere else Visual FoxPro is spoken.</div><div><br /></div><div>If you haven't yet registered, there's still room for you: <a href="https://geekgatherings.com/Registration">https://geekgatherings.com/Registration</a>.</div><div><br /></div><div>If you've already registered for the in-person conference, you'll receive a confirmation email soon that includes a link for our discounted hotel rate. </div><div><br /></div><div>We are pleased to announce Geekwear by Geek Gatherings. Order your Southwest Fox gear from <a href="https://geekgatherings.logosoftwear.com/">https://geekgatherings.logosoftwear.com/</a>. Choose from the options shown or create your own unique SWFox-wear.</div><div><br /></div><div>Contact Us: If you want to be a sponsor: <a href="mailto:vendors@geekgatherings.com">vendors@geekgatherings.com</a> If you have suggestions or ideas: <a href="mailto:info@geekgatherings.com">info@geekgatherings.com</a> If you have a friend who wants to be on our mailing list, please ask them to sign up on the conference home page to get future mailings. Call: 586.254.2530</div>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-41417156545976727982023-08-28T11:37:00.001-05:002023-08-28T11:37:18.755-05:00Southwest Fox 2023: URGENT - Now or never, register today<span style="font-family: "Calibri",sans-serif; font-size: 11.0pt; mso-ansi-language: EN-CA; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: EN-CA;">The fate of Southwest Fox is being decided
Wednesday, August 30th. Help us make the decision to keep this conference going
easy. We won’t charge your credit card until September. There is no more time
for you to procrastinate. It simply is now or never. If you are going to
Southwest Fox this year (in-person or virtually), please head over to the
registration Web site, right now, before you forget: <a href="https://geekgatherings.com/Registration">https://geekgatherings.com/Registration</a></span>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-39932041623353861912023-08-16T09:27:00.000-05:002023-08-16T09:27:05.394-05:00Southwest Fox 2023: URGENT Early-Bird registration deadline looms!<p><strong><span style="color: #202020; font-family: "Helvetica",sans-serif; font-size: 12.0pt; mso-ansi-language: EN-CA; mso-bidi-font-family: Calibri; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: EN-CA;">SET URGENT ON</span></strong><span style="color: #202020; font-family: "Helvetica",sans-serif; font-size: 12.0pt; mso-ansi-language: EN-CA; mso-bidi-font-family: Calibri; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: EN-CA;"><br />
<br />
<strong>WILL SOUTHWEST FOX 2023 TAKE PLACE? THAT DEPENDS ON YOU.</strong><br />
<br />
We have to decide by August 31 whether to hold Southwest Fox 2023 or not. So
far, registration for both the in-person and virtual conferences has been slow.
We have three options: a hybrid conference as planned, a virtual conference
only, or no conference. If you want us to decide to hold the conference,
register (for either the in-person or virtual event) <strong>before
August 30</strong>. Credit cards will not be charged until September. If
you are registering for the in-person conference, DO NOT book travel until you
hear our decision.<br />
<br />
Please head over to the registration Web site today: <a href="https://geekgatherings.com/Registration" style="-ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;" target="_blank"><span style="color: #007c89;">https://geekgatherings.com/Registration</span></a><br />
<br />
Don't miss this chance to learn from the best and mix with your peers.<br />
<br />
<strong>XSharp Free Post-Conference Session </strong><br />
The XSharp Team is planning a Sunday afternoon (10/22) vendor session called
"Migrating Your VFP App to .NET with X#." Check out our <a href="https://swfox.net/workshops.aspx" style="-ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;" target="_blank"><span style="color: #007c89;">Workshops</span></a> page for all the up-to-date details.<br />
<br />
If you've already registered for the conference and want to attend this
session, email <a href="mailto:register@geekgatherings.com">register@geekgatherings.com</a>
and we'll add you to the post-conference list. <br />
<br />
Only 65 days until we <strong>hope to</strong> gather in
Scottsdale!<br />
<!--[if !supportLineBreakNewLine]--><br />
<!--[endif]--></span></p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-55617562472178263732023-07-29T08:40:00.000-05:002023-07-29T08:40:11.576-05:00Southwest Fox 2023: Super-saver Deadline Approaches<p>Hear that sound? Tick, tick, tick, tick…<o:p></o:p></p>
<p>That’s the countdown clock here at Geek Gatherings getting closer to the
Super-saver deadline for Southwest Fox! <strong><span style="font-family: "Calibri",sans-serif;">July 31st is next Monday</span></strong> and we thought
we would pass along one more reminder just in case you forgot to add it your
reminder list or put a yellow sticky note on your monitor. We still need people
to register to make the in-person side of the conference happen.<o:p></o:p></p>
<p><strong><span style="font-family: "Calibri",sans-serif;">Urgent:</span></strong>
do not make plane reservations until we announce the decision for the in-person
conference, which we expect to make in the coming weeks.<o:p></o:p></p>
<p>The conference takes place October 19-22, 2023 in Scottsdale, Arizona and we
really hope you can be there. We would hate to see you lose out on the $100
discount and for those who really want to attend in-person, miss out on a spot
in the first 50 registrations (the room limit we have for the conference
space).<o:p></o:p></p>
<p>Head over to the registration Web site today: <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=ac37be5777&e=a5818c32fd" target="_blank">https://geekgatherings.com/Registration</a><o:p></o:p></p>
<p>If you’ve already registered, we thank you. Can you help us remind fellow
developers who have been procrastinating about the looming deadline by sharing
this email, sharing about it on social media, or posting on a forum how great a
previous Southwest Fox or Virtual Fox Fest conference was for you? You can also
spread the word by telling others you’re going on our <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=cd8a66b143&e=a5818c32fd" target="_blank">Facebook event</a>.<o:p></o:p></p>
<p><strong><span style="font-family: "Calibri",sans-serif;">Nitty-Gritty Details</span></strong><br />
Check out our list of amazing <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=54c0545988&e=a5818c32fd" target="_blank">speakers</a> and dig into our <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=b43626a31b&e=a5818c32fd" target="_blank">sessions</a>. Follow the <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=b4d4ffb0dd&e=a5818c32fd" target="_blank">news</a> about the conference and our <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=d2cc4e6e4a&e=a5818c32fd" target="_blank">blog</a>.<o:p></o:p></p>
<p><strong><span style="font-family: "Calibri",sans-serif;">Contact Us:</span></strong><o:p></o:p></p>
<ul type="disc">
<li class="MsoNormal">If you want to be a sponsor: <a href="mailto:vendors@geekgatherings.com">vendors@geekgatherings.com</a><o:p></o:p></li>
<li class="MsoNormal">If you have suggestions or ideas: <a href="mailto:info@geekgatherings.com">info@geekgatherings.com</a><o:p></o:p></li>
<li class="MsoNormal">If you have a friend who wants to be on our mailing list
please send them to <a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=da28b691cf&e=a5818c32fd" target="_blank">https://</a><a href="https://geekgatherings.us10.list-manage.com/track/click?u=4904c68c123392482233260ec&id=762c9c4348&e=a5818c32fd" target="_blank">swfox.net</a> where they can sign up to get future
mailings.<o:p></o:p></li>
<li class="MsoNormal">Call: 586.254.2530<o:p></o:p></li>
</ul>
<p>Please beat the rush so we still have some fingernails left when August
begins!<o:p></o:p></p>
<p>We appreciate all the support people have shown for the in-person conference
with early registrations. We look forward to getting many more this week as we
need them to make the <strong><span style="font-family: "Calibri",sans-serif;">“in-person
go”</span></strong> decision; otherwise, we will be all virtual. If you’re
planning to attend the virtual conference, please register now as it helps in
our decision-making process.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-11751900778544733962023-07-11T11:40:00.004-05:002023-07-11T11:40:30.201-05:00Time to Register for Southwest Fox Fest<p><a href="https://swfox.net/speakers.aspx" target="_blank">Speakers</a> and <a href="https://swfox.net/sessions.aspx" target="_blank">sessions</a> for Southwest Fox 2023 have been announced, and registration is open! As I discussed <a href="https://doughennig.blogspot.com/2023/05/southwest-fox-2023.html" target="_blank">earlier</a>, we have a limit on the number of people who can attend in-person, and in less than 24 hours since registration opened, 1/3 of the spots have already been taken. So, if you're considering attending in-person, <a href="https://swfox.net/register.aspx" target="_blank">register today</a> or you'll likely miss out! Also, Super-Saver Registration, which saves you $100, is available only through July 31st, so don't wait. When registering, be sure to select the proper conference on the registration site: choose either the in-person event or the virtual event.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-41500875271712861512023-05-11T10:28:00.002-05:002023-05-11T10:28:54.553-05:00Virtual Fox Fest 2023 (May) Follow-up<p>Here are some follow-up notes about Virtual Fox Fest 2023 (May):</p><p></p><ul style="text-align: left;"><li>Videos for all presentations are now available on YouTube for free to everyone, as our contribution to the VFP community. Be sure to subscribe to <a href="https://youtube.com/@geekgatherings" target="_blank">our channel</a>.</li><li>If you didn't attend Virtual Fox Fest and want materials (white papers and sample code) for the presentations, go to <a href="https://geekgatherings.com/Registration">https://geekgatherings.com/Registration</a> and "register" for the conference. You're not really registering since it's over, but in the Registration Fees section of the registration page, you'll see "Virtual Fox Fest Session Materials" for previous events. There's also an opportunity to sponsor Virtual Fox Fest, which means your name will be listed on our Sponsors page.</li><li>If you didn't attend Virtual Fox Fest, check out our <a href="https://www.facebook.com/events/3410250179245312/" target="_blank">Facebook</a> page and see what you missed, then plan to attend a future one so you can join in the fun.</li><li>We announced Southwest Fox 2023. More about that in <a href="https://doughennig.blogspot.com/2023/05/southwest-fox-2023.html" target="_blank">another blog post</a>.</li></ul><p></p><p><br /></p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-54205425782417527802023-05-11T10:27:00.002-05:002023-05-11T10:27:56.832-05:00Southwest Fox 2023<p>While <a href="https://virtualfoxfest.com/" target="_blank">Virtual Fox Fest</a> (VFF) has been a great way to learn about our favorite development environment and get together virtually, four years is a long time to not see each other in-person. Geek Gatherings is pleased to announce <a href="https://swfox.net/" target="_blank">Southwest Fox 2023</a> (SWFox), October 19-22, our first in-person conference since 2019.</p><p>For a variety of reasons, it'll be different this year.</p><p></p><ul style="text-align: left;"><li>We have a new venue: <a href="https://www.hilton.com/en/hotels/scthshx-hampton-suites-phoenix-scottsdale/" target="_blank">Hampton Inn & Suites Phoenix-Scottsdale</a> in Scottsdale, AZ. It's closer to the airport than the SanTan Elegante Conference & Reception Center in Gilbert so it's a little more convenient, but still close to lots of restaurants for after-hours socializing.<br /><br /></li><li>SWFox will be a hybrid conference: in-person and virtual. When you register, you choose how you'll attend. The virtual event will use the Hopin platform (the same platform we use for Virtual Fox Fest). Sessions are presented live and both streamed to the virtual event and recorded.<br /><br /></li><li>Videos will be available to <b>attendees</b> (in-person and virtual) after the conference. We will <b>not</b> be making videos available to the community for free as we've done with VFF because we really need people to attend to cover our costs.<br /><br /></li><li>In order to provide a 15-minute Q & A session for virtual attendees after each presentation, and to provide 15 minutes for the incoming speaker to set up, there will be 30 minutes between sessions rather than 15 minutes as we've done at past conferences. Because of that, we can only fit five sessions per day rather than six, so we've added a half-day to the conference so we can provide the same number of conference sessions (15) as we've had with past conferences. It now starts with registration Thursday morning, an opening session early Thursday afternoon, followed by three conference sessions. The conference goes all day Friday and Saturday, Sunday morning, and finishes with a closing session Sunday afternoon. See the <a href="https://swfox.net/schedule.aspx" target="_blank">schedule overview</a> for more details. We actually like this schedule and think it's a little more relaxed than at previous conferences.<br /><br /></li><li>Because we're not sure how many people will attend in-person this year, we didn't want to pick a large, expensive venue. As a result, we have a limit of 50 in-person attendees (there's no limited on virtual attendees). That's not one of those "we're giving an artificially low number to drive up demand" kind of limits; it's a hard limit based on the size of the conference room. So, if you want to attend in-person, be sure to sign up as soon as possible after registration opens in early July. If you miss the cut-off of 50 people, you can always attend virtually.<br /><br /></li><li>All sessions are presented in a single room. An advantage of this format is that there's no chance of missing any sessions because they're scheduled opposite other sessions you also want to see. Another is that it eliminates the searching for the next room and trying to find a seat. Also, each speaker only presents one session once rather than two sessions twice, so it's a lot easier on them!<br /><br /></li><li>Hampton includes hot breakfast with your hotel room charge (Rick Schummer tried it when checking out possible venues a couple of months ago and said it was great). Lunch will be provided on Friday and Saturday (likely deli-style but we're still working out the details). Because we aren't providing as many meals, and have limited other costs as much as we can, registration is less expensive than for previous SWFox conferences. Details will be announced in early July.</li></ul><div>One thing that won't be different is a great line up of speakers, inspiring session topics, and the chance to hang out with new and old friends!</div><div><br /></div>We're looking for speakers. If you think you have a topic other developers would be interested in, see our <a href="https://swfox.net/CallForSpeakers.aspx" target="_blank">Call for Speakers</a> page and submit a session proposal.<div><br /></div><div>See you in October!</div>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-55578898809046431102023-05-11T09:33:00.001-05:002023-05-11T09:33:08.316-05:00Anatomy of a VFPX Project<p>At the just-concluded <a href="https://virtualfoxfest.com/" target="_blank">Virtual Fox Fest 2023 (May)</a>, I presented a session titled "<a href="https://virtualfoxfest.com/Sessions.aspx#Anatomy_of_a_VFPX_Project" target="_blank">Anatomy of a VFPX Project</a>". Normally I don't make white papers and sample files from conference sessions available until one year after it was originally presented to discourage people from not attending a conference because the material is available for free. However, the other organizers of Virtual Fox Fest, Rick Schummer and Tamar Granor, agreed with me that this is an important topic for our community because it both encourages and instructs VFP developers on how to contribute to VFPX. So, the white paper and sample files are available now from the <a href="https://doughennig.com/papers.aspx" target="_blank">Technical Papers</a> page of my web site. You can also watch a <a href="https://www.youtube.com/watch?v=PiBvBND5Dl4" target="_blank">video</a> of the presentation.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-8557087043258821592023-04-02T10:13:00.002-05:002023-04-03T08:24:52.365-05:00Move VFP to Another MonitorLike many developers, I have two monitors (some have even more). I like to open Outlook, VFP, and Visual Studio on my primary monitor and my browser, Word, Excel, and other apps on the other one. Sometimes, though, I want two VFP windows open, one on the primary monitor and one on the other, because I'm working on two different versions of an application at the same time. Or sometimes I have VS open on the primary monitor and want VFP open on the other one so I can work on both at the same time.<div><br /></div><div>After opening VFP and dragging it to the other monitor for the 100th time, a lightbulb came on: use a hotkey to toggle VFP between the two monitors. I created this as a <a href="https://github.com/vfpx/thor" target="_blank">Thor</a> tool and assigned Alt-2 to it. Here's the code:</div><pre>Lparameters lxParam1
****************************************************************
****************************************************************
* Standard prefix for all tools for Thor, allowing this tool to
* tell Thor about itself.
If Pcount() = 1 ;
And 'O' = Vartype (lxParam1) ;
And 'thorinfo' == Lower (lxParam1.Class)
With lxParam1
* Required
.Prompt = 'Move VFP to Other Monitor'
* Optional
Text to .Description NoShow
Move VFP to Other Monitor
EndText
.CanRunAtStartUp = .F.
* These are used to group and sort tools when they are displayed in menus or the Thor form
.Source = "Doug's Tools"
Endwith
Return lxParam1
Endif
If Pcount() = 0
Do ToolCode
Else
Do ToolCode With lxParam1
Endif
Return
****************************************************************
****************************************************************
* Normal processing for this tool begins here.
Procedure ToolCode
Lparameters lxParam1
if _screen.Left > 1900
_screen.Left = 2
else
_screen.Left = 1922
endif _screen.Left > 1900
_screen.Visible = .T.
_screen.Top = 54
_screen.Width = 1916
_screen.Height = 950
_screen.WindowState = 2
&& this is needed to force thw window to draw properly
_screen.WindowState = 0
EndProc
</pre>
Your dimensions might be different so adjust this code as necessary. Also, you might not want the tool to be in the Thor menu under "Doug's Tools", so set Source to something appropriate.<div><br /></div><div>UPDATE: it turns out a Windows hotkey will do this: Win+Shift+Arrow Key. Thanks to Jochen Kirstätter (JoKi) for pointing this out.</div>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-38676756120778809792023-04-02T10:01:00.002-05:002023-04-02T10:01:07.333-05:00New VFPX Project: List Manager<div><div>Many tables have columns containing a small range of values. For example, for a customer type column in a customer table, the acceptable values might be "Business", "Consumer", and "Government". Your choices for data entry into such columns are:</div><div><ul style="text-align: left;"><li>Allow the user to type a value. This is bad idea because the user may not know what the acceptable values are or may type them incorrectly.<br /><br /></li><li>Hard-code the values in a combobox. Adding values to the list means changing the program and deploying an update.<br /><br /></li><li>Create lookup tables for the values. If there are a lot of such columns, that's a lot of tables and maintenance forms for those tables to create.</li></ul></div></div><div><a href="https://github.com/DougHennig/ListManager" target="_blank">List Manager</a> is a new VFPX project that manages lists of lookup values and provides controls so users can select values from these lists. A single table contains all of the lookup values for an application and a single maintenance form allows users to add, edit, or remove values.</div><div><br /></div><div><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiYQQVU5auD044ASveUo-brniqpNjuPhC-pFRwJM3fUeSeBc_9q4W-Ed_z50I--GHYNoCaJNNOlZ6D6rW32LLNdqomON_eNPTG6Epcp2TzzLjRDTBv1qTxFV4DllD0k0VOCyiTVi6DUE70AQbkMjBJniTSjRkKr03pe1SG143prPaVJyuJO3Qus67C4G8co" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="277" data-original-width="342" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEiYQQVU5auD044ASveUo-brniqpNjuPhC-pFRwJM3fUeSeBc_9q4W-Ed_z50I--GHYNoCaJNNOlZ6D6rW32LLNdqomON_eNPTG6Epcp2TzzLjRDTBv1qTxFV4DllD0k0VOCyiTVi6DUE70AQbkMjBJniTSjRkKr03pe1SG143prPaVJyuJO3Qus67C4G8co" width="296" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div>Users can select a single value from a specific type of lookup:</div><div><br /></div><div><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi28qC__goCVk83ZH0PJdt9qkG726OSTTi4nxem0ohEmGmUnFvR6evZPFrmEYnzvqN7BCzC0icTpvFQHfXIW3BREI3Xpt5_GYeutckJFq7q1ko4RiDpLbPTzCuckYwgd7PYuQsPEJajrEAXtWp5wjueN-l0kxwY-00-cVRVxkxXIgYs9S2WtBZH3mBNsoNr" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="262" data-original-width="403" height="208" src="https://blogger.googleusercontent.com/img/a/AVvXsEi28qC__goCVk83ZH0PJdt9qkG726OSTTi4nxem0ohEmGmUnFvR6evZPFrmEYnzvqN7BCzC0icTpvFQHfXIW3BREI3Xpt5_GYeutckJFq7q1ko4RiDpLbPTzCuckYwgd7PYuQsPEJajrEAXtWp5wjueN-l0kxwY-00-cVRVxkxXIgYs9S2WtBZH3mBNsoNr" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">or select multiple values into a comma-separated string:</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhsdi0sLdLQ_ptLlgVA2AmXb8asY5FSgarZbSD6Xo9x0L4ngeioosVhbFitnd3jb9S-ZlT5nZR7vqkkTBOk1CS4qGlH4QQfDX-xzQn3FBe_KHsTQlqJp2RDQO0bNaViBp7YpZqlf757SZ8lhY_rOM9EfwvMhtZC2XF6BsXfstkyd_J15vBoFeEsGpJuTbSL" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="325" data-original-width="403" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEhsdi0sLdLQ_ptLlgVA2AmXb8asY5FSgarZbSD6Xo9x0L4ngeioosVhbFitnd3jb9S-ZlT5nZR7vqkkTBOk1CS4qGlH4QQfDX-xzQn3FBe_KHsTQlqJp2RDQO0bNaViBp7YpZqlf757SZ8lhY_rOM9EfwvMhtZC2XF6BsXfstkyd_J15vBoFeEsGpJuTbSL" width="298" /></a></div><br /><br /></div></div>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-64808754711750051352023-03-11T09:23:00.002-06:002023-03-11T09:23:52.344-06:00Virtual Fox Fest 2023 (May)<p>Virtual Fox Fest 2023 (May) is a one-day event on Wednesday, May 10, 2023. We have some great <a href="https://virtualfoxfest.com/speakers.aspx" target="_blank">speakers</a> delivering great <a href="https://virtualfoxfest.com/sessions.aspx" target="_blank">sessions</a>, live chatting during presentations, and getting to hang out virtually with new and old friends. This event will feature classic sessions (from previous conferences), updated for 2023, along with at least one brand new session. More details here: <a href="https://virtualfoxfest.com">https://virtualfoxfest.com</a>.</p><p><a href="https://virtualfoxfest.com/register.aspx" target="_blank">Registration</a> is open! Details, deadlines and cost are available on our Web site. You register for the conference here: <a href="https://geekgatherings.com/Registration">https://geekgatherings.com/Registration</a>. Don't procrastinate, get this done today!</p><p>We’re planning Southwest Fox in Arizona this October. We expect to announce our plans for a hybrid (in-person and virtual) fall conference some time in April.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-69092382562655532502022-12-28T10:11:00.002-06:002022-12-28T10:11:46.873-06:00Upsize VFP Free Tables to SQL Server<p>The <a href="https://github.com/VFPX/upsizingwizard" target="_blank">VFPX Upsizing Wizard</a> allows you to upsize the tables in a database container to a SQL Server database. It can be used visually by running UpsizingWizard.app or programmatically; see TestEngine.prg that comes with the Upsizing Wizard for an example.</p><p>One thing the Upsizing Wizard doesn't do is support free tables. The new <a href="https://github.com/DougHennig/Upsizer" target="_blank">Upsizer</a> utility gives the Upsizing Wizard the ability to do that. I've used it on decent sized data sets (more than 100 tables with 10 GB of data total) and it works very well. One thing I like is that I can run it over and over to upsize to the same database; that allows me to refresh the SQL Server database with changes in the VFP data while we work on upsizing a VFP application.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-54477062838853828282022-12-27T09:31:00.001-06:002022-12-27T09:31:24.364-06:00Updated Upsizing Wizard<p>I released an update for the Upsizing Wizard that fixes a few bugs and adds some new features. Some of these were suggested by Rick Borup in his <a href="https://virtualfoxfest.com/Sessions.aspx#Switching_to_SQL_Server" target="_blank">Switching to SQL Server</a> session at Virtual Fox Fest 2022 (October), including:</p><p></p><ul style="text-align: left;"><li>Optionally creating default values for all columns so fields that don't allow nulls and aren't listed in an INSERT statement don't prevent the statement from executing.</li><li>Optionally exporting table and field comments to the MS_Description extended property.</li><li>Using Varchar(max) rather than Text as the default mapping for Memo.</li></ul><p></p><p>See the 2022.12.27 section of the Releases section of the <a href="https://github.com/VFPX/upsizingwizard" target="_blank">Upsizing Wizard VFPX repository</a> for details on all changes.</p><p>You can install the new version by cloning the repository, downloading the files from the repository, or using Thor Check for Updates.</p><p>And stay tuned: later this week, I'm going to release a new tool that extends the Upsizing Wizard to support free tables and uses <a href="https://doughennig.blogspot.com/2022/11/bulk-copying-vfp-data-to-sql-server.html" target="_blank">SQL Bulk Copy</a> for even better upsizing performance.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-61685560831353540142022-11-14T16:52:00.003-06:002022-11-14T16:52:50.815-06:00Bulk Copying VFP Data to SQL ServerThe VFP Upsizing Wizard does a great job of upsizing a VFP database to SQL Server. However, after doing the initial upsizing, you may wish to re-upload the content of one or more tables with doing a complete re-upsize. A new tool, SQLBulkCopy, available from <a href="https://github.com/DougHennig/SQLBulkCopy">https://github.com/DougHennig/SQLBulkCopy</a>, is great for that.
Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-63681886445143807232022-10-27T07:51:00.002-05:002022-10-27T07:52:40.113-05:00Virtual Fox Fest 2022 (October) Follow-up<p>Here are some follow-up notes about <a href="https://virtualfoxfest.com/">Virtual Fox Fest 2022 (October)</a>:</p><p></p><ul><li>Videos for all presentations are now available on <a href="https://www.youtube.com/channel/UCsLb2rL3ALQW9g5r-qqf_jA/videos">YouTube</a> for free to everyone, as our contribution to the VFP community. Be sure to subscribe to our channel.</li><li>If you didn't attend Virtual Fox Fest and want materials (white papers and sample code) for the presentations, go to <a href="https://geekgatherings.com/Registration">https://geekgatherings.com/Registration</a> and "register" for the conference. You're not really registering since it's over, but in the Registration Fees section of the registration page, you'll see "Virtual Fox Fest Session Materials" for previous events. There's also an opportunity to sponsor Virtual Fox Fest, which means your name will be listed on our <a href="https://virtualfoxfest.com/sponsors.aspx">Sponsors</a> page.</li><li>If you didn't attend Virtual Fox Fest, check out our <a href="https://www.facebook.com/events/416462680307456/">Facebook</a> page and see what you missed, then plan to attend a future one so you can join in the fun.</li></ul>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-77462602484991188812022-09-13T07:36:00.001-05:002022-09-13T07:36:40.986-05:00Virtual Fox Fest 2022 (October): Don't Forget or Regret<p>Thanks to all who have registered for Virtual Fox Fest 2022 (October). Early registrants help us plan ahead. This is another friendly reminder to the rest of you that it takes just a few minutes to <a href="http://geekgatherings.com/Registration" target="_blank">register</a>.</p>
<p>We're really excited about this year's Virtual Fox Fest line-up and we know you will be, too. You can find all the details:</p>
<ul>
<li><a href="https://virtualfoxfest.com/sessions.aspx" target="_blank">Sessions</a></li>
<li><a href="https://virtualfoxfest.com/speakers.aspx" target="_blank">Speakers</a></li>
<li><a href="https://virtualfoxfest.com/sponsors.aspx" target="_blank">Sponsors</a></li>
<li><a href="https://virtualfoxfest.com/register.aspx" target="_blank">Registration Details</a></li>
<li><a href="https://geekgatherings.com/registration" target="_blank">Registration Web site</a></li>
<li><a href="https://virtualfoxfest.com/whoscoming.aspx" target="_blank">Who's Coming</a></li>
</ul>
<p>You can order your <a href="https://geekgatherings.logosoftwear.com/" target="_blank">Virtual Fox Fest gear</a> anytime. If you don't like the items or colors we've chosen, click on any item as a starting point and then click "Customize This Product" to choose the product and color you really want.</p>
<p>Virtual Fox Fest is October 13th, 19th, and 25th, 2022.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-7280894127947578602022-08-29T15:02:00.002-05:002022-08-29T15:02:21.822-05:00Virtual Fox Fest 2022 (Oct): Early-Bird ends in 2 daysLast call! (we want to make sure we have your attention)<div><br /></div><div>The Early-Bird discount ends midnight (North American Eastern time) on Wednesday, which is just a couple of days away. Here is the direct link to get registered: <a href="http://geekgatherings.com/registration">http://geekgatherings.com/registration</a>.</div><div><br /></div><div>Virtual Fox Fest is October 13, 19, and 25, 2022.</div>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-52771427841156846792022-08-16T16:51:00.004-05:002022-08-16T16:51:49.052-05:00Virtual Fox Fest Registration ReminderThanks to all who have already registered for <a href="https://virtualfoxfest.com/" target="_blank">Virtual Fox Fest</a>; we appreciate your support and our speakers are excited to share their sessions with you soon.
Please register for Virtual Fox Fest before September 1st, our Early-Bird deadline. We know you are interested in saving $50, and we would appreciate processing the bulk of the registrations in August. Perfect synergy! As a bonus, we won't process your payment until September.
It takes just a few minutes to <a href="https://virtualfoxfest.com/register.aspx" target="_blank">register</a>. Virtual Fox Fest is October 13, 19, and 25, 2022.Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-16504956281138581732022-08-04T09:13:00.003-05:002022-08-04T09:14:33.393-05:00Virtual Fox Fest 2022 (October): Speakers, Sessions, and Registration<p><a href="https://virtualfoxfest.com/Speakers.aspx" target="_blank">Speakers</a> and <a href="https://virtualfoxfest.com/sessions.aspx" target="_blank">sessions</a> for Virtual Fox Fest 2022 (October) have been announced, and <a href="https://virtualfoxfest.com/register.aspx" target="_blank">registration</a> is open!</p><p>While I’m of course interested in all the sessions, the ones that interest me the most are Joel Leach's <a href="https://virtualfoxfest.com/Sessions.aspx#VFP_C_Compiler" style="color: #de7008;" target="_blank">DevOps with Visual FoxPro</a> and Rick Borup's <a href="https://virtualfoxfest.com/Sessions.aspx#Switching_to_SQL_Server" target="_blank">Switching to SQL Server</a>. I have no experience with the former so I'm keen to learn about it and have lots of experience with the latter so I'm interested in Rick's take.</p><p>Virtual Fox Fest is October 13, 19, and 25, 2022. The cost is $299 US but register before September 1 to save $50.</p>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com0tag:blogger.com,1999:blog-24989625.post-27231946372677329172022-05-21T10:23:00.004-05:002022-05-21T10:25:02.654-05:00Formatting Grids Dynamically<p>I've been working with grids a lot lately, and find setting them up very tedious: set ColumnCount to the desired value, set ControlSource and other properties such as InputMask and Alignment for every column, set Caption and other properties for every header, etc. To make matters worse, if you change the RecordSource for the grid, ControlSource gets reset for every column so now you have to go back and fix them. To matters even worse, if you need to add a new column between two existing ones, you have to move all the property settings for the subsequent columns. (Yes, I know you can just increment ColumnCount and set ColumnOrder for the new column to the proper value, but then the visual appearance of the grid doesn't match the column order in the Properties window. Do that a couple of times and then have fun trying to find a specific column.)</p>
<p>So, I decided to format grids programmatically. At first, I wrote a lot of code like this:</p>
<pre>with This.grdOrders
.ColumnCount = 22
.RecordSource = 'orders'
.Column1.ControlSource = 'orders.line'
.Column1.Width = 30
.Column1.Header1.Caption = 'Line'
.Column2.ControlSource = 'sorder.item'
.Column2.Width = 40
.Column2.Header1.Caption = 'Item #'
* more code here for the rest of the columns
endwith
</pre>
<p>That too grew tedious quickly. So, I decided to dynamically format the grid at run time rather than design time. I added a SetupColumns method to my grid base class with code that accepts a format string and applies it to the grid. Then in an instance of the grid, I write code that sets up the format string and calls SetupColumns. Here's an example:</p>
<pre>text to lcColumns noshow
Field |Width |Caption |Alignment |InputMask |ReadOnly |Control
Invnum |70 |Invoice # | | |.T. |
Date |70 |Date | | |.T. |
Name |* |Project | | |.T. |
Amount |60 |Amount |1 |99,999.99 |.T. |
Hours |40 |Hours |1 |999.99 |.T. |
Paid |70 |Date Paid | | | |Checkbox
Received |60 |Received |1 |99,999.99 | |
endtext
Thisform.grdInvoices.SetupColumns(lcColumns)
</pre>
<p>Here are some rules for the format string:</p><p></p><ul style="text-align: left;"><li>The format settings must be in this order and have a header row like shown above</li><li>Separate format settings with tabs and a pipe</li><li>"Field" is the field name (aliased or not)</li><li>Use a tab for an unspecified value, such as Alignment and InputMask for most of the entries in the example</li><li>Use "*" for Width to "auto-size" a column; that is, size it to the rest of the space after the other columns are sized</li><li>Control specifies what control to use for the column. Currently only Checkbox is supported but others could easily be added</li></ul><p></p><p>Now setting up a grid is just a matter of filling out an easy-to-understand "table" of column settings. Need to add a new column in the middle of the grid? Just add a new line to the table.</p><p>However, it's still slightly tedious because you have to run the form the grid is on to see what it looks like, close the form, edit the table (adjust column widths and alignment, for example), run the form again, rinse and repeat. So, I created a builder named <a href="https://doughennig.com/Papers/Pub/sfgridbuilder.zip" target="_blank">SFGridBuilder</a> that does the same thing at design time. Select the format string without the "text" and "endtext" statements, copy it, invoke the builder, and ta da, the grid is formatted at design time. Tweak the string, copy it, run the builder again ... repeat until perfect. This builder works with any grid, even a VFP base class.</p><p>How do you invoke the builder? Any way you normally would:</p><p></p><ul style="text-align: left;"><li>I added a Builder property to my grid base class and set it to SFGridBuilder.prg</li><li>You can register it with Thor and invoke it through a Thor hot key or menu</li><li>You can register it with Builder.app</li><li>You can run it directly: do (path + 'SFGridBuilder')</li></ul><a href="https://virtualfoxfest.com/2020/Speakers.aspx#RickSchummer" target="_blank">Rick Schummer</a> did a session at Virtual Fox Fest 2020 about builders, so <a href="https://virtualfoxfest.com/2020/Sessions.aspx#Builders_Property_Editors_and_Thor_Boosting" target="_blank">watch the video</a> for details.<p></p><div><br /></div>Doug Hennighttp://www.blogger.com/profile/00208525487680844022noreply@blogger.com4