<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Frank Perez's Blog - VFP</title>
    <link>http://www.pfsolutions-mi.com/blog/</link>
    <description>Tips, tricks, rantings, ravings, ideas, and life as a Visual FoxPro developer.</description>
    <language>en-us</language>
    <copyright>Frank Perez</copyright>
    <lastBuildDate>Sun, 14 Dec 2008 20:35:47 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.0.7226.0</generator>
    <managingEditor>frankperez@pfsolutions-mi.com</managingEditor>
    <webMaster>frankperez@pfsolutions-mi.com</webMaster>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=245a2b77-76bc-4f00-a27f-ae356383fd7a</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,245a2b77-76bc-4f00-a27f-ae356383fd7a.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,245a2b77-76bc-4f00-a27f-ae356383fd7a.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=245a2b77-76bc-4f00-a27f-ae356383fd7a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just the other day I got burned by what I consider a rookie mistake. I was working
with a Visual FoxPro application (compiled as a multi-threaded DLL) that records application
events to a Visual FoxPro table. To limit the size of the log table, the application
re-used records after 500,000 events by updating the oldest record instead of adding
new records.
</p>
        <p>
As a general rule I know that I should always use a SELECT command before performing
any command or function that processes a work area. For example, in the following
sample code the SCATTER command is used to copy data from the current record to an
array. Because this command processes the current work area only, I should always
select the desired work area first. 
</p>
        <pre>
* create a cursor with a single record
CREATE CURSOR "CURSOR01" (character1 C(10))
INSERT INTO "CURSOR01" (character1) VALUES("VALUE01")

* create another cursor with a single record
CREATE CURSOR "CURSOR02" (character1 C(10))
INSERT INTO "CURSOR02" (character1) VALUES("VALUE02")

* before calling the SCATTER command, select the work area
SELECT("CURSOR01")
SCATTER NAME loValues

* this should display "VALUE01"
WAIT WINDOW loValues.character1
</pre>
        <p>
The exception to this rule is any command that has an IN clause or alias parameter.
For example, in the following sample code the REPLACE command can safely be used without
selecting the desired work area first.
</p>
        <pre>
* create a cursor with a single record
CREATE CURSOR "CURSOR01" (character1 C(10))
INSERT INTO "CURSOR01" (character1) VALUES("VALUE01")

* create another cursor with a single record
CREATE CURSOR "CURSOR02" (character1 C(10))
INSERT INTO "CURSOR02" (character1) VALUES("VALUE02")

* this should display "CURSOR02"
WAIT WINDOW ALIAS()

* change the value in CURSOR01 cursor
REPLACE character1 WITH "NEWVALUE" IN "CURSOR01"

* this should display "NEWVALUE"
WAIT WINDOW CURSOR01.character1
</pre>
        <p>
In this particular situation, I was using a LOCATE command without specifically selecting
the work area first. In an application compiled into an EXE, executing the LOCATE
command when the current work area is blank would cause an Open File Dialog similar
to the one below to appear.
</p>
        <p>
          <img src="http://pfsolutions-mi.com/blog/images/2008-12-14/vfp_open_dialog.jpg" />
        </p>
        <p>
However, in an application compiled into a DLL, the LOCATE command appears to be ignored
if the current work area is blank. An error does not get thrown and the program simply
executes the next line of code. :(
</p>
        <p>
Fortunately, I was able to track down and fix the problem quickly. I'm sure that this
is one of those mistakes that we all make at one time or another. I'm just hoping
that by blogging about it, I will be less likely to make it again {g}.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=245a2b77-76bc-4f00-a27f-ae356383fd7a" />
      </body>
      <title>Always Select or Specify a Work Area</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,245a2b77-76bc-4f00-a27f-ae356383fd7a.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/12/14/AlwaysSelectOrSpecifyAWorkArea.aspx</link>
      <pubDate>Sun, 14 Dec 2008 20:35:47 GMT</pubDate>
      <description>&lt;p&gt;
Just the other day I got burned by what I consider a rookie mistake. I was working
with a Visual FoxPro application (compiled as a multi-threaded DLL) that records application
events to a Visual FoxPro table. To limit the size of the log table, the application
re-used records after 500,000 events by updating the oldest record instead of adding
new records.
&lt;/p&gt;
&lt;p&gt;
As a general rule I know that I should always use a SELECT command before performing
any command or function that processes a work area. For example, in the following
sample code the SCATTER command is used to copy data from the current record to an
array. Because this command processes the current work area only, I should always
select the desired work area first. 
&lt;/p&gt;
&lt;pre&gt;
* create a cursor with a single record
CREATE CURSOR "CURSOR01" (character1 C(10))
INSERT INTO "CURSOR01" (character1) VALUES("VALUE01")

* create another cursor with a single record
CREATE CURSOR "CURSOR02" (character1 C(10))
INSERT INTO "CURSOR02" (character1) VALUES("VALUE02")

* before calling the SCATTER command, select the work area
SELECT("CURSOR01")
SCATTER NAME loValues

* this should display "VALUE01"
WAIT WINDOW loValues.character1
&lt;/pre&gt;
&lt;p&gt;
The exception to this rule is any command that has an IN clause or alias parameter.
For example, in the following sample code the REPLACE command can safely be used without
selecting the desired work area first.
&lt;/p&gt;
&lt;pre&gt;
* create a cursor with a single record
CREATE CURSOR "CURSOR01" (character1 C(10))
INSERT INTO "CURSOR01" (character1) VALUES("VALUE01")

* create another cursor with a single record
CREATE CURSOR "CURSOR02" (character1 C(10))
INSERT INTO "CURSOR02" (character1) VALUES("VALUE02")

* this should display "CURSOR02"
WAIT WINDOW ALIAS()

* change the value in CURSOR01 cursor
REPLACE character1 WITH "NEWVALUE" IN "CURSOR01"

* this should display "NEWVALUE"
WAIT WINDOW CURSOR01.character1
&lt;/pre&gt;
&lt;p&gt;
In this particular situation, I was using a LOCATE command without specifically selecting
the work area first. In an application compiled into an EXE, executing the LOCATE
command when the current work area is blank would cause an Open File Dialog similar
to the one below to appear.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://pfsolutions-mi.com/blog/images/2008-12-14/vfp_open_dialog.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
However, in an application compiled into a DLL, the LOCATE command appears to be ignored
if the current work area is blank. An error does not get thrown and the program simply
executes the next line of code. :(
&lt;/p&gt;
&lt;p&gt;
Fortunately, I was able to track down and fix the problem quickly. I'm sure that this
is one of those mistakes that we all make at one time or another. I'm just hoping
that by blogging about it, I will be less likely to make it again {g}.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=245a2b77-76bc-4f00-a27f-ae356383fd7a" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,245a2b77-76bc-4f00-a27f-ae356383fd7a.aspx</comments>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=39e9773d-3a64-4fa2-98c0-c151e06f8ac3</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=39e9773d-3a64-4fa2-98c0-c151e06f8ac3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ever since I decided to post the Beyond Compare add-on utility, VFP2Text, it was always
my intention to also release the source code. The reason I waited was to allow some
time for any bug reports or major enhancement ideas. I figured initially it would
be easier for me to handle them.
</p>
        <p>
Well, it's been over a month since I first blogged about the add-on and so far no
problems reported and the enhancement requests have been about minor changes. So,
in keeping with my original plan, I have posted the source code for the utility on
my web site <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">here</a>.
</p>
        <p>
In return, I ask that you please share with me any cool enhancements or bugs you find.
Thanks.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=39e9773d-3a64-4fa2-98c0-c151e06f8ac3" />
      </body>
      <title>VFP2Text Source Code</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/15/VFP2TextSourceCode.aspx</link>
      <pubDate>Tue, 15 Apr 2008 11:03:32 GMT</pubDate>
      <description>&lt;p&gt;
Ever since I decided to post the Beyond Compare add-on utility, VFP2Text, it was always
my intention to also release the source code. The reason I waited was to allow some
time for any bug reports or major enhancement ideas. I figured initially it would
be easier for me to handle them.
&lt;/p&gt;
&lt;p&gt;
Well, it's been over a month since I first blogged about the add-on and so far no
problems reported and the enhancement requests have been about minor changes. So,
in keeping with my original plan, I have posted the source code for the utility on
my web site &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In return, I ask that you please share with me any cool enhancements or bugs you find.
Thanks.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=39e9773d-3a64-4fa2-98c0-c151e06f8ac3" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,39e9773d-3a64-4fa2-98c0-c151e06f8ac3.aspx</comments>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=6fedbe29-948e-4a90-a532-c13187b03b0a</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6fedbe29-948e-4a90-a532-c13187b03b0a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night Mike Feltman, of F1 Technologies, did a presentation called "Collections".
He discussed the basics of collections and arrays, and very some cool utilities he
wrote for working with both.
</p>
        <p>
One of cool things I learned had to do with the FOXOBJ clause of the FOR EACH ...
ENDFOR command. For example, in the following code sample "loObject" is not a Visual
FoxPro object, but is re-casted as a COM object.
</p>
        <p>
          <code>loCollection = CREATEOBJECT("Collection")<br />
loCollection.Add(CREATEOBJECT("Custom"))<br />
FOR EACH loObject IN loCollection<br />
   &amp;&amp; loObject is a COM object, AMEMBERS() returns 0.<br />
ENDFOR</code>
        </p>
        <p>
Starting with Visual FoxPro 9, we can add the FOXOBJ clause so that loObject is a
Visual FoxPro object. This is an important distinction, because functions like AMEMBERS()
and COMOBJ() would produce unexpected results.
</p>
        <p>
          <code>loCollection = CREATEOBJECT("Collection")<br />
loCollection.Add(CREATEOBJECT("Custom"))<br />
FOR EACH loObject IN loCollection FOXOBJECT<br />
   &amp;&amp; loObject is a Visual FoxPro object, AMEMBERS() returns
18.<br />
ENDFOR</code>
        </p>
        <p>
The FOXOBJ clause was not new to me. However, what I did not know was that using the
FOXOBJ clause made the FOR EACH ... ENDFOR command almost 2x faster than the FOR ...
ENDFOR equivalent.
</p>
        <p>
          <code>* create a collection with 10,000 items<br />
loCollection = CREATEOBJECT("Collection")<br />
FOR m.lnX = 1 TO 10000<br />
   loCollection.Add(CREATEOBJECT("Custom"))<br />
ENDFOR<br /><br />
* test the performance using FOR EACH<br />
m.lnStartTime = SECONDS()<br />
FOR EACH loObject IN loCollection<br />
   * do nothing, we already have an object reference<br />
ENDFOR<br />
? "FOR EACH: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;&amp; 0.156 seconds<br /><br />
* test the performance using FOR EACH with FOXOBJ<br />
m.lnStartTime = SECONDS()<br />
FOR EACH loObject IN loCollection FOXOBJ<br />
   * do nothing, we already have an object reference<br />
ENDFOR<br />
? "FOR EACH with FOXOBJ: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;&amp; 0.016
seconds<br /><br />
* test the performance using simple FOR<br />
m.lnStartTime = SECONDS()<br />
FOR m.lnX = 1 TO loCollection.COUNT<br />
   * get an object reference to the item<br />
   loObject = loCollection.ITEM(m.lnX)<br />
ENDFOR<br />
? "FOR: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;&amp; 0.031 seconds</code>
        </p>
        <p>
Little gems like this are one of the benefits of attending local FoxPro user groups
meetings. The opportunity to learn something new, meet new people, and the comradery
are all valuable benefits. 
</p>
        <p>
If you missed this presentation, I heard that Mike will be presenting it again at
the Grand Rapids Area FoxPro User Group on May 10th, 2008.
</p>
        <p>
          <br />
Links:<br />
DAFUG <a href="http://dafug.org">http://dafug.org</a><br />
GRAFUG <a href="http://www.grafug.com">http://www.grafug.com</a><br />
F1 Technologies <a href="http://www.f1tech.com">http://www.f1tech.com</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6fedbe29-948e-4a90-a532-c13187b03b0a" />
      </body>
      <title>April 2008 - DAFUG Meeting</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/11/April2008DAFUGMeeting.aspx</link>
      <pubDate>Fri, 11 Apr 2008 22:43:36 GMT</pubDate>
      <description>&lt;p&gt;
Last night Mike Feltman, of F1 Technologies, did a presentation called "Collections".
He discussed the basics of collections and arrays, and very some cool utilities he
wrote for working with both.
&lt;/p&gt;
&lt;p&gt;
One of cool things I learned had to do with the FOXOBJ clause of the FOR EACH ...
ENDFOR command. For example, in the following code sample "loObject" is not a Visual
FoxPro object, but is re-casted as a COM object.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;loCollection = CREATEOBJECT("Collection")&lt;br&gt;
loCollection.Add(CREATEOBJECT("Custom"))&lt;br&gt;
FOR EACH loObject IN loCollection&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; loObject is a COM object, AMEMBERS() returns 0.&lt;br&gt;
ENDFOR&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Starting with Visual FoxPro 9, we can add the FOXOBJ clause so that loObject is a
Visual FoxPro object. This is an important distinction, because functions like AMEMBERS()
and COMOBJ() would produce unexpected results.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;loCollection = CREATEOBJECT("Collection")&lt;br&gt;
loCollection.Add(CREATEOBJECT("Custom"))&lt;br&gt;
FOR EACH loObject IN loCollection FOXOBJECT&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; loObject is a Visual FoxPro object, AMEMBERS() returns
18.&lt;br&gt;
ENDFOR&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
The FOXOBJ clause was not new to me. However, what I did not know was that using the
FOXOBJ clause made the FOR EACH ... ENDFOR command almost 2x faster than the FOR ...
ENDFOR equivalent.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;* create a collection with 10,000 items&lt;br&gt;
loCollection = CREATEOBJECT("Collection")&lt;br&gt;
FOR m.lnX = 1 TO 10000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;loCollection.Add(CREATEOBJECT("Custom"))&lt;br&gt;
ENDFOR&lt;br&gt;
&lt;br&gt;
* test the performance using FOR EACH&lt;br&gt;
m.lnStartTime = SECONDS()&lt;br&gt;
FOR EACH loObject IN loCollection&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* do nothing, we already have an object reference&lt;br&gt;
ENDFOR&lt;br&gt;
? "FOR EACH: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;amp;&amp;amp; 0.156 seconds&lt;br&gt;
&lt;br&gt;
* test the performance using FOR EACH with FOXOBJ&lt;br&gt;
m.lnStartTime = SECONDS()&lt;br&gt;
FOR EACH loObject IN loCollection FOXOBJ&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* do nothing, we&amp;nbsp;already have an object reference&lt;br&gt;
ENDFOR&lt;br&gt;
? "FOR EACH with FOXOBJ: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;amp;&amp;amp; 0.016
seconds&lt;br&gt;
&lt;br&gt;
* test the performance using simple FOR&lt;br&gt;
m.lnStartTime = SECONDS()&lt;br&gt;
FOR m.lnX = 1 TO loCollection.COUNT&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* get an object reference to the item&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;loObject = loCollection.ITEM(m.lnX)&lt;br&gt;
ENDFOR&lt;br&gt;
? "FOR: " + TRANSFORM(SECONDS() - m.lnStartTime) &amp;amp;&amp;amp; 0.031 seconds&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Little gems like this are one of the benefits of attending local FoxPro user groups
meetings. The opportunity to learn something new, meet new people, and the comradery
are all valuable benefits. 
&lt;/p&gt;
&lt;p&gt;
If you missed this presentation, I heard that Mike will be presenting it again at
the Grand Rapids Area FoxPro User Group on May 10th, 2008.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
DAFUG &lt;a href="http://dafug.org"&gt;http://dafug.org&lt;/a&gt;
&lt;br&gt;
GRAFUG &lt;a href="http://www.grafug.com"&gt;http://www.grafug.com&lt;/a&gt;
&lt;br&gt;
F1 Technologies &lt;a href="http://www.f1tech.com"&gt;http://www.f1tech.com&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6fedbe29-948e-4a90-a532-c13187b03b0a" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,6fedbe29-948e-4a90-a532-c13187b03b0a.aspx</comments>
      <category>DAFUG</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=3d894438-42aa-4791-a8c7-fab5fb5118f2</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3d894438-42aa-4791-a8c7-fab5fb5118f2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I downloaded my first issue of FoxRockX and I have to say that I like it. The format
reminds me of the old FoxTalk issues. There is a good amount of content; twenty-four
pages with out any advertisements. And of course, source code was included.
</p>
        <p>
Out of the five articles in this issue, Doug Hennig's "Deep Dive: A Generic Import
Utility" is my favorite. This article is part one of a two-part series that will demonstrate
how to add a generic import utility to your application. In this issue he discusses
the overall design and engine code. The next issue will be about the user interface.
</p>
        <p>
Articles like this are a major reason why I subscribe to technical publications.
Maybe I don't have a need for this today. But, I know that there is a good chance
I will someday. And when that time comes I will more than likely use this article
and sample code as inspiration for designing and writing my own.
</p>
        <p>
          <br />
Links:<br />
FoxRockX <a href="http://www.foxrockx.com">http://www.foxrockx.com</a><br />
Subscription in America &amp; Asia <a href="http://www.hentzenwerke.com">http://www.hentzenwerke.com</a><br />
Subscriptions in Europe <a href="http://shop.dfpug.com">http://shop.dfpug.com</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=3d894438-42aa-4791-a8c7-fab5fb5118f2" />
      </body>
      <title>FoxRockX March 2008</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/09/FoxRockXMarch2008.aspx</link>
      <pubDate>Wed, 09 Apr 2008 22:27:24 GMT</pubDate>
      <description>&lt;p&gt;
I downloaded my first issue of FoxRockX and I have to say that I like it. The format
reminds me of the old FoxTalk issues. There is a good amount of content; twenty-four
pages with out any advertisements. And of course, source code was included.
&lt;/p&gt;
&lt;p&gt;
Out of the five articles in this issue, Doug Hennig's "Deep Dive: A Generic Import
Utility" is my favorite. This article is part one of a two-part series that will demonstrate
how to add a generic import utility to your application. In this issue he discusses
the overall design and engine code. The next issue will be about the user interface.
&lt;/p&gt;
&lt;p&gt;
Articles like this are a major&amp;nbsp;reason why I subscribe to technical publications.
Maybe I don't have a need for this today. But, I know that there is a good chance
I will someday. And when that time comes I will more than likely use this article
and sample code as inspiration for designing and writing my own.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
FoxRockX &lt;a href="http://www.foxrockx.com"&gt;http://www.foxrockx.com&lt;/a&gt; 
&lt;br&gt;
Subscription in America &amp;amp; Asia &lt;a href="http://www.hentzenwerke.com"&gt;http://www.hentzenwerke.com&lt;/a&gt; 
&lt;br&gt;
Subscriptions in Europe &lt;a href="http://shop.dfpug.com"&gt;http://shop.dfpug.com&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=3d894438-42aa-4791-a8c7-fab5fb5118f2" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,3d894438-42aa-4791-a8c7-fab5fb5118f2.aspx</comments>
      <category>FoxRockX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=ec88b5d6-43d5-495a-a50a-3f52d39c33f5</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ec88b5d6-43d5-495a-a50a-3f52d39c33f5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last year we let our subscription to FoxTalk lapse for several reasons. For starters,
there was the marketing tactics of Eli Journals. Then there was the matter where the
archive issues, published before Eli Journals took over, were no longer available
on the web site. But most of all, I felt that the content was not what it used to
be.
</p>
        <p>
So when I heard that Rainer Becker was starting a new on-line magazine called FoxRockX,
I was like "hey that's cool". Then I heard that one of my favorite columns, the KitBox,
would be coming back along with the always entertaining Marcia Atkins and Andy Kramek...and
I thought "that's awesome". But when I found that a FoxRockX subscription included
on-line access to the complete archives of FoxTalk issues...I was sold.
</p>
        <p>
It is going to be so cool to have the old FoxTalk issues available in a searchable
format. I don't know how many times I've been able to get a head start on a problem
by taking advantage of something in one of those articles. Plus, I can't wait to see
the new stuff.
</p>
        <p>
          <br />
Links:<br />
FoxRockX <a href="http://www.foxrockx.com">http://www.foxrockx.com</a><br />
Subscription in America &amp; Asia <a href="http://www.hentzenwerke.com">http://www.hentzenwerke.com</a><br />
Subscriptions in Europe <a href="http://shop.dfpug.com">http://shop.dfpug.com</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ec88b5d6-43d5-495a-a50a-3f52d39c33f5" />
      </body>
      <title>FoxRockX Announcement</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/04/08/FoxRockXAnnouncement.aspx</link>
      <pubDate>Tue, 08 Apr 2008 22:21:43 GMT</pubDate>
      <description>&lt;p&gt;
Last year we let our subscription to FoxTalk lapse for several reasons. For starters,
there was the marketing tactics of Eli Journals. Then there was the matter where the
archive issues, published before Eli Journals took over, were no longer available
on the web site. But most of all, I felt that the content was not what it used to
be.
&lt;/p&gt;
&lt;p&gt;
So when I heard that Rainer Becker was starting a new on-line magazine called FoxRockX,
I was like "hey that's cool". Then I heard that one of my favorite columns, the KitBox,
would be coming back along with the always entertaining Marcia Atkins and Andy Kramek...and
I thought "that's awesome". But when I found that a FoxRockX subscription included
on-line access to the complete archives of FoxTalk issues...I was sold.
&lt;/p&gt;
&lt;p&gt;
It is going to be so cool to have the old FoxTalk issues available in a searchable
format. I don't know how many times I've been able to get a head start on a problem
by taking advantage of something in one of those articles. Plus, I can't wait to see
the new stuff.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
FoxRockX &lt;a href="http://www.foxrockx.com"&gt;http://www.foxrockx.com&lt;/a&gt; 
&lt;br&gt;
Subscription in America &amp;amp; Asia &lt;a href="http://www.hentzenwerke.com"&gt;http://www.hentzenwerke.com&lt;/a&gt; 
&lt;br&gt;
Subscriptions in Europe &lt;a href="http://shop.dfpug.com"&gt;http://shop.dfpug.com&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=ec88b5d6-43d5-495a-a50a-3f52d39c33f5" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,ec88b5d6-43d5-495a-a50a-3f52d39c33f5.aspx</comments>
      <category>FoxRockX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=f47c9f7e-bb1d-480d-9ff0-116b36f88e55</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f47c9f7e-bb1d-480d-9ff0-116b36f88e55</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beyond Compare is one of my favorite developer utilities.  It's a tool for comparing
folders, files, and folder like things such as ZIP and CAB files.  It can detect
differences using several methods, such as the timestamp, size, CRC, attributes, and
more.
</p>
        <p>
          <img src="http://pfsolutions-mi.com/blog/images/2008-03-08/folder_comparison.jpg" />
        </p>
        <p>
          <br />
Once two files are identified as not identical, you can drill down into the contents
and see exactly what is different line by line using Beyond Compare's File Viewer.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/text_file_comparison.jpg" />
        </p>
        <p>
          <br />
This feature is cool, however the native file viewer only supports text files such
as HTML, TXT, XML, and so on.  If you try to compare a binary file, you get something
that looks like this.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/binary_file_comparison.jpg" />
        </p>
        <p>
          <br />
I checked Beyond Compare's web site and found several plug-ins for viewing other binary
files like BMP, GIF, JPG, and MP3.  Hmm, not what I was looking for, but could
be a handy thing to have in the future.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/image_file_comparison.jpg" />
        </p>
        <p>
          <br />
I looked around a little more and I found some file viewer rules for handling binary
files like DOC, XLS, and PDF.  Once again, not what I needed, but I would probably
need some day.
</p>
        <p>
So I decided to download a few of these and what I found is that the file viewer rules
use Beyond Compare's capability to launch an external conversion program before a
file is passed to it's native file viewer.  For example, the DOC rule uses a
Visual Basic Script (VBS) to automate Microsoft Word, open the passed DOC file, and
then save a copy of it to a temporary text file.  This temporary file is then
passed to Beyond Compare's internal File Viewer for the line by line comparison.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/word_file_comparison.jpg" />
        </p>
        <p>
          <br />
Bingo!  If Beyond Compare can call an external conversion program, why not write
something that converts FoxPro files to plain text files.  And thus VFP2TEXT
was created.
</p>
        <p>
Here's how it works.  I created a file viewer rule in Beyond Compare for all
FoxPro related file types (CDX, DBC, DBF, DCT, DCX, FPT, FRT, FRX, FXP, H, LBT, LBX,
MNT, MNX, MPR, MPX, PJT, PJX, PRG, QPR, SCT, SCX, VCT, VCX).  This rule calls
executes VFP2TEXT.EXE passing both the original file name and a temporary file name.
</p>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/file_comparison_rules.jpg" />
        </p>
        <p>
          <br />
Based on the file type, the VFP2TEXT.EXE program converts the passed file to a text
file using one of the following methods:
</p>
        <ul>
          <li>
Index (CDX, DCX): retrieve the index tag information only.</li>
          <li>
Table (DBF, DBC, FRX, SCX, etc): use the CURSORTOXML() function to generate an XML
file.</li>
          <li>
Text (H, MPR, PRG, etc): no conversion.</li>
          <li>
Visual Class Library (VCX): use the Class Browser View Code feature to generate a
PRG file.</li>
        </ul>
        <p>
          <img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/vcx_file_comparison.jpg" />
        </p>
        <p>
          <br />
If you would like a copy of this utility, you can download the latest version from
my web site <a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx">here</a>. 
When using it, there are a couple of things to keep in mind:
</p>
        <ul>
          <li>
Beyond Compare will execute the conversion program twice, once for the file on the
left and once for the file on the right.</li>
          <li>
Be careful about doing a Rules-Based Comparison on a large directory.  I prefer
to use the Binary Comparison first, and then use a Rules-Based Comparison on the results.</li>
        </ul>
        <p>
          <br />
Links:<br />
Beyond Compare <a href="http://www.scootersoftware.com/">http://www.scootersoftware.com/</a></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=f47c9f7e-bb1d-480d-9ff0-116b36f88e55" />
      </body>
      <title>Beyond Compare</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2008/03/08/BeyondCompare.aspx</link>
      <pubDate>Sat, 08 Mar 2008 12:48:52 GMT</pubDate>
      <description>&lt;p&gt;
Beyond Compare is one of my favorite developer utilities.&amp;nbsp; It's a tool for comparing
folders, files, and folder like things such as ZIP and CAB files.&amp;nbsp; It can detect
differences using several methods, such as the timestamp, size, CRC, attributes, and
more.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://pfsolutions-mi.com/blog/images/2008-03-08/folder_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Once two files are identified as not identical, you can drill down into the contents
and see exactly what is different line by line using Beyond Compare's File Viewer.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/text_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
This feature is cool, however the native file viewer only supports text files such
as HTML, TXT, XML, and so on.&amp;nbsp; If you try to compare a binary file, you get something
that looks like this.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/binary_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
I checked Beyond Compare's web site and found several plug-ins for viewing other binary
files like BMP, GIF, JPG, and MP3.&amp;nbsp; Hmm, not what I was looking for, but could
be a handy thing to have in the future.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/image_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
I looked around a little more and I found some file viewer rules for handling binary
files like DOC, XLS, and PDF.&amp;nbsp; Once again, not what I needed, but I would probably
need some day.
&lt;/p&gt;
&lt;p&gt;
So I decided to download a few of these and what I found is that the file viewer rules
use Beyond Compare's capability to launch an external conversion program before a
file is passed to it's native file viewer.&amp;nbsp; For example, the DOC rule uses a
Visual Basic Script (VBS) to automate Microsoft Word, open the passed DOC file, and
then save a copy of it to a temporary text file.&amp;nbsp; This temporary file is then
passed to Beyond Compare's internal File Viewer for the line by line comparison.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/word_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Bingo!&amp;nbsp; If Beyond Compare can call an external conversion program, why not write
something that converts FoxPro files to plain text files.&amp;nbsp; And thus VFP2TEXT
was created.
&lt;/p&gt;
&lt;p&gt;
Here's how it works.&amp;nbsp; I created a file viewer rule in Beyond Compare for all
FoxPro related file types (CDX, DBC, DBF, DCT, DCX, FPT, FRT, FRX, FXP, H, LBT, LBX,
MNT, MNX, MPR, MPX, PJT, PJX, PRG, QPR, SCT, SCX, VCT, VCX).&amp;nbsp; This rule calls
executes VFP2TEXT.EXE passing both the original file name and a temporary file name.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/file_comparison_rules.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Based on the file type, the VFP2TEXT.EXE program converts the passed file to a text
file using one of the following methods:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Index (CDX, DCX): retrieve the index tag information only.&lt;/li&gt;
&lt;li&gt;
Table (DBF, DBC, FRX, SCX, etc): use the CURSORTOXML() function to generate an XML
file.&lt;/li&gt;
&lt;li&gt;
Text (H, MPR, PRG, etc): no conversion.&lt;/li&gt;
&lt;li&gt;
Visual Class Library (VCX): use the Class Browser View Code feature to generate a
PRG file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img src="http://www.pfsolutions-mi.com/blog/images/2008-03-08/vcx_file_comparison.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
If you would like a copy of this utility, you can download the latest version from
my web site &lt;a href="http://www.pfsolutions-mi.com/dnn/Downloads/tabid/76/Default.aspx"&gt;here&lt;/a&gt;.&amp;nbsp;
When using it, there are a couple of things to keep in mind:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Beyond Compare will execute the conversion program twice, once for the file on the
left and once for the file on the right.&lt;/li&gt;
&lt;li&gt;
Be careful about doing a Rules-Based Comparison on a large directory.&amp;nbsp; I prefer
to use the Binary Comparison first, and then use a Rules-Based Comparison on the results.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
Beyond Compare &lt;a href="http://www.scootersoftware.com/"&gt;http://www.scootersoftware.com/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=f47c9f7e-bb1d-480d-9ff0-116b36f88e55" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,f47c9f7e-bb1d-480d-9ff0-116b36f88e55.aspx</comments>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=61e2c554-d7ea-4eb7-8598-6c30537dd03f</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=61e2c554-d7ea-4eb7-8598-6c30537dd03f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night Paul Mrozowski did a presentation called "Lucene.NET as a Document Search
Engine".  He began by explaining that <a href="http://incubator.apache.org/projects/lucene.net.html">Lucene.NET</a> is
an open source indexing and search library written in C#.  It is not a traditional
application.  Instead it is a tool developers can use to index and search documents,
such as CHM, DOC, HLP, PDF, RTF, and TXT files.  
</p>
        <p>
Paul first demonstrated how easy it is to install Lucene.NET, some of the configuration
settings, and how to set it up to run as a background service in Microsoft Windows. 
Next he showed us a COM wrapper class that he created in order to use Lucene.NET from
Visual FoxPro.
</p>
        <p>
The wrapper class could be used to index the source files and perform some pretty
complex searches.  I liked the way it could include the surrounding portions
of text with the search results.  For example, if you searched for the phrase
"fox" in "Visual FoxPro Rocks", you could include a variable amount of the original
characters found before and after the search phrase.
</p>
        <p>
In addition to indexing document files, he also demonstrated how the wrapper class
could be used to build your own index entries with meta data.  For example, you
could index the contents of a memo field and then store the table name and record
identification in the meta data.  Later, this information could be searched the
same as document file.
</p>
        <p>
Although the wrapper class did not have the complete functionality of Lucene.NET,
it did fill the most basic needs.  He mentioned the idea of either posting the
sample code to his web site or better yet making it a <a href="http://www.codeplex.com/VFPX">VFPX</a> project. 
All in all, it was a very cool presentation.
</p>
        <p>
          <br />
Links:<br />
DAFUG <a href="http://dafug.org">http://dafug.org</a><br />
Paul Mrozowski <a href="http://www.rcs-solutions.com">http://www.rcs-solutions.com</a><br /></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=61e2c554-d7ea-4eb7-8598-6c30537dd03f" />
      </body>
      <title>December 2007 - DAFUG Meeting</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/12/14/December2007DAFUGMeeting.aspx</link>
      <pubDate>Fri, 14 Dec 2007 19:06:16 GMT</pubDate>
      <description>&lt;p&gt;
Last night Paul Mrozowski did a presentation called "Lucene.NET as a Document Search
Engine".&amp;nbsp; He began by explaining that &lt;a href="http://incubator.apache.org/projects/lucene.net.html"&gt;Lucene.NET&lt;/a&gt; is
an open source indexing and search library written in C#.&amp;nbsp; It is not a traditional
application.&amp;nbsp; Instead it is a tool developers can use to index and search documents,
such as CHM, DOC, HLP, PDF, RTF, and TXT files.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Paul first demonstrated how easy it is to install Lucene.NET, some of the configuration
settings, and how to set it up to run as a background service in Microsoft Windows.&amp;nbsp;
Next he showed us a COM wrapper class that he created in order to use Lucene.NET from
Visual FoxPro.
&lt;/p&gt;
&lt;p&gt;
The wrapper class could be used to index the source files and perform some pretty
complex searches.&amp;nbsp; I liked the way it could include the surrounding portions
of text with the search results.&amp;nbsp; For example, if you searched for the phrase
"fox" in "Visual FoxPro Rocks", you could include a variable amount of the original
characters found before and after the search phrase.
&lt;/p&gt;
&lt;p&gt;
In addition to indexing document files, he also demonstrated how the wrapper class
could be used to build your own index entries with meta data.&amp;nbsp; For example, you
could index the contents of a memo field and then store the table name and record
identification in the meta data.&amp;nbsp; Later, this information could be searched the
same as document file.
&lt;/p&gt;
&lt;p&gt;
Although the wrapper class did not have the complete functionality of Lucene.NET,
it did fill the most basic needs.&amp;nbsp; He mentioned the idea of either posting the
sample code to his web site or better yet making it a &lt;a href="http://www.codeplex.com/VFPX"&gt;VFPX&lt;/a&gt; project.&amp;nbsp;
All in all, it was a very cool presentation.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Links:&lt;br&gt;
DAFUG &lt;a href="http://dafug.org"&gt;http://dafug.org&lt;/a&gt;
&lt;br&gt;
Paul Mrozowski &lt;a href="http://www.rcs-solutions.com"&gt;http://www.rcs-solutions.com&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=61e2c554-d7ea-4eb7-8598-6c30537dd03f" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,61e2c554-d7ea-4eb7-8598-6c30537dd03f.aspx</comments>
      <category>VFP</category>
      <category>DAFUG</category>
      <category>.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=6b02ae1f-e354-4a12-8261-4a1570ab90d3</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,6b02ae1f-e354-4a12-8261-4a1570ab90d3.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,6b02ae1f-e354-4a12-8261-4a1570ab90d3.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6b02ae1f-e354-4a12-8261-4a1570ab90d3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I started today with Doug Hennig's session Best Practices for Vertical Application
Development.  Although I had attended this same session previously at the 2006
Great Lakes Great Database Workshop conference, I still managed to learn some new
things.  If you missed this session I have a couple of book recommendations of
my own.  Check out "Eric Sink on the Business of Software" by none other than
Eric Sink.  And finally "Micro-ISV: From Vision to Reality" by Bob Walsh.
</p>
        <p>
My last session was Marcia Akins QuickBooks Automation.  Marcia did an amazing
job of demonstrating of how to get started with the QuickBooks COM component. 
I especially liked all of the "gotcha" warnings.
</p>
        <p>
In summary, I had a really good time at Southwest Fox this year.  It was good
to see some old friends, make some new ones, and learn new ways to use my favorite
development tool - Visual FoxPro.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6b02ae1f-e354-4a12-8261-4a1570ab90d3" />
      </body>
      <title>Southwest Fox 2007 - Day 4</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,6b02ae1f-e354-4a12-8261-4a1570ab90d3.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/10/21/SouthwestFox2007Day4.aspx</link>
      <pubDate>Sun, 21 Oct 2007 22:27:01 GMT</pubDate>
      <description>&lt;p&gt;
I started today with Doug Hennig's session Best Practices for Vertical Application
Development.&amp;nbsp; Although I had attended this same session previously at the 2006
Great Lakes Great Database Workshop conference, I still managed to learn some new
things.&amp;nbsp; If you missed this session I have a couple of book recommendations of
my own.&amp;nbsp; Check out "Eric Sink on the Business of Software" by none other than
Eric Sink.&amp;nbsp; And finally "Micro-ISV: From Vision to Reality" by Bob Walsh.
&lt;/p&gt;
&lt;p&gt;
My last session was Marcia Akins QuickBooks Automation.&amp;nbsp; Marcia did an amazing
job of demonstrating of how to get started with the QuickBooks COM component.&amp;nbsp;
I especially liked all of the "gotcha" warnings.
&lt;/p&gt;
&lt;p&gt;
In summary, I had a really good time at Southwest Fox this year.&amp;nbsp; It was good
to see some old friends, make some new ones, and learn new ways to use my favorite
development tool - Visual FoxPro.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6b02ae1f-e354-4a12-8261-4a1570ab90d3" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,6b02ae1f-e354-4a12-8261-4a1570ab90d3.aspx</comments>
      <category>SWFOX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My first session of the day was Christof Wollenhaupt's Using CVS and Subversion with
VFP.  Since I have only used Microsoft's Visual Source Safe and Sourcegear's
Fortress, I was curious as to how CVS compared.  It is definitely something I
would consider using in the future.  Christof also showed a utility he wrote
to convert Visual FoxPro files into XML files before checking them into Source Code
Control.  The utility also has the ability to convert the XML files back to binary
files - very cool!  For those who are interested, you can download the TwoFox
utility from his website at <a href="http://foxpert.com">http://foxpert.com</a>.
</p>
        <p>
The next session was Craig Boyd's The Power of Regular Expressions.  I must admit
that I never tried Regular Expressions before because they looked so complicated. 
However, after Craig's presentation I've come to realize that they really are not
that bad once you know the basics.  Of course it helps that Craig did an awesome
job of explaining what how to read and write regular expressions, how to use them,
and provided plenty of good real world examples.
</p>
        <p>
Following lunch I attended Steve Sawyer's Basic Marketing for Custom Business Software
Services session.  Steve had some very interesting ideas on marketing and networking. 
He also recommended another book for the reading list - Rain Making: The Professional's
Guide to Attracting New Clients by Ford Harding.
</p>
        <p>
After that I went to Whil Hentzen's So You've Inherited an Application. Now What? 
A lot of this session was geared towards custom software development shops with some
good general programming ideas mixed in.  For example, when you are working on
a project - don't end your day by stopping at the end of the module/class you were
working on.  Try to stop somewhere in the middle and document what you had left
to do.  The next day you'll find that you are able to get into the zone much
faster.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff" />
      </body>
      <title>Southwest Fox 2007 - Day 3</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/10/20/SouthwestFox2007Day3.aspx</link>
      <pubDate>Sat, 20 Oct 2007 21:59:12 GMT</pubDate>
      <description>&lt;p&gt;
My first session of the day was Christof Wollenhaupt's Using CVS and Subversion with
VFP.&amp;nbsp; Since I have only used Microsoft's Visual Source Safe and Sourcegear's
Fortress, I was curious as to how CVS compared.&amp;nbsp; It is definitely something I
would consider using in the future.&amp;nbsp; Christof also showed a utility he wrote
to convert Visual FoxPro files into XML files before checking them into Source Code
Control.&amp;nbsp; The utility also has the ability to convert the XML files back to binary
files - very cool!&amp;nbsp; For those who are interested, you can download the TwoFox
utility from his website at &lt;a href="http://foxpert.com"&gt;http://foxpert.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The next session was Craig Boyd's The Power of Regular Expressions.&amp;nbsp; I must admit
that I never tried Regular Expressions before because they looked so complicated.&amp;nbsp;
However, after Craig's presentation I've come to realize that they really are not
that bad once you know the basics.&amp;nbsp; Of course it helps that Craig did an awesome
job of explaining what how to read and write regular expressions, how to use them,
and provided plenty of good real world examples.
&lt;/p&gt;
&lt;p&gt;
Following lunch I attended Steve Sawyer's Basic Marketing for Custom Business Software
Services session.&amp;nbsp; Steve had some very interesting ideas on marketing and networking.&amp;nbsp;
He also recommended another book for the reading list - Rain Making: The Professional's
Guide to Attracting New Clients by Ford Harding.
&lt;/p&gt;
&lt;p&gt;
After that I went to Whil Hentzen's So You've Inherited an Application. Now What?&amp;nbsp;
A lot of this session was geared towards custom software development shops with some
good general programming ideas mixed in.&amp;nbsp; For example, when you are working on
a project - don't end your day by stopping at the end of the module/class you were
working on.&amp;nbsp; Try to stop somewhere in the middle and document what you had left
to do.&amp;nbsp; The next day you'll find that you are able to get into the zone much
faster.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,6fc61d39-f9bd-4e5e-88c0-304a5b34a0ff.aspx</comments>
      <category>SWFOX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=1d066357-2fd5-4b2d-93a9-108f7e5ced4d</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,1d066357-2fd5-4b2d-93a9-108f7e5ced4d.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,1d066357-2fd5-4b2d-93a9-108f7e5ced4d.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1d066357-2fd5-4b2d-93a9-108f7e5ced4d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Day 2 began with Steve Sawyer presenting a session on Software Project Management. 
During the past couple of years I've taken more of an interest in the business side
of software development, therefore this session was something I was really looking
forward to.  Steve did a good job of explaining what a project manager is, and
just as important, is not.  One key point that I got from the session was that
project management requires a lot of diplomacy when they take the role of a liaison
between customers and technical people.  Steve also recommended a book by Thomas
Friedman, "The World is Flat".  I'll have to add that to my reading list.
</p>
        <p>
My next session was Michael Hogan's 254 Fields in that Table?  This presentation
addressed the problem where you need to store different fields for each record in
a table.  For example, an Items table contains a record for Shoes and a record
for Blenders.  Each Shoe item has a Brand, Color, and Size attribute.  Whereas
each Blender item has a Brand, Motor Speed, and Watts attribute.  He demonstrated
several common solutions such as a single flat table, many related tables, a generic
attribute table, and using embedded XML.  Michael discussed the pros and cons
of each solution, with last one being the best overall solution.
</p>
        <p>
My third session was Christof Wollenhaupt's Introduction to COM.  This session
discussed the history COM, what makes it so cool.  He also offered an excellent
rebuttal to the argument that COM is dead and went on to provide evidence to the contrary. 
A real highlight of this session is a function he wrote that can be used to load DLLs
without registering them first!
</p>
        <p>
After lunch, I attended Whil Hentzen's session Introduction to Client-Server Using
VFP and MySQL.  One of the topics he discusses is the problem of loading MySQL
on a development machine.  It is easy to be misled by the performance since the
data is "local".  I though about this and wondered if running MySQL in a virtual
environment, such as VirtualPC or VMWare, would address that issue.  If this
topic was something you missed, I would suggest checking out Whil's book "MySQL Client-Server
Apps with Visual FoxPro" at <a href="http://www.hentzenwerke.com">Hentzenwerke</a>. 
Having read the book and attended the session, I would say that the book covers what
he presented and more.
</p>
        <p>
Following that I went to Christof Wollenhaupt's session On the Dark Side of FoxPro. 
This session explained a lot about how Visual FoxPro works internally.  He discussed
data sessions, object creation, variables, memory management, tables and indexes,
Rushmore optimization, and so much more.  This is one of those times when you
don't want the presentation to end because you are learning so much.
</p>
        <p>
My last session of the day was Doug Hennig's Developing Visual FoxPro Applications
for Windows Vista.  Doug did an excellent job of explaining what has changed
in Vista, how it affects application development and deployment, and what we need
to do for our applications to run on Vista.  One of Doug's comments was something
to the effect that Vista is not going to go away anytime soon - so we might as well
get used to it.
</p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=1d066357-2fd5-4b2d-93a9-108f7e5ced4d" />
      </body>
      <title>Southwest Fox 2007 - Day 2</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,1d066357-2fd5-4b2d-93a9-108f7e5ced4d.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/10/19/SouthwestFox2007Day2.aspx</link>
      <pubDate>Fri, 19 Oct 2007 20:54:47 GMT</pubDate>
      <description>&lt;p&gt;
Day 2 began with Steve Sawyer presenting a session on Software Project Management.&amp;nbsp;
During the past couple of years I've taken more of an interest in the business side
of software development, therefore this session was something I was really looking
forward to.&amp;nbsp; Steve did a good job of explaining what a project manager is, and
just as important, is not.&amp;nbsp; One key point that I got from the session was that
project management requires a lot of diplomacy when they take the role of a liaison
between customers and technical people.&amp;nbsp; Steve also recommended a book by Thomas
Friedman, "The World is Flat".&amp;nbsp; I'll have to add that to my reading list.
&lt;/p&gt;
&lt;p&gt;
My next session was Michael Hogan's 254 Fields in that Table?&amp;nbsp; This presentation
addressed the problem where you need to store different fields for each record in
a table.&amp;nbsp; For example, an Items table contains a record for Shoes and a record
for Blenders.&amp;nbsp; Each Shoe item has a Brand, Color, and Size attribute.&amp;nbsp; Whereas
each Blender item has a Brand, Motor Speed, and Watts attribute.&amp;nbsp; He demonstrated
several common solutions such as a single flat table, many related tables, a generic
attribute table, and using embedded XML.&amp;nbsp; Michael discussed the pros and cons
of each solution, with last one being the best overall solution.
&lt;/p&gt;
&lt;p&gt;
My third session was Christof Wollenhaupt's Introduction to COM.&amp;nbsp; This session
discussed the history COM, what makes it so cool.&amp;nbsp; He also offered an excellent
rebuttal to the argument that COM is dead and went on to provide evidence to the contrary.&amp;nbsp;
A real highlight of this session is a function he wrote that can be used to load DLLs
without registering them first!
&lt;/p&gt;
&lt;p&gt;
After lunch, I attended Whil Hentzen's session Introduction to Client-Server Using
VFP and MySQL.&amp;nbsp; One of the topics he discusses is the problem of loading MySQL
on a development machine.&amp;nbsp; It is easy to be misled by the performance since the
data is "local".&amp;nbsp; I though about this and wondered if running MySQL in a virtual
environment, such as VirtualPC or VMWare, would address that issue.&amp;nbsp; If this
topic was something you missed, I would suggest checking out Whil's book "MySQL Client-Server
Apps with Visual FoxPro" at &lt;a href="http://www.hentzenwerke.com"&gt;Hentzenwerke&lt;/a&gt;.&amp;nbsp;
Having read the book and attended the session, I would say that the book covers what
he presented and more.
&lt;/p&gt;
&lt;p&gt;
Following that I went to Christof Wollenhaupt's session On the Dark Side of FoxPro.&amp;nbsp;
This session explained a lot about how Visual FoxPro works internally.&amp;nbsp; He discussed
data sessions, object creation, variables, memory management, tables and indexes,
Rushmore optimization, and so much more.&amp;nbsp; This is one of those times when you
don't want the presentation to end because you are learning so much.
&lt;/p&gt;
&lt;p&gt;
My last session of the day was Doug Hennig's Developing Visual FoxPro Applications
for Windows Vista.&amp;nbsp; Doug did an excellent job of explaining what has changed
in Vista, how it affects application development and deployment, and what we need
to do for our applications to run on Vista.&amp;nbsp; One of Doug's comments was something
to the effect that Vista is not going to go away anytime soon - so we might as well
get used to it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=1d066357-2fd5-4b2d-93a9-108f7e5ced4d" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,1d066357-2fd5-4b2d-93a9-108f7e5ced4d.aspx</comments>
      <category>SWFOX</category>
      <category>VFP</category>
    </item>
    <item>
      <trackback:ping>http://www.pfsolutions-mi.com/blog/Trackback.aspx?guid=81959e24-3234-4a5a-8653-8128da8081a1</trackback:ping>
      <pingback:server>http://www.pfsolutions-mi.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.pfsolutions-mi.com/blog/PermaLink,guid,81959e24-3234-4a5a-8653-8128da8081a1.aspx</pingback:target>
      <dc:creator>Frank Perez</dc:creator>
      <wfw:comment>http://www.pfsolutions-mi.com/blog/CommentView,guid,81959e24-3234-4a5a-8653-8128da8081a1.aspx</wfw:comment>
      <wfw:commentRss>http://www.pfsolutions-mi.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=81959e24-3234-4a5a-8653-8128da8081a1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Day 1 began with Michael Hogan's pre-conference session No Boundaries: Visual FoxPro
Web Applications.  Michael did a great job of explaining the differences between
web applications and desktop applications; and the advantages/disadvantages of both. 
I especially liked the way he demonstrated "statelessness" using audience participation. 
In addition he showed us some of his deployed solutions and took us for a tour behind
the scenes.  If you want to get started in web applications, this session was
a great way to begin.
</p>
        <p>
After a quick dinner break, it was time for the Keynote.  I'll skip most of the
details and jump straight to the cool stuff.
</p>
        <p>
First, Christof Wollenhaupt demonstrated his <a href="http://guineu.foxpert.com/">Guineu</a> project. 
Guineu is an alternative runtime that allows a Visual FoxPro application to run on
multiple platforms (Windows, Pocket PC, and Linux) without any modifications to the
code.  Guineu is currently in development, but it still looks very promising.
</p>
        <p>
Next, Toni Feltman demonstrated a couple of <a href="http://www.etecnologia.net/">eTechnologia's</a> developer
tools.  The first tool was .NET Extender.  It provides the ability to use
any of the .NET classes (including controls) in Visual FoxPro.  The second item
was VFPCompiler for .NET.  This tool compiles Visual FoxPro forms and classes
(SCX, VCX, and PRG) into pure .NET IL Managed Code.  Both of these tools are
currently in alpha stage.
</p>
        <p>
Finally, Alan Stevens and Craig Boyd demonstrated something they called "VFP Studio
2008".  It uses something that will be new in Visual Studio called the "isolated
shell".  I wish I could explain more, however due to the time constraints they
were not able to provide a whole of details.  So, I'm just going to leave it
at that for now.  Hopefully Craig will be able to talk more about it on his blog
at <a href="http://www.sweetpotatosoftware.com/SPSBlog/default.aspx">Sweet Potato
Software</a>.<br /></p>
        <img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=81959e24-3234-4a5a-8653-8128da8081a1" />
      </body>
      <title>Southwest Fox 2007 - Day 1</title>
      <guid isPermaLink="false">http://www.pfsolutions-mi.com/blog/PermaLink,guid,81959e24-3234-4a5a-8653-8128da8081a1.aspx</guid>
      <link>http://www.pfsolutions-mi.com/blog/2007/10/18/SouthwestFox2007Day1.aspx</link>
      <pubDate>Thu, 18 Oct 2007 18:38:30 GMT</pubDate>
      <description>&lt;p&gt;
Day 1 began with Michael Hogan's pre-conference session No Boundaries: Visual FoxPro
Web Applications.&amp;nbsp; Michael did a great job of explaining the differences between
web applications and desktop applications; and the advantages/disadvantages of both.&amp;nbsp;
I especially liked the way he demonstrated "statelessness" using audience participation.&amp;nbsp;
In addition he showed us some of his deployed solutions and took us for a tour behind
the scenes.&amp;nbsp; If you want to get started in web applications, this session was
a great way to begin.
&lt;/p&gt;
&lt;p&gt;
After a quick dinner break, it was time for the Keynote.&amp;nbsp; I'll skip most of the
details and jump straight to the cool stuff.
&lt;/p&gt;
&lt;p&gt;
First, Christof Wollenhaupt demonstrated his &lt;a href="http://guineu.foxpert.com/"&gt;Guineu&lt;/a&gt; project.&amp;nbsp;
Guineu is an alternative runtime that allows a Visual FoxPro application to run on
multiple platforms (Windows, Pocket PC, and Linux) without any modifications to the
code.&amp;nbsp; Guineu is currently in development, but it still looks very promising.
&lt;/p&gt;
&lt;p&gt;
Next, Toni Feltman demonstrated a couple of &lt;a href="http://www.etecnologia.net/"&gt;eTechnologia's&lt;/a&gt; developer
tools.&amp;nbsp; The first tool was .NET Extender.&amp;nbsp; It provides the ability to use
any of the .NET classes (including controls) in Visual FoxPro.&amp;nbsp; The second item
was VFPCompiler for .NET.&amp;nbsp; This tool compiles Visual FoxPro forms and classes
(SCX, VCX, and PRG) into pure .NET IL Managed Code.&amp;nbsp; Both of these tools are
currently in alpha stage.
&lt;/p&gt;
&lt;p&gt;
Finally, Alan Stevens and Craig Boyd demonstrated something they called "VFP Studio
2008".&amp;nbsp; It uses something that will be new in Visual Studio called the "isolated
shell".&amp;nbsp; I wish I could explain more, however due to the time constraints they
were not able to provide a whole of details.&amp;nbsp; So, I'm just going to leave it
at that for now.&amp;nbsp; Hopefully Craig will be able to talk more about it on his blog
at &lt;a href="http://www.sweetpotatosoftware.com/SPSBlog/default.aspx"&gt;Sweet Potato
Software&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.pfsolutions-mi.com/blog/aggbug.ashx?id=81959e24-3234-4a5a-8653-8128da8081a1" /&gt;</description>
      <comments>http://www.pfsolutions-mi.com/blog/CommentView,guid,81959e24-3234-4a5a-8653-8128da8081a1.aspx</comments>
      <category>SWFOX</category>
      <category>VFP</category>
    </item>
  </channel>
</rss>