<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-26167158</id><updated>2012-01-13T19:32:32.186+01:00</updated><category term='FoxQuill.NET'/><category term='Toolbox'/><category term='VFPX'/><category term='Basics'/><category term='Miscellaneous'/><category term='Foxtools'/><category term='Neat Solutions'/><category term='Complex Controls'/><category term='Tips and Tricks'/><title type='text'>Burkhard's VFP Blog</title><subtitle type='html'>Ideas, Concepts and Implementations with Visual FoxPro and other (OOP) Languages</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26167158.post-134608867953755882</id><published>2011-05-13T00:40:00.000+02:00</published><updated>2011-08-31T14:52:42.180+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><title type='text'>Cool VFP Event Binding</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;Version: 1.00.00 - last update: Wednesday, August 30, 2011, 14:25:00&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html" href="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh4.ggpht.com/-Q5xN0BkdiVQ/Tl4oYqaLn3I/AAAAAAAAHi0/g67d6xvu5Ss/NavBack_48_RGBA534%25255B13%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Tips &amp;amp; Tricks Home" border="0" alt="Tips &amp;amp; Tricks Home" src="http://lh6.ggpht.com/-ATghy9SY14Q/Tl4oY5BcaUI/AAAAAAAAHi4/ht6qjU9lqKU/NavHome_48_RGBA534%25255B4%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Next" border="0" alt="Next Entry" src="http://lh4.ggpht.com/-2Qgt42SOJNo/Tl4oZQkwoCI/AAAAAAAAHi8/BxaicRx9XI4/NavForward_48_RGBA645%25255B8%25255D.png?imgmax=800" width="48" height="64" /&gt;&amp;#160; &lt;hr /&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;Recently, I reviewed some of my elder VFP &lt;/font&gt;&lt;font style="font-weight: bold"&gt;event binding code and stumbled upon some unknown(?) COOL behavior!&lt;/font&gt;&lt;/font&gt;&lt;/h4&gt;  &lt;h1&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Intro&lt;/font&gt;&lt;/h1&gt;  &lt;p&gt;Instantiating objects from classes, calling their methods, passing (parameter) values&amp;#160; back and forth between them, is our bread and butter business. Since VFP introduced &lt;strong&gt;&lt;em&gt;event binding&lt;/em&gt;&lt;/strong&gt; a whole new universe of possibilities arose. This post cannot cover the whole subject in detail; one has to write a book for that to come close. Thus, I am going to show you the most interesting (partially unknown!) aspects of event binding today.&lt;/p&gt;  &lt;h2&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;What You Should Know&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt;  &lt;p&gt;Well, you should have worked with VFP’s event binding. At least, you should have read about it! I’m going to discuss the following commands and functions:&lt;/p&gt;  &lt;pre&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;BINDEVENT(oEventSource, cEvent, oEventHandler, cDelegate [, nFlags])&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;UNBINDEVENTS(oEventSource, cEvent, oEventHandler, cDelegate)&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;AEVENTS( ArrayName [, 0 | 1 | oEventObject ] )&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;RAISEEVENT( oEventSource, cEvent [, eParm1...] )&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;You should be familiar with the above commands, especially with the correct application of the &lt;strong&gt;&lt;em&gt;[, nFlags]&lt;/em&gt;&lt;/strong&gt; parameter! At least you should know the difference between &lt;strong&gt;&lt;em&gt;nFlags:= 0&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;nFlags:= 1&lt;/em&gt;&lt;/strong&gt; and you should also know the difference between that first pairing and the second set: &lt;strong&gt;&lt;em&gt;nFlags:= 2&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;nFlags:= 3&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Event binding makes it possible to extend otherwise &lt;em&gt;sealed&lt;/em&gt; classes, even at runtime! Event binding makes your class design extendable and thus, reusable by others without touching your source code at all! &lt;strong&gt;Great benefits often have some drawbacks, which especially is true in case of VFP’s event binding implementation&lt;/strong&gt;. Binding to VFP’s events is quickly learned; securely implementing custom events and handle unsolicited binding-clients the right way seems to be a little bit more challenging! Finally, &lt;em&gt;&lt;font color="#9b00d3"&gt;&lt;strong&gt;binding parameterized delegates to scalar and non-scalar properties&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;, can be regarded &lt;strong&gt;&lt;em&gt;&lt;font color="#9b00d3"&gt;mastering the &lt;/font&gt;&lt;font color="#9b00d3"&gt;fine art of event binding! &lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;&lt;font style="font-weight: bold" color="#000080"&gt;A Deeper Understanding&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;To gain a better understanding of what’s going on we have to make clear some terms and talk about some differences, first. A lot of VFP-newbies make errors in reasoning, while implementing method code for VFP events like shown below:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="7" border="0" alt="7" src="http://lh5.ggpht.com/-ofcsIfH-3KA/Tl4oZxoj5TI/AAAAAAAAHjA/zI4xCEdw0zU/75.png?imgmax=800" width="641" height="132" /&gt;&lt;/p&gt;

&lt;p&gt;Answer the following questions: 
  &lt;br /&gt;“&lt;font style="background-color: #ffffff"&gt;What &lt;strong&gt;&lt;em&gt;kind&lt;/em&gt;&lt;/strong&gt; of code is the above line after we saved the form class?&lt;/font&gt; 

  &lt;br /&gt;Is the call to “THIS.oLstGLOBALMEM.Requery()” the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;Form1.Activate()&lt;/strong&gt;&lt;/font&gt; event now? 

  &lt;br /&gt;Can we manipulate VFP’s form activation behavior through adding code, maybe like so:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="1" border="0" alt="1" src="http://lh6.ggpht.com/-OLSSitGQgn0/Tl4oaHmbOHI/AAAAAAAAHjE/dVCPCjUM340/141.png?imgmax=800" width="641" height="132" /&gt;&lt;/p&gt;

&lt;p&gt;Can we hinder VFP to activate the form through code inserted here, anyway? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer simply is: “NO!”&lt;u&gt; 
      &lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;

  &lt;br /&gt;VFP’s &lt;strong&gt;&lt;em&gt;form activate event&lt;/em&gt;&lt;/strong&gt; is a simple &lt;strong&gt;&lt;font color="#dd8484"&gt;NOTIFICATION&lt;/font&gt;&lt;/strong&gt;. The code we are adding in the editor has nothing to do with &lt;strong&gt;&lt;em&gt;handling the form activation itself!&lt;/em&gt;&lt;/strong&gt; VFP has already done all that handling completely and transparently behind the scenes before passing back programmatic control to our code block above. &lt;strong&gt;Our code solely is a &lt;font color="#dd8484"&gt;NOTIFICATION REACTION&lt;/font&gt;&lt;/strong&gt;. The only reason to add custom code to such kind of VFP event is that we want some code to be executed automatically every time our form gets activated (maybe to signal the form activation to another observer instance within our framework).&lt;/p&gt;

&lt;p&gt;There are other kinds of native VFP events. First, let’s look at the &lt;strong&gt;&lt;em&gt;INIT() event&lt;/em&gt;&lt;/strong&gt; which is a public feature of every VFP class:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2" border="0" alt="2" src="http://lh3.ggpht.com/-0baWvLrNquU/Tl4oat4ekeI/AAAAAAAAHjI/9hsSsBObC9Q/24.png?imgmax=800" width="641" height="157" /&gt;&lt;/p&gt;

&lt;p&gt;Everybody knows: returning a Boolean FALSE from &lt;strong&gt;&lt;em&gt;Init()&lt;/em&gt;&lt;/strong&gt; will cancel the whole instantiation process. In terms of completing object construction, our code can be considered an addition to VFP’s internal event sequence. VFP’s &lt;strong&gt;&lt;em&gt;Init() events&lt;/em&gt;&lt;/strong&gt; are &lt;em&gt;notifications&lt;/em&gt; as well. But, they are also &lt;strong&gt;&lt;font color="#d16349"&gt;EXTENDABLE.&lt;/font&gt;&lt;/strong&gt; Seen from that point of view, the event acts like a program hook and our code is some kind of a &lt;font color="#d16349"&gt;&lt;strong&gt;POST-EVENT HOOK IMPLEMENTATION&lt;/strong&gt;&lt;/font&gt;.&lt;/p&gt;

&lt;p&gt;Finally, there is a third kind of native VFP events. One of them, the &lt;strong&gt;&lt;em&gt;KeyPress() event&lt;/em&gt;&lt;/strong&gt;, is shown below:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3" border="0" alt="3" src="http://lh5.ggpht.com/--rV7Cz0Ngdw/Tl4oa5nbXfI/AAAAAAAAHjM/NmTJMJXtDRo/34.png?imgmax=800" width="641" height="204" /&gt;&lt;/p&gt;

&lt;p&gt;Code entered here may override VFP’s native implementation completely. Typically, in such a case you are using the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;NODEFAULT&lt;/strong&gt;&lt;/font&gt; keyword to tell VFP that you are going to override it’s native behavior. You may re-enable (execute) VFP’s native behavior at any time through issuing a &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;DODEFAULT()&lt;/strong&gt;&lt;/font&gt; in your source code. Thus, I call those native VFP events &lt;strong&gt;&lt;font color="#c0504d"&gt;OVERRIDABLE EVENTS&lt;/font&gt;&lt;/strong&gt; and code added here (as long as it overrides VFP’s native behavior) is the real &lt;font color="#c0504d"&gt;&lt;strong&gt;EVENT IMPLEMENTATION&lt;/strong&gt;&lt;/font&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Let us summarize VFP’s event types:&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#dd8484" size="3"&gt;NOTIFICATIONS&lt;/font&gt;&lt;/strong&gt; are VFP post-event hooks where we can add our own REACTIONS.&lt;/p&gt;

&lt;p&gt;&lt;font color="#d16349" size="3"&gt;&lt;strong&gt;EXTENSIONS&lt;/strong&gt;&lt;/font&gt; are VFP post-event hooks where we can add our own IMPLEMENTATIONS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#c0504d" size="3"&gt;OVERRIDES&lt;/font&gt;&lt;/strong&gt; are VFP pre-event hooks where we can substitute VFP’s native behavior with our own IMPLEMENTATION.&lt;/p&gt;

&lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;
    &lt;hr /&gt;Calling vs. Raising&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;font style="background-color: #ffc000"&gt;An event must be raised!&lt;/font&gt;&lt;/strong&gt; We neither call, nor do we raise any native VFP &lt;strong&gt;event implementation&lt;/strong&gt; directly! Instead, what we do is, we call or raise our custom code added to a native VFP event. Internally, VFP treats our custom code like any other ordinary method. If you visit VFP help on &lt;font color="#0000ff" face="Corbel"&gt;&lt;strong&gt;BINDEVENT()&lt;/strong&gt;&lt;/font&gt; you can read what is explained in case &lt;strong&gt;&lt;em&gt;nFlag := 3&lt;/em&gt;&lt;/strong&gt; &amp;gt;&amp;gt; &lt;font color="#0000ff"&gt;Call event code before delegate code. Do not trigger event (call delegate code) when &lt;strong&gt;&lt;em&gt;&lt;u&gt;simple method calls occur&lt;/u&gt;&lt;/em&gt;.&lt;/strong&gt;&lt;/font&gt; VFP is able to differentiate between a “simple method call” and the “raising of an event”, which is done using the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; command. Superficially, it doesn’t make any difference at all because our method code gets executed just fine in any case. &lt;/p&gt;

&lt;p&gt;Another newbie error in reasoning is to assume, one could trigger VFP’s native behavior through raising the event. No, very sorry, but we CANNOT move the mouse over a VFP form instance by doing something like this: &lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(oForm1 ,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;MouseMove&lt;/span&gt;&amp;quot;, 10, 10)&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Nothing would happen – I’m afraid, we have to use VFP’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;MOUSE&lt;/strong&gt;&lt;/font&gt; command further on. BTW: Reading VFP’s help file, &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; still is called a &lt;strong&gt;&lt;em&gt;function&lt;/em&gt;&lt;/strong&gt; there, although only returning TRUE like any other VFP &lt;strong&gt;procedure&lt;/strong&gt;. Maybe some of you remember VFP’s early implementations of &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;better than I do! I believe version #1 of &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;was able to return values from the handler methods (if they had some &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RETURN &amp;lt;whatever&amp;gt;&lt;/strong&gt;&lt;/font&gt; code implemented). That behavior was dropped in a later VFP release, because it caused some unsolvable erroneous side-effects. Nowadays, &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;does not return a value other than any other regular procedure does: TRUE. Thus, IMHO - &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;is not a &lt;em&gt;function&lt;/em&gt;, but a &lt;strong&gt;&lt;em&gt;command&lt;/em&gt;&lt;/strong&gt;! 

  &lt;br /&gt;VFP’s help on &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;starts with &amp;gt;&amp;gt; &lt;font color="#0000ff"&gt;You can use &lt;b&gt;&lt;font face="Courier New"&gt;RAISEEVENT()&lt;/font&gt;&lt;/b&gt; to raise, or trigger, an event from a custom method. &lt;strong&gt;&lt;u&gt;Though &lt;font face="Courier New"&gt;RAISEEVENT()&lt;/font&gt; applies primarily to custom methods&lt;/u&gt;&lt;/strong&gt;, you can use it for raising native events and methods, too.&lt;/font&gt; It is true that in most cases we will use &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; to “ennoble” our custom methods (to become distinguishable events)!&lt;/p&gt;

&lt;h2&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Implementing a Custom Event&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;Let’s implement our own custom event to see how things work together. These are the steps we need:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Define event (create a method with or without parameters).&lt;/li&gt;

  &lt;li&gt;Optionally, implement event behavior within the event method. &lt;/li&gt;

  &lt;li&gt;Optionally, you may want to implement security as described further below. &lt;/li&gt;

  &lt;li&gt;Optionally, describe event signature and binding flag values. &lt;/li&gt;

  &lt;li&gt;Implement a trigger either using &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; somewhere in your code, or within a distinct trigger method. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The easiest step is the first: Define the event method and its signature. If no parameters have to be passed and you want to create a simple &lt;strong&gt;&lt;font color="#dd8484"&gt;NOTIFICATION&lt;/font&gt;&lt;/strong&gt;, just add an empty method to your class and you’re done! We already talked about the missing return value because raising an event is not comparable to calling a function (which should always return exactly one value), but more to executing a command (which never should return a value). We could argue to compensate a missing return value by passing parameters by reference (to get back some results from there). Obviously, this was “foreseen” by some joker at Microsoft, because this option was dropped completely! If we bind to an event method with one or more parameters in its signature and the event gets raised with one or more values passed in by reference, a trappable error is thrown and our &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;call will fail. The best alternative we have is using &lt;strong&gt;&lt;em&gt;Parameter Objects&lt;/em&gt;&lt;/strong&gt;, as objects are always passed by reference. Thus, my favorite &lt;strong&gt;minimal default event implementation&lt;/strong&gt; looks like this: &lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; LogOn(toPara &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; OBJECT) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
	&lt;span style="color: #008000"&gt;*\\ this event gets raised when the user&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ clicks the [Submit]-button on the &lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ login dialog form&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;The event source code above consists of descriptive remark lines only. The parameter object passed in &lt;strong&gt;&lt;em&gt;toPara&lt;/em&gt;&lt;/strong&gt; is a minimalistic&amp;#160; data container object coming from a tiny factory method like shown below:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; CreatePara(tcName &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, tcPassword &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; ParaObject&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;   LOCAL&lt;/span&gt; loEvtMsgInfo &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Object
   m.loEvtMsgInfo = &lt;span style="color: #0000ff"&gt;CREATEOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;EMPTY&lt;/span&gt;&amp;quot;)
&lt;span style="color: #0000ff"&gt;   ADDPROPERTY&lt;/span&gt;(m.loEvtMsgInfo, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Name&lt;/span&gt;&amp;quot;, m.tcName)
&lt;span style="color: #0000ff"&gt;   ADDPROPERTY&lt;/span&gt;(m.loEvtMsgInfo, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Password&lt;/span&gt;&amp;quot;, m.tcPassword)
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.loEvtMsgInfo&lt;br /&gt;&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Because there is no event behavior to implement, I am ready to implement my trigger code (which is step #5 in the above enumeration). The submit-button’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;click()&lt;/strong&gt;&lt;/font&gt; event is the perfect place to implement my trigger code:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; oSubmitButton.&lt;span style="color: #0000ff"&gt;Click&lt;/span&gt;() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
	&lt;span style="color: #008000"&gt;*\\&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(&lt;font color="#0000ff"&gt;THIS&lt;/font&gt;.oHandler&lt;span style="color: #0000ff"&gt; &lt;/span&gt;,;
		&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;LogOn&lt;/span&gt;&amp;quot; ,;
		&lt;span style="color: #0000ff"&gt;&lt;font color="#000000"&gt;goFactory&lt;/font&gt;&lt;/span&gt;.CreatePara(&lt;span style="color: #0000ff"&gt;Thisform&lt;/span&gt;.TxtName.&lt;span style="color: #0000ff"&gt;Value&lt;/span&gt;,;
				        &lt;span style="color: #0000ff"&gt;Thisform&lt;/span&gt;.txtPassWord.&lt;span style="color: #0000ff"&gt;Value&lt;/span&gt;))
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;h2&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;Consuming a Custom Event&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;Every &lt;strong&gt;&lt;em&gt;event handler&lt;/em&gt;&lt;/strong&gt; who wants to consume our new event must bind to it using VFP’s &lt;font color="#000080" face="Courier New"&gt;&lt;strong&gt;BINDEVENT()&lt;/strong&gt;&lt;/font&gt; function. Terms used, when talking about event binding, come in pairings like &lt;strong&gt;&lt;em&gt;event source&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;event handler&lt;/em&gt;&lt;/strong&gt;, or &lt;strong&gt;&lt;em&gt;raise event&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;bind event.&lt;/em&gt;&lt;/strong&gt; Finally there is a &lt;strong&gt;&lt;em&gt;flag value&lt;/em&gt;&lt;/strong&gt; used in VFP’s &lt;font color="#000080" face="Courier New"&gt;&lt;strong&gt;BINDEVENT()&lt;/strong&gt;&lt;/font&gt; function to fine-tune internal signaling. To successfully establish a native VFP event binding we need two object references, as it is not possible to use an old-fashioned procedure as the event handler! (BTW: There is a &lt;a title="http://vfpx.codeplex.com/" href="http://vfpx.codeplex.com/" rel="nofollow" target="_blank"&gt;VFPX&lt;/a&gt; project called “&lt;a title="http://vfpx.codeplex.com/wikipage?title=VFP2C32&amp;amp;referringTitle=Home" href="http://vfpx.codeplex.com/wikipage?title=VFP2C32&amp;amp;referringTitle=Home" target="_blank"&gt;VFP2C32&lt;/a&gt;”, maintained by Christian Ehlscheid, that gives you the ability to use procedural delegates – but only for &lt;strong&gt;&lt;em&gt;Win-Event binding&lt;/em&gt;&lt;/strong&gt;.) In any case, one object is called the &lt;em&gt;source of the event&lt;/em&gt;, the other the &lt;em&gt;handler of the event&lt;/em&gt;. There are other naming pairs like &lt;strong&gt;&lt;em&gt;publisher&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;subscriber&lt;/em&gt;&lt;/strong&gt; often used in COM documentations, or &lt;strong&gt;&lt;em&gt;signal&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;slot&lt;/em&gt;&lt;/strong&gt; used by Nokias Qt (C++ IDE). Anyway, the &lt;strong&gt;&lt;em&gt;event source&lt;/em&gt;&lt;/strong&gt; has a public &lt;strong&gt;&lt;em&gt;event&lt;/em&gt;&lt;/strong&gt; (-method or -property) we must know by name and what &lt;strong&gt;signature&lt;/strong&gt; is used when the event is raised by the trigger, so that we can bind our &lt;strong&gt;&lt;em&gt;event handler&lt;/em&gt;&lt;/strong&gt; object to it. Our &lt;strong&gt;&lt;em&gt;event handler&lt;/em&gt;&lt;/strong&gt; object must have a corresponding &lt;strong&gt;&lt;em&gt;delegate method&lt;/em&gt;&lt;/strong&gt; (no properties - only methods - are allowed as delegates) with the method signature that has at least enough parameters to receive all values passed in by the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; trigger.&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;Sidekick: Property-based Event Binding Part I&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Keep in mind:&lt;/font&gt;&lt;/strong&gt; When binding to a &lt;strong&gt;PROPERTY&lt;/strong&gt;-based event, our handler &lt;em&gt;should be&lt;/em&gt; a parameter-less delegate method. At this moment, it doesn’t make much sense to use a delegate with one or more parameters, because a simple value assignment to an event-bound property CANNOT lead to a &lt;strong&gt;&lt;em&gt;signature mismatch&lt;/em&gt;&lt;/strong&gt;. There are two other things to keep in mind about &lt;strong&gt;&lt;em&gt;property binding&lt;/em&gt;&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Property binding can be compared to implementing a &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;PropertyName_Assign()&lt;/strong&gt;&lt;/font&gt; method. The delegate gets called every time some value is stored in the so decorated property, just like any _ASSIGN() method is triggered. Read access NEVER leads to delegate invocation. &lt;/li&gt;

  &lt;li&gt;Executing a &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;on a property causes nothing else but a re-assignment of the current property value. In other words, the actual property value stays unchanged. Therefore, &lt;strong&gt;&lt;font face="Courier New"&gt;oForm1.&lt;font color="#0000ff"&gt;HEIGHT&lt;/font&gt; = oForm1.&lt;font color="#0000ff"&gt;HEIGHT&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt; can be considered to be internally treaded like a “simple method call”, whereas &lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;RAISEVENT&lt;/font&gt;(oForm1, “&lt;font style="background-color: #ffff00" color="#ff0000"&gt;HEIGHT&lt;/font&gt;”)&lt;/strong&gt;&lt;/font&gt; internally is recognized as the “event of property value re-assignment”. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most of this is theory only, taken from VFP’s help files! You will get more comprehensive insights later in this post (in &lt;em&gt;property-based event binding part II&lt;/em&gt; below).&lt;/p&gt;

&lt;h2&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;
      &lt;hr /&gt;Generic Events and Handlers&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;&lt;font style="background-color: #ffff00"&gt;Even carefully reading of VFP’s help may lead to some misunderstanding!&lt;/font&gt; This is what is written about the delegate parameter of &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;BINDEVENT()&lt;/strong&gt;&lt;/font&gt;: 

  &lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;&lt;em&gt;cDelegate:&lt;/em&gt;&lt;/strong&gt; 

    &lt;br /&gt;Specifies the method, or &amp;quot;delegate&amp;quot;, that handles the event for oEventHandler. &lt;strong&gt;&lt;u&gt;The delegate method must have the same parameters as the event specified in cEvent.&lt;/u&gt;&lt;/strong&gt; You can call the &lt;b&gt;AEVENTS( ) &lt;/b&gt;function to retrieve an object reference to the event source. If the delegate method does not have enough parameters to handle those passed by the event, Visual FoxPro generates an error.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;The underlined sentence above may make you believe, that both, the event’s and the delegate’s signatures must be identical. &lt;font style="background-color: #ffff00" color="#ff0000"&gt;&lt;strong&gt;This is not true!&lt;/strong&gt;&lt;/font&gt; Only the last sentence fully tells the truth: the handler’s delegate signature must be capable to receive all parameters that were passed in during event invocation. This is nothing really new. We all have seen parameterization errors stemming from method calls in cases a caller tried to pass more parameters than there were implemented. On the other hand, calling any method passing less parameters than the implementation has, does work like a charm, at least the invocation. The same is true while raising an event. Under the hood, VFP does not draw a distinction between event methods and other methods when it comes to parameter passing. Thus, it is absolutely legal to create a set of generic event handler methods that can be bound to any (generic) event method! &lt;strong&gt;&lt;font color="#0000ff"&gt;Keep in mind:&lt;/font&gt;&lt;/strong&gt; VFP’s maximum number of parameters that can be interchanged during all kind of calls is #26, which is more than enough, IMHO. This capacity also is the upper limit of VFP’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;command. If you really need more, switch to a parameter object! &lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;A “Generic” Event&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;An event cannot be generic in the truest sense of the word!&lt;/strong&gt; Only the &lt;em&gt;&lt;strong&gt;event method signature&lt;/strong&gt;&lt;/em&gt; can be generic, in that the method accepts all possible 26 input parameters!&lt;/p&gt;

&lt;p&gt;Let’s create a form and add an event method with such generic signature. Next, we will add some event behavior (just for initial testing). The final result looks like so:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="4" border="0" alt="4" src="http://lh5.ggpht.com/-qMZliViVmvM/Tl4obR7p1GI/AAAAAAAAHjQ/fbB8q8RU6K0/44.png?imgmax=800" width="589" height="465" /&gt;&lt;/p&gt;

&lt;p&gt;Lets DO the form and invoke the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;EvtSendOut()&lt;/strong&gt;&lt;/font&gt; method using a regular method call from VFP’s command window:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;m.testform2.EvtSendOut(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;What&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;difference&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;day&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;makes!&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;The result, as expected, is shown below:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="5" border="0" alt="5" src="http://lh6.ggpht.com/-Q9AT0gVxLHE/Tl4obvbllkI/AAAAAAAAHjU/1ZnkdgeaLwE/54.png?imgmax=800" width="391" height="124" /&gt;&lt;/p&gt;

&lt;p&gt;Now, raise the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;EvtSendOut()&lt;/strong&gt;&lt;/font&gt; method as a custom event typing the following line of code into VFP’s command window:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(m.testform2, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Evtsendout&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;What&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;difference&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;day&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;makes!&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Again, the result is the same, as shown below:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="6" border="0" alt="6" src="http://lh4.ggpht.com/-d07OMsZmn8A/Tl4ocP0FsFI/AAAAAAAAHjY/FrLng7vV7Dc/64.png?imgmax=800" width="391" height="124" /&gt;&lt;/p&gt;

&lt;p&gt;You may play with different parameterizations of the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; command. &lt;strong&gt;&lt;font color="#008080"&gt;As long as you do not try to pass more than 26 parameters, all invocations will be executed successfully.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s prove that we cannot raise a custom event passing in a parameter by reference. With the test form still running type the following code lines into VFP’s command window and execute them one by one:&lt;/p&gt;

&lt;pre&gt;x = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Hallo&lt;/span&gt;&amp;quot;
m.testform2.Evtsendout(x)
m.testform2.Evtsendout(@x)
&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(m.testform2, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Evtsendout&lt;/span&gt;&amp;quot;,x)
&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(m.testform2, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Evtsendout&lt;/span&gt;&amp;quot;,@x)&lt;/pre&gt;

&lt;p&gt;Only the last command will throw an exception, like shown below:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="9" border="0" alt="9" src="http://lh3.ggpht.com/-Erif024c0Do/Tl4ocUgzz9I/AAAAAAAAHjc/_GWKepA6fKY/94.png?imgmax=800" width="558" height="216" /&gt;&lt;/p&gt;

&lt;p&gt;It is the “Missing operand” error #1231. Well, “Missing operand” sounds strange indeed, but there is an error – as I promised :-)&lt;/p&gt;

&lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;A “Generic” Delegate&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;What’s true for the event is true for the delegate, too: &lt;strong&gt;A delegate cannot be generic in the truest sense of the word!&lt;/strong&gt; Only the &lt;em&gt;&lt;strong&gt;delegate method signature&lt;/strong&gt;&lt;/em&gt; can be generic, in that the method accepts all possible 26 input parameters! Let’s complete this first test-drive. Initially, we filled our &lt;strong&gt;&lt;em&gt;event&lt;/em&gt;&lt;/strong&gt; (method) with code that would be better placed in a &lt;strong&gt;&lt;em&gt;delegate&lt;/em&gt;&lt;/strong&gt; (method). Let’s add such a &lt;strong&gt;&lt;em&gt;delegate&lt;/em&gt;&lt;/strong&gt; to our form and copy the whole implementation to the new &lt;strong&gt;&lt;em&gt;delegate&lt;/em&gt;&lt;/strong&gt;. Keep only the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;LPARAMETERS&lt;/strong&gt;&lt;/font&gt; statement in the &lt;strong&gt;&lt;em&gt;event&lt;/em&gt;&lt;/strong&gt;. The intermediate result should look like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="10" border="0" alt="10" src="http://lh5.ggpht.com/-vEiWo_EQIDM/Tl4ocx8LeeI/AAAAAAAAHjg/MsCCRpVVxqo/104.png?imgmax=800" width="585" height="642" /&gt;&lt;/p&gt;

&lt;p&gt;Again, we will use VFP’s command window for manually binding and triggering. Save the form and create two named instances like so:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;DO&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Form&lt;/span&gt; c:\&amp;lt;your &lt;span style="color: #0000ff"&gt;path&lt;/span&gt;&amp;gt;\testform2.scx &lt;span style="color: #0000ff"&gt;NAME&lt;/span&gt; Sender
&lt;span style="color: #0000ff"&gt;DO&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Form&lt;/span&gt; c:\&amp;lt;your &lt;span style="color: #0000ff"&gt;path&lt;/span&gt;&amp;gt;\testform2.scx &lt;span style="color: #0000ff"&gt;NAME&lt;/span&gt; Receiver
m.Sender.&lt;span style="color: #0000ff"&gt;Caption&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Sender&lt;/span&gt;&amp;quot;
m.receiver.&lt;span style="color: #0000ff"&gt;Caption&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Receiver&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="11" border="0" alt="11" src="http://lh3.ggpht.com/-mhFUl_5TATQ/Tl4odcd_-XI/AAAAAAAAHjk/L6v6KPouQP0/115.png?imgmax=800" width="563" height="73" /&gt;&lt;/p&gt;

&lt;p&gt;Now it is time to link the receiver to the sender using an appropriate &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;BINDEVENT()&lt;/font&gt;&lt;/strong&gt; command. Our first binding does not use a special &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; value. VFP defaults to &lt;strong&gt;&lt;em&gt;nFlags = 0&lt;/em&gt;&lt;/strong&gt; in that case.&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;? &lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(m.sender, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;EvtSendOut&lt;/span&gt;&amp;quot;, m.Receiver, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;OnSendOut&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Now, trigger the event on the sender form like so:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(m.sender, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Evtsendout&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;What&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;difference&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;day&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;makes!&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;The delegate code of the receiver form executes and echoes the text out &lt;em&gt;&lt;strong&gt;on the currently activated form:&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="12" border="0" alt="12" src="http://lh5.ggpht.com/-9Xk_Vnj4rQU/Tl4odqAsOUI/AAAAAAAAHjo/PfpY-JrgSA4/126.png?imgmax=800" width="560" height="74" /&gt;&lt;/p&gt;

&lt;p&gt;Changing the parameter count (within the valid boundaries) executes just fine! Try the following, if you like:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(m.sender, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Evtsendout&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;What&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;difference&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;day&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;makes!&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Come&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;on&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Baby!&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Keep both forms open and read ahead – we will reuse them in the next chapter.&lt;/p&gt;

&lt;h3&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-weight: bold"&gt;Benefits of Using Generic Signatures&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;Using generic signatures with your &lt;strong&gt;&lt;em&gt;events&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;delegates&lt;/em&gt;&lt;/strong&gt; frees you from keeping track of parameter count changes, which otherwise must be kept in sync over three different places (event, delegate and trigger) if you raise the parameter count used by the trigger. This does not mean that you must not keep your implementations in sync with the parameters coming in :-) &lt;strong&gt;&lt;font style="background-color: #ffff00" color="#ff0000"&gt;Keep in mind&lt;/font&gt;&lt;/strong&gt;: Always placing 26 LPARAMETERS in your event-related methods &lt;strong&gt;&lt;em&gt;slows down program execution slightly&lt;/em&gt;&lt;/strong&gt;, because VFP has to create 26 local variables each time the methods must be invoked. I’m using my own special breed of generic method signatures within my frameworks and never encountered any performance hits, because I reduced the parameter count of my framework class methods down to three. The first parameter is the name of the method/service, the second is a parameter object which may take as many parameter properties as needed, the last parameter is the object reference of the sender.&lt;/p&gt;

&lt;h2&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-weight: bold"&gt;
      &lt;hr /&gt;Implementing a Custom Event-Handler&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;We have seen that &lt;strong&gt;&lt;em&gt;calling&lt;/em&gt;&lt;/strong&gt; a method &lt;u&gt;must not&lt;/u&gt; differ from &lt;strong&gt;&lt;em&gt;raising&lt;/em&gt;&lt;/strong&gt; it, &lt;em&gt;&lt;strong&gt;seen from the view-point of someone who triggers the execution&lt;/strong&gt;&lt;/em&gt; in one way or the other. A noticeable difference may only appear for the &lt;em&gt;event handler side&lt;/em&gt; of the binding. Using &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 2 and 3 in the &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;BINDEVENT()&lt;/font&gt;&lt;/strong&gt; command only invoke the event handler’s delegate when the event was triggered using &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt;. Using &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 0 and 1 in the &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;BINDEVENT()&lt;/font&gt;&lt;/strong&gt; command &lt;strong&gt;&lt;em&gt;additionally&lt;/em&gt;&lt;/strong&gt; also invoke the event handler’s delegate when the event was triggered using a regular method call. Check it out! You can do that with only two lines of code if the above 2-forms test environment is still set and running:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;UNBINDEVENTS&lt;/span&gt;(m.sender)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(m.sender, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;EvtSendOut&lt;/span&gt;&amp;quot;, m.Receiver, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;OnSendOut&lt;/span&gt;&amp;quot;, 2)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;With the nFlags value set to 2, try to invocate the event handler’s delegate through triggering the event using a simple method call like so:&lt;/p&gt;

&lt;pre&gt;m.sender.EvtSendOut(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;EvtSendOut&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;What&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;difference&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;a&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;day&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;makes!&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Come&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;on&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Baby!&lt;/span&gt;&amp;quot;)&lt;/pre&gt;

&lt;p&gt;Nothing happens – as I told you! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smiley" src="http://lh5.ggpht.com/-iIjlbKZnsl8/Tl4oeNj2JzI/AAAAAAAAHjs/ZKtWYKITFlA/wlEmoticon-smile2.png?imgmax=800" /&gt; &lt;/p&gt;

&lt;p&gt;&lt;font style="background-color: #ffc000" size="2"&gt;&lt;/font&gt;&lt;font style="background-color: #ffff00"&gt;After all, &lt;strong&gt;&lt;u&gt;IMHO&lt;/u&gt;&lt;/strong&gt;, only &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;BINDEVENT()&lt;/font&gt;&lt;/strong&gt; commands in code using &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 2 or 3 should be legitimate for today’s event binding implementations,&lt;/font&gt; which must not mean that there are no good reasons for using&amp;#160; &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 0 and 1. If one has to bind to legacy methods that were realized a long time ago (when event binding still was a foreign word for VFP developers), one is forced to use &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 0 or 1 while binding to methods that never will be raised but always gets called (the old-fashioned way). In addition to that, there are some native VFP “events” (like &lt;b&gt;&lt;font color="#0000ff" face="Courier New"&gt;GotFocus()&lt;/font&gt;&lt;/b&gt;, &lt;b&gt;&lt;font color="#0000ff" face="Courier New"&gt;LostFocus()&lt;/font&gt;&lt;/b&gt;, &lt;b&gt;&lt;font color="#0000ff" face="Courier New"&gt;InteractiveChange()&lt;/font&gt;&lt;/b&gt;, and &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;ProgrammaticChange()&lt;/strong&gt;&lt;/font&gt;) that are treated as method calls internally by VFP, so that we are forced to use a &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; value of either 0 or 1. My suggestion always is: NEVER bind to VFP’s native properties and methods/events directly, but implement your own custom event system/scheme. I will show you my own (more sophisticated:-) implementation in a future posting…&lt;/p&gt;

&lt;p&gt;The table below shows all four possible values (bit flag values) counting the bits starting with #0. The “trigger all” row represents both bit#0 states, the “trigger only raised” row shows the two bit#1 states. Both bits are OR-combined. The four resulting values are printed in bold within the matrix. Just to make this part of my writing complete: &lt;strong&gt;Bit #3&lt;/strong&gt; of the &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; parameter is used to &lt;strong&gt;prevent recursion&lt;/strong&gt; in case of &lt;strong&gt;&lt;em&gt;Window Message Binding&lt;/em&gt;&lt;/strong&gt; (which isn’t discussed in this posting).&lt;/p&gt;

&lt;table border="1" cellspacing="0" cellpadding="2" width="484"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="212"&gt;
        &lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;nFlags values&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="134"&gt;
        &lt;p&gt;invoke delegate 
          &lt;br /&gt;&lt;strong&gt;&lt;em&gt;before&lt;/em&gt;&lt;/strong&gt; event&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="136"&gt;
        &lt;p&gt;invoke delegate 
          &lt;br /&gt;&lt;strong&gt;&lt;em&gt;after&lt;/em&gt;&lt;/strong&gt; event&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="212"&gt;
        &lt;p&gt;Bit #0 &amp;gt;&amp;gt; trigger all&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="134"&gt;
        &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;0&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="136"&gt;
        &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;1&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="212"&gt;
        &lt;p&gt;bit #1 &amp;gt;&amp;gt; trigger only raised&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="134"&gt;
        &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;2&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;

      &lt;td valign="top" width="136"&gt;
        &lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;3&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Seen from my personal point of view (as a framework developer), there are many different objects at runtime lurking around to bind to my events. I divide these event handler objects into two groups: one group want to process parameters&amp;#160; &lt;strong&gt;BEFORE&lt;/strong&gt; my own implementation processes them, the other (lazy:-) group can wait until my event code is finished, receiving the parameters &lt;strong&gt;AFTER&lt;/strong&gt; my implementation returns. &lt;/p&gt;

&lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;
        &lt;hr /&gt;Sidekick: Property-based Event Binding Part II&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;Binding to properties makes it even easier to understand what’s going on under the hood: Those delegates that were bound to a scalar property with &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 0 or 2 can only show the old property value (before the assignment takes place), delegates that were bound to the property with &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 1 or 3 will always show the new property value (the “after-assignment-value”). The following listings show us two generic &lt;strong&gt;&lt;em&gt;property-delegates&lt;/em&gt;&lt;/strong&gt;. You may add them to our form before test-drive them. Bind both delegates to a property like shown below. &lt;strong&gt;BTW&lt;/strong&gt;, the method signature of a regular &lt;em&gt;property-delegate&lt;/em&gt; always is empty because we do not &lt;strong&gt;&lt;em&gt;&lt;u&gt;need&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; any parameters, as long as we are solely assigning new values. I underlined the word “need” bold italic because it is important to stress this for a good reason: &lt;/p&gt;

&lt;p align="center"&gt;&lt;font style="background-color: #ffff00" size="4"&gt;we do not need any parameters, &lt;strong&gt;&lt;font style="style"&gt;but it is not forbidden to implement some&lt;/font&gt;&lt;/strong&gt;, as I will show you later in this chapter!&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;This is the test code we will run next:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;ADDPROPERTY&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;nTest&lt;/span&gt;&amp;quot;)
&lt;span style="color: #0000ff"&gt;DO&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Form&lt;/span&gt; c:\&amp;lt;your &lt;span style="color: #0000ff"&gt;path&lt;/span&gt;&amp;gt;\testform2.scx
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;nTest&lt;/span&gt;&amp;quot;, m.testform2, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;OnPropertyBefore&lt;/span&gt;&amp;quot;)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;nTest&lt;/span&gt;&amp;quot;, m.testform2, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;OnPropertyAfter&lt;/span&gt;&amp;quot;, 1)
&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.nTest = 1
&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;nTest&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;font face="Calibri"&gt;You may also want to implement some ”&lt;strong&gt;&lt;font color="#0000ff"&gt;laBindings[3]&lt;/font&gt;&lt;/strong&gt;“– test code like the following two listings show:&lt;/font&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; OnPropertyAfter() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID 
	&lt;span style="color: #008000"&gt;*\\ a generic property-event delegate &lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ARRAY&lt;/span&gt; laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;3&lt;/span&gt;] AS Variant 
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnCount &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; 
	&lt;span style="color: #008000"&gt;*\\ AEVENTS( ) returns a three-element array containing &lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ an object reference to the current event source, &lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ the name of the triggered event, &lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ and how the event was triggered. 1 - RAISEEVENT() &lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ 2 - Method call &lt;/span&gt;
	lnCount = &lt;span style="color: #0000ff"&gt;AEVENTS&lt;/span&gt;(laBindings, 0) 
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.lnCount &amp;gt; 0 
		&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; eValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Variant 
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;1&lt;/span&gt;] 
			eValue = &lt;span style="color: #0000ff"&gt;EVALUATE&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;.&lt;/span&gt;&amp;quot; + laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;2&lt;/span&gt;]) 
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt; 
		? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;New value is &lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(m.eValue) 
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;
&lt;/strong&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; OnPropertyBefore() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
&lt;span style="color: #008000"&gt;*\\ a generic property-event delegate&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ARRAY&lt;/span&gt; laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;3&lt;/span&gt;] AS Variant
&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnCount &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ AEVENTS( ) returns a three-element array containing &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\		an object reference to the current event source, &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\		the name of the triggered event, &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\		and how the event was triggered. 1 - RAISEEVENT() &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\						 2 - Method call&lt;/span&gt;
lnCount = &lt;span style="color: #0000ff"&gt;AEVENTS&lt;/span&gt;(laBindings, 0) 
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.lnCount &amp;gt; 0
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; eValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Variant
	&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;1&lt;/span&gt;]
		eValue = &lt;span style="color: #0000ff"&gt;EVALUATE&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;.&lt;/span&gt;&amp;quot; + laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;2&lt;/span&gt;])
	&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Value assignment for &lt;/span&gt;&amp;quot; + laBindings[&lt;span style="background-color: #ffff00; color: red"&gt;2&lt;/span&gt;] + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt; triggered!&lt;/span&gt;&amp;quot;
	? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Old value is &lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(m.eValue)
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;VFP returns a “trigger type”-value (0-System, 1-RaiseEvent, 2-MethodCall) in the third array element of the local array “laBindings”. Okay, you may think, all this is pretty straight forward and matches VFP’s help documentation one by one. &lt;font style="background-color: #ffff00" color="#ff0000"&gt;&lt;strong&gt;But, this is not true!&lt;/strong&gt;&lt;/font&gt; There are some important points:&amp;#160; &lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;1st&lt;/font&gt;&lt;/strong&gt;, VFP’s event binding related help is not correct in some places and &lt;strong&gt;&lt;font style="background-color: #ffc000"&gt;2nd&lt;/font&gt;&lt;/strong&gt;, some helpful things are not mentioned at all.&lt;/p&gt;

&lt;p&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;1a.)&lt;/strong&gt;&lt;/font&gt; You can read about the &lt;strong&gt;&lt;font color="#0000ff" size="1" face="Courier New"&gt;AEVENTS(arrayname,0)&lt;/font&gt;&lt;/strong&gt; version in VFP’s help file: “&lt;em&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;font color="#000000"&gt;The third array element indicates how an event was triggered. &lt;/font&gt;If the event is a &lt;u&gt;property&lt;/u&gt;, this value can be 1 or 2. The value is 2 if the property is set or assigned.&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;” &lt;font style="background-color: #ffff00" color="#ff0000"&gt;&lt;strong&gt;Simply, this is not true!&lt;/strong&gt;&lt;/font&gt; In our above example &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;laBindings[3]&lt;/strong&gt;&lt;/font&gt; never will hold the value 2 (two). During my testing sometimes I got a &lt;em&gt;zero&lt;/em&gt; or the value &lt;em&gt;one&lt;/em&gt; but never a &lt;em&gt;two&lt;/em&gt;! Thus, the correct statement must be: “&lt;em&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;font color="#000000"&gt;The third array element indicates how an event was triggered.&lt;/font&gt;&lt;/font&gt;&lt;font color="#008040"&gt; If the event is a &lt;u&gt;property&lt;/u&gt;, this value can be 0 or 1. The value is 1 (= RAISEEVENT())&amp;#160; if the delegate was triggered using the RAISEEVENT() function! In all other cases the third array element is 0 (= System).&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;1b.)&lt;/strong&gt;&lt;/font&gt; Assigning a value to any &lt;strong&gt;&lt;em&gt;scalar&lt;/em&gt;&lt;/strong&gt; property with bound delegates &lt;strong&gt;&lt;em&gt;&lt;u&gt;always fires all delegates&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;! In other words: You may bind to a property with a nFlags-value of 2 or 3 which would suppress delegate execution in case of a simple method call when applied to a VFP method. Later, when assigning a value to the property, you might expect that the delegates will not be called. Sorry, but that doesn’t work &lt;u&gt;for scalar values&lt;/u&gt;! This leads to the next oddity:&lt;/p&gt;

&lt;p&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;1c.)&lt;/strong&gt;&lt;/font&gt; Assigning a value to any &lt;strong&gt;&lt;em&gt;non-scalar&lt;/em&gt;&lt;/strong&gt; property (to an array property) just works as expected – well, almost! Instead: &lt;strong&gt;An array value assignments do not trigger bound delegates at all&lt;/strong&gt;! At least: doing a &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RAISEEVENT()&lt;/strong&gt;&lt;/font&gt; on an array-property fires &lt;strong&gt;&lt;em&gt;&lt;u&gt;ALL&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; bound delegates just like described in 1b.) above!&lt;/p&gt;

&lt;p&gt;Let’s create some examples to make things a little bit clearer: &lt;/p&gt;

&lt;p&gt;Given one source- and one target object named “oSource” as the event source object and “oHandler” as the event handler object, let us define two properties on the source object: “oSource.cProp” and “oSource.aProp[1]”, so that we have one scalar and one non-scalar property at our disposal.&amp;#160; Now, let’s add two _Assign() methods for both properties: “oSource.cProp_Assign()” and “oSource.aProp_Assign()”. Finally, let us add four delegate methods called “delegate0()” to “delegate3()” to our handler object.&lt;/p&gt;

&lt;p&gt;Now, we can run code like this from VFP’s command window:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;oSource = &lt;span style="color: #0000ff"&gt;NEWOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cSource&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;testlib.vcx&lt;/span&gt;&amp;quot;)
oTarget = &lt;span style="color: #0000ff"&gt;NEWOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cTarget&lt;/span&gt;&amp;quot; , &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;testlib.vcx&lt;/span&gt;&amp;quot;)
&lt;span style="color: #008000"&gt;*\\ bind to the scalar property&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate0&lt;/span&gt;&amp;quot;, 0)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate1&lt;/span&gt;&amp;quot;, 1)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate2&lt;/span&gt;&amp;quot;, 2)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate3&lt;/span&gt;&amp;quot;, 3)
&lt;span style="color: #008000"&gt;*\\ now bind to the non-scalar property&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate0&lt;/span&gt;&amp;quot;, 0)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate1&lt;/span&gt;&amp;quot;, 1)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate2&lt;/span&gt;&amp;quot;, 2)
&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp&lt;/span&gt;&amp;quot;, oTarget, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Delegate3&lt;/span&gt;&amp;quot;, 3)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;The first version of our delegate code is almost identical in all event handler methods . Is echoes out the three &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;AEVENTS(array,0)&lt;/strong&gt;&lt;/font&gt; array values.&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ARRAY&lt;/span&gt; laEvt[&lt;span style="background-color: #ffff00; color: red"&gt;3&lt;/span&gt;]
IF &lt;span style="color: #0000ff"&gt;AEVENTS&lt;/span&gt;(laEvt,0) &amp;gt; 0
	? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Handler 0 ---------------------&lt;/span&gt;&amp;quot;
	? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;laEvt[1] = &lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(laEvt[&lt;span style="background-color: #ffff00; color: red"&gt;1&lt;/span&gt;])
	? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;laEvt[2] = &lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(laEvt[&lt;span style="background-color: #ffff00; color: red"&gt;2&lt;/span&gt;])
	? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;laEvt[3] = &lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(laEvt[&lt;span style="background-color: #ffff00; color: red"&gt;3&lt;/span&gt;])
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;You only have to vary the handler number. Replace “Handler 0 ----“ with “Handler 1 ----“, “Handler 2 ----“, and “Handler 3 ----“ in the four different delegates.&amp;#160; &lt;br /&gt;Now, add some echo statements to the &lt;font face="Courier New"&gt;&lt;strong&gt;cProp_Assign()&lt;/strong&gt;&lt;/font&gt; hook like: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;LPARAMETERS&lt;/span&gt; vNewVal 

    &lt;br /&gt;? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp_Assign() before assignment - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.cprop) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot; 

    &lt;br /&gt;&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.cprop = m.vNewVal 

    &lt;br /&gt;? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp_Assign() after assignment - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(m.vNewVal) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and for the &lt;font face="Courier New"&gt;&lt;strong&gt;aProp_Assign()&lt;/strong&gt;&lt;/font&gt; hook and like:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;LPARAMETERS&lt;/span&gt; vNewVal, m.nIndex1
? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp_Assign() before assignment&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ISNULL&lt;/span&gt;(m.nIndex1)  &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; user didn't pass in a subscript&lt;/span&gt;
	?? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt; - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.aprop) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot;
	&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.aprop = m.vNewVal
&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
	?? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt; - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.aprop[&lt;span style="background-color: #ffff00; color: red"&gt;m.nIndex1&lt;/span&gt;]) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot;
	&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.aprop[&lt;span style="background-color: #ffff00; color: red"&gt;m.nIndex1&lt;/span&gt;] = m.vNewVal
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp_Assign() after assignment - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(m.vNewVal) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Now we can assign a value e.g. to the scalar &lt;font face="Courier New"&gt;&lt;strong&gt;cProp&lt;/strong&gt;&lt;/font&gt; property: &lt;strong&gt;oSource.cProp = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Hello World!&lt;/span&gt;&amp;quot;&lt;/strong&gt; and watch the sequence that gets echoed out to VFP’s desktop:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Output" border="0" alt="Output" src="http://lh4.ggpht.com/-QLMT0bqVrZM/Tl4oeRhIEHI/AAAAAAAAHjw/Yu1osMFMNog/Output1.png?imgmax=800" width="400" height="318" /&gt;&lt;/p&gt;

&lt;p&gt;The first line is generated by the first &lt;strong&gt;? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp_Assign() before assignment - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.cprop) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot;&lt;/strong&gt;&amp;#160; expression.&amp;#160; &lt;br /&gt;During execution of the second statement: &lt;strong&gt;&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.cprop = m.vNewVal &lt;/strong&gt;all four event handlers are raised, which generate the “Handler x ------------------------------“ … output lines, one after the other. 

  &lt;br /&gt;Finally, the second &lt;strong&gt;? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp_Assign() after assignment - value is '&lt;/span&gt;&amp;quot; + &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(m.vNewVal) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;'&lt;/span&gt;&amp;quot;&lt;/strong&gt; expression is executed.&amp;#160; &lt;br /&gt;As you can see, the handlers #1 and #3 are definitely firing AFTER the value assignment, whereas handlers #0 and #2 only can show the initial empty string value. Anyway, all four handlers fired!&lt;/p&gt;

&lt;p&gt;Now let’s have a short look what happens if we assign a value to the (non-scalar) array property like so: &lt;strong&gt;oSource.aProp = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Hello World!&lt;/span&gt;&amp;quot;&lt;/strong&gt; and watch the sequence that gets echoed out to VFP’s desktop:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="1[1]" border="0" alt="1[1]" src="http://lh6.ggpht.com/-8Z0mUTHxEq8/Tl4oexQ8hKI/AAAAAAAAHj0/rDrrWnIWGWI/113.png?imgmax=800" width="398" height="41" /&gt;&lt;/p&gt;

&lt;p&gt;As you can see, no event handler gets called at all! &lt;/p&gt;

&lt;p&gt;&lt;font style="background-color: #ffff00"&gt;&lt;strong&gt;1d.)&lt;/strong&gt;&lt;/font&gt; RAISING a &lt;em&gt;scalar&lt;/em&gt; property like so: &lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;( oSource, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp&lt;/span&gt;&amp;quot;)&amp;#160; does NOT trigger an existing&amp;#160; _Assign() method, because internally VFP does not execute a real self-assignment, but only invokes all bound delegates. This produces the following output:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="7[1]" border="0" alt="7[1]" src="http://lh4.ggpht.com/-fL__-YCYGcw/Tl4off6U6nI/AAAAAAAAHj4/i0amZbNh9Q0/713.png?imgmax=800" width="227" height="285" /&gt;&lt;/p&gt;

&lt;p&gt;The output shown above is the same when we are raising our &lt;em&gt;non-scalar array&lt;/em&gt; property! Thus, we can state that VFP’s property-raising behavior is consistent for both property types (scalar and non-scalar ones)!&lt;/p&gt;

&lt;p&gt;&lt;font style="background-color: #ffc000"&gt;&lt;strong&gt;2a.)&lt;/strong&gt;&lt;/font&gt;&amp;#160; VFP’s help file is missing some interesting things that should also be known! What’s about resetting a property to the class-default using VFP’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;ResetToDefault()&lt;/strong&gt;&lt;/font&gt; method? 

  &lt;br /&gt;This is what will happen, if you issue the following commands: &lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;oSource.ResetToDefault(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;aProp&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;font face="Calibri"&gt; or &lt;br /&gt;&lt;/font&gt;&lt;strong&gt;oSource.ResetToDefault(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;cProp&lt;/span&gt;&amp;quot;)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;They yield in the following output ( I added this: &lt;strong&gt;? '&lt;span style="background-color: #ffff00; color: red"&gt;ResetToDefault(&amp;quot;&lt;/span&gt;' + m.cProperty + '&lt;span style="background-color: #ffff00; color: red"&gt;&amp;quot;)&lt;/span&gt;'&amp;#160; &lt;/strong&gt;to the &lt;font color="#000000"&gt;form’s &lt;font face="Courier New"&gt;&lt;strong&gt;ResetToDefault()&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt; method):&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="5[1]" border="0" alt="5[1]" src="http://lh6.ggpht.com/-i0ngagubalk/Tl4ofuMV6jI/AAAAAAAAHj8/JoinnWvfHPw/513.png?imgmax=800" width="349" height="325" /&gt;&lt;/p&gt;

&lt;p&gt;When resetting the form’s non-scalar .aProp[] property only a single &lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="6[1]" border="0" alt="6[1]" src="http://lh6.ggpht.com/-ig5VrsNeKwg/Tl4ogJ1rSmI/AAAAAAAAHkA/GVzxHYhNH4I/613.png?imgmax=800" width="169" height="29" /&gt;&lt;/p&gt;

&lt;p&gt;is echoed out. The two most interesting parts to remember are: 
  &lt;br /&gt;1st) &lt;strong&gt;Resetting a (non-scalar) array property&lt;/strong&gt; neither raises an event handler nor does it call an existing _ASSIGN() method! 

  &lt;br /&gt;2nd) On the other hand, &lt;strong&gt;resetting a scalar property does it all&lt;/strong&gt;, but with one interesting difference: all event handlers, as well as the _Assign() method call itself are invoked AFTER VFP’s internal ”resetting process” has finished work! You can see above that the property value already is empty when the Assign() method call (followed by the event handler invocations) takes place. What exactly is going on while resetting an array property cannot be monitored due to the 1st limitation. 

  &lt;br /&gt;3rd) One final thing to mention is, that trying to &lt;strong&gt;reset an array property&lt;/strong&gt; back to it’s class default using code like: &lt;font face="Courier New"&gt;&lt;strong&gt;.&lt;font color="#0000ff"&gt;ResetToDefault&lt;/font&gt;(&amp;quot;&lt;font style="background-color: #ffff00" color="#ff0000"&gt;array_property_name&lt;/font&gt;&amp;quot;)&lt;/strong&gt;&lt;/font&gt; is useless! Neither a changed array dimension will be restored, nor will the remaining array elements be set to .F. again. This is the default behavior documented in VFP’s help file.&lt;/p&gt;
&lt;font style="style"&gt;&lt;strong&gt;
    &lt;p&gt;
      &lt;hr /&gt;&lt;/p&gt;

    &lt;p align="center"&gt;&lt;font size="4"&gt;The following section is for all VFP PROs (who think they know all and everything ;-)&lt;/font&gt;&lt;/p&gt;
  &lt;/strong&gt;&lt;/font&gt;&lt;font style="background-color: #ffc000"&gt;&lt;strong&gt;
    &lt;hr /&gt;

    &lt;p&gt;2b.)&lt;/p&gt;
  &lt;/strong&gt; We can bind any event handler to a property. Better said, we can parameterize a property-event handler without limitation (okay, within VFP’s maximum parameter count limit). The best is jet to come: &lt;strong&gt;&lt;font style="background-color: #ffff00"&gt;We can raise a property with as much parameters as we want (within VFP’s maximum parameter count limit), as long our delegate is able to receive/handle the parameter values! &lt;font color="#ff0000"&gt;You are not that exited?&lt;/font&gt;&lt;/font&gt;&lt;font style="background-color: #ffff00"&gt; Wait, better think twice!&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;

&lt;p&gt;VFP’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;AEVENTS()&lt;/strong&gt;&lt;/font&gt; function is a nice to have thing, when we need to find out what the source of the event was. Creating a local 3-element array that gets filled with the appropriate information first, sometimes sounds like creating to much overhead. At least in tight loops raising slow delegates very often can become a speed-bottleneck at runtime. Naturally, after having mentioned that we can bind any kind of parameterized delegate to a property, it is easy to guess, what comes next: &lt;strong&gt;&lt;u&gt;&lt;font color="#9b00d3" size="3"&gt;&lt;em&gt;Let us use parameterized delegates on properties!&lt;/em&gt;&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The diagram below seems a little bit confusing at first sight. Thus, let me explain what it should depict. To keep things as simple as possible at the beginning there are 4 object in our example: one form (on the GUI layer) with two interface objects (at the wiring layer) and one manager/controller object (in the business/system layer). &lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-Cg9Rbs5pdKg/Tl4ogqbyGWI/AAAAAAAAHkE/29cdIIuc8qo/image52.png?imgmax=800" width="820" height="726" /&gt;&lt;/p&gt;

&lt;p&gt;A reference of each form interface object will be stored in the form (the thick black lines). The form’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;Resize()&lt;/strong&gt;&lt;/font&gt; and &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;Moved()&lt;/strong&gt;&lt;/font&gt; events may implement trigger code like the following (a reference to the “Position&amp;amp;Size” interface object is stored in the form’s “oInterfacePosAndSize” property:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;*\\ Trigger code in the form's MOVE() event&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.oInterfacePosAndSize,;
		&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Position&lt;/span&gt;&amp;quot;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;,		;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Left&lt;/span&gt;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Top&lt;/span&gt;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;	&lt;/strong&gt;)&lt;/pre&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;*\\ Trigger code in the form's RESIZE() event&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RAISEEVENT&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.oInterfacePosAndSize,;
		&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Size&lt;/span&gt;&amp;quot;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;,		;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Left&lt;/span&gt;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Top&lt;/span&gt;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;,	;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;	)&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;The cool thing about these constructs is that they run without errors &lt;strong&gt;&lt;u&gt;even if there is no delegate attached/bound&lt;/u&gt;&lt;/strong&gt;. In other words: we can set up a series of EMPTY-based interface objects like shown above, link them to their implementation instances and bind triggers and delegates to their properties. You can move such a form and resize it as you like, there will be no delay. The form instance behaves absolutely “normal”! Firing triggers that raise events on unbound properties is a totally transparent process.&lt;/p&gt;

&lt;p&gt;Now, what’s next? Okay, our form layout controller instance is very interested in what users are doing with our forms. But, instead of holding/storing a form reference (working directly with the public interface of each form), the form layout controller only binds his delegates and triggers to the properties “Position” and “Size” &lt;strong&gt;of the form’s interface object&lt;/strong&gt;. The signatures of the delegates are shown below:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;*\\ Handler signature in the form layout controller's &lt;u&gt;OnPosChange()&lt;/u&gt; delegate &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;LPARAMETERS&lt;/span&gt; oSender &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Object,	;
		tnLeft &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnTop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnWidth &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnHeight &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;*\\ Handler signature in the form layout controller's &lt;u&gt;OnSizeChange()&lt;/u&gt; delegate &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;LPARAMETERS&lt;/span&gt; oSender &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Object,	;
		tnLeft &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnTop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnWidth &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnHeight &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Now, moving or resizing the form will cause invocation of the bound delegates of the layout controller. Of course, you have to implement something useful there. I leave that to your imagination. One thing should also be mentioned: Using parameterized event raising on properties passing a self reference as one of the parameters frees the event handler from using VFP’s AEVENTS() function to retrieve such a sender reference! 
  &lt;br /&gt;Additionally , you may want to shorten the signature of your “raise-events”. Two parameters are enough: the sender reference and a parameter object. This is just the way most of .NET’s event binding works. &lt;/p&gt;

&lt;p&gt;What we have now is a ultra-lightweight EMPTY object containing as much scalar properties as we need. We only need to know the name of the property, because the property only has to exist – the property value doesn’t matter, it is irrelevant. The property can be seen as some kind of binding-handle: a unique address we can bind our handlers to and raise our events. Our delegate implementations should test then for a parameter count &amp;gt; 0 to reassure the property-event was&amp;#160; RAISED and not triggered by a simple value assignment, like so:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;*\\ Handler code in the form layout controller's OnSizeChange() delegate &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;LPARAMETERS&lt;/span&gt; oSender &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Object,	;
		tnLeft &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnTop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnWidth &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;,	;
		tnHeight &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ only process invocations stemming from a RAISEEVENT()&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;font color="#0000ff"&gt;PCOUNT()&lt;/font&gt; = 0
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;/strong&gt;&lt;span style="color: #008000"&gt;&lt;strong&gt;*//&lt;/strong&gt; &lt;/span&gt;&lt;/pre&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;More benefits&lt;/font&gt;&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;The technique I presented here is based on using EMPTY-based objects to setup some kind of generic event binding. Sure, you can use other “full-blown” VFP classes instead to add more functionality to your interface objects. In my own &lt;strong&gt;&lt;em&gt;FoxQuill&lt;/em&gt;&lt;/strong&gt; framework I call these extended interfaces “smart interfaces”, because they are able to host contracts to validate incoming, as well as outgoing parameter values. This is my way to completely separate inter-object messaging/communication from function implementation. &lt;/p&gt;

&lt;p&gt;Passing ultra-lightweight&amp;#160; interface objects around saves you from spreading your real object references all over the place. Dangling references are almost unknown to my personal framework, since I’m using these binding-proxy objects. Another benefit is: now we can split our objects’ interfaces and group them on a logical basis: one set representing queries, another set represents commands, and two others hold events and exceptions. &lt;/p&gt;

&lt;p&gt;Finally imagine: you will be able to pass all those interfaces into an environment (I call mine “The Matrix”:-) where some generic (data-driven) mechanism links logical children to their parents and/or service-providers to their service-subscribers. That way, all your (implementing) objects can be stored in one place (I call mine “The Construct”:-) and the inter-object communication system can be set up (even dynamically at runtime). Implementing security related message redirections or adding some extensions to an existing workflow has never been easier to realize!&lt;/p&gt;

&lt;h2&gt;&lt;font style="font-weight: bold" color="#000080"&gt;
    &lt;hr /&gt;

    &lt;hr /&gt;Protect Your Events&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;Let’s assume there is a password dialog object asking your end-user to enter her name and password in two textboxes. If the password dialog class is one of your framework goodies, maybe your way of returning the user name and password is based on event binding. Thus, your dialog class may have an event called &lt;strong&gt;&lt;em&gt;Logon()&lt;/em&gt;&lt;/strong&gt;. You are raising the &lt;strong&gt;&lt;em&gt;Logon()&lt;/em&gt;&lt;/strong&gt; event when the end-user clicks the login-button on your dialog, passing an EMPTY-based object containing to fields: &lt;strong&gt;&lt;em&gt;UserName&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;UserPass&lt;/em&gt;&lt;/strong&gt;. Let’s further assume that password encryption and verification is part of another business-layer and not implemented in your GUI (bravo!). Then, there is a short timeframe, since you’ve raised &lt;em&gt;&lt;strong&gt;Logon()&lt;/strong&gt;&lt;/em&gt;, where the password exists unprotected in a &lt;em&gt;data capsule&lt;/em&gt; that may be intercepted by anyone who had access to your login dialog before! Shure, there are better ways to pass sensitive data in such a case, &lt;u&gt;but this is only an example&lt;/u&gt;!&lt;/p&gt;

&lt;h2&gt;&lt;font style="font-weight: bold" color="#000080"&gt;What Do We Need&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;We need a little VFP project we can use for our experiments. Let’s set up a tiny &lt;strong&gt;&lt;em&gt;login dialog&lt;/em&gt;&lt;/strong&gt; class and a second class representing the junior version of a &lt;strong&gt;&lt;em&gt;Password Manager&lt;/em&gt;&lt;/strong&gt; just to have two instances between which we can establish our binding.&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="spyVSspy" border="0" alt="spyVSspy" src="http://lh4.ggpht.com/-qEgDaHPVAq0/Tl4ohD3JwyI/AAAAAAAAHkI/2683RGffjv4/spyVSspy3.jpg?imgmax=800" width="60" height="59" /&gt;Finally, let’s build a &lt;strong&gt;&lt;em&gt;spy class&lt;/em&gt;&lt;/strong&gt; that tries to monitor the login dialog’s &lt;strong&gt;&lt;em&gt;Logon()&lt;/em&gt;&lt;/strong&gt; event to intercept and catch the user’s name/password combination. &lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;&lt;font color="#a5a5a5"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;h2&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;Securing Events&lt;/font&gt;&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Back to the golden thread!&lt;/u&gt;&lt;/strong&gt; Let’s use the form we already created for our first test-drive. I saved it under a new name “&lt;strong&gt;LOGIN.SCX”&lt;/strong&gt;. Below there are two screenshots showing the login form’s GUI layout in development mode and at runtime:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="13" border="0" alt="13" src="http://lh3.ggpht.com/-5RRkH-Wap50/Tl4ohXjTGvI/AAAAAAAAHkM/wHgR2mk5zus/134.png?imgmax=800" width="478" height="174" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="14" border="0" alt="14" src="http://lh5.ggpht.com/-Qrgju26TiM0/Tl4oh7SPpSI/AAAAAAAAHkQ/GWxFMtscGiQ/145.png?imgmax=800" width="436" height="116" /&gt;&lt;/p&gt;

&lt;p&gt;Clicking the &lt;font style="background-color: #00ff00"&gt;[Submit (ENTER)]&lt;/font&gt;-button executes the following code:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="15" border="0" alt="15" src="http://lh5.ggpht.com/-80AWSbfV_nU/Tl4oiIBmAII/AAAAAAAAHkU/fb_E877tksU/154.png?imgmax=800" width="691" height="149" /&gt;&lt;/p&gt;

&lt;p&gt;During&amp;#160; form’s initialization I added a data object like so:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="16" border="0" alt="16" src="http://lh6.ggpht.com/-9o19tZZv1NY/Tl4oig0t21I/AAAAAAAAHkY/q2OLpiJDN7Q/164.png?imgmax=800" width="661" height="166" /&gt;&lt;/p&gt;

&lt;p&gt;Pressing ESC or clicking the &lt;font style="background-color: #ff0000"&gt;[Abort (ESC)]&lt;/font&gt;-button executes the following code:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="17" border="0" alt="17" src="http://lh6.ggpht.com/-39tJH9ULy4k/Tl4oi2Ksl6I/AAAAAAAAHkc/mOf1iI_xdIs/174.png?imgmax=800" width="630" height="170" /&gt;&lt;/p&gt;

&lt;p&gt;My event method &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;.EvtSendOut()&lt;/strong&gt;&lt;/font&gt; stays untouched. I added a new &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;.Trigger()&lt;/font&gt;&lt;/strong&gt; method from where &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;.EvtSendOut()&lt;/strong&gt;&lt;/font&gt; is raised or called, which depends on the 3rd parameter that can be passed into my &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;.Trigger()&lt;/font&gt;&lt;/strong&gt;method: 1 – RAISEEVENT() | 2 – Method call. The 4th parameter of my &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;.Trigger()&lt;/font&gt;&lt;/strong&gt;method passes security-related information.&amp;#160; I decided to decode the security test type numbering so that it is easy maps to VFP’s &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values. The table below tells you about the integer mapping:&lt;/p&gt;

&lt;table border="1" cellspacing="0" cellpadding="2" width="635"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;&lt;font style="background-color: #ffff00"&gt;value&lt;/font&gt;&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;&lt;font style="background-color: #ffff00"&gt;description&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;0&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;no security testing at all (just pull the trigger :-)&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;1&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;unbind all event handlers that are using &lt;strong&gt;nFlags = 0&lt;/strong&gt; for their delegate bindings&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;2&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;unbind all event handlers that are using &lt;strong&gt;nFlags = 1&lt;/strong&gt; for their delegate bindings&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;4&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;unbind all event handlers that are using &lt;strong&gt;nFlags = 2&lt;/strong&gt; for their delegate bindings&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;8&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;unbind all event handlers that are using &lt;strong&gt;nFlags = 3&lt;/strong&gt; for their delegate bindings&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="65"&gt;16&lt;/td&gt;

      &lt;td valign="top" width="568"&gt;repeat check (to protect against timer-driven spy-ware)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Needless to say, the bit values from above &lt;strong&gt;can be combined&lt;/strong&gt; to “filter out” more than one group. If you want to block all delegates bound with &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; values of 0, 1, and 2, just pass a seven (7) to the &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;.Trigger()&lt;/font&gt;&lt;/strong&gt;method. Naturally, there is no native VFP way to &lt;strong&gt;&lt;em&gt;filter out&lt;/em&gt;&lt;/strong&gt; established bindings. Thus, we have to get rid of the unwanted bindings using old-fashioned “hammer-style”: &lt;strong&gt;&lt;em&gt;Just Unbind Them&lt;font style="background-color: #ff0000"&gt;&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;font color="#000000"&gt;&lt;strong&gt;&lt;em&gt; &lt;/em&gt;&lt;/strong&gt;:-) &lt;/font&gt;Of course, good spy-ware would try to re-establish it’s “wiretapping”. The only way to achieve that successfully, is using a timer. Therefore, I added the option (add +16 to the 4th parameter) to set a marker flagging that the security test is no longer optional!&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="18" border="0" alt="18" src="http://lh3.ggpht.com/-KslB5-k6ty0/Tl4ojvTOU0I/AAAAAAAAHkg/n1YAM6Hkkvs/185.png?imgmax=800" width="730" height="427" /&gt;&lt;/p&gt;

&lt;p&gt;The screenshot above shows my test environment with actually 4 running spy instances. Each spy has bound itself to the login form (that is the caption- and borderless child window inside the Password Manager) with a different &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; value (to proof that my protection scheme really works as expected) My login form’s trigger method was called from the [Submit]-button allowing only delegates bound with &lt;strong&gt;&lt;em&gt;nFlags = 3&lt;/em&gt;&lt;/strong&gt; to stay linked, because (as I mentioned before) the guys with &lt;strong&gt;&lt;em&gt;nFlags&lt;/em&gt;&lt;/strong&gt; 0 or 1 are &lt;strong&gt;&lt;u&gt;no real event handlers&lt;/u&gt;&lt;/strong&gt; today (IMHO)! The rest of the guys has to wait, until I finish processing – thus, they must bind with &lt;em&gt;&lt;strong&gt;AFTER INVOCATION := 3&lt;/strong&gt;&lt;/em&gt;! This gives me room to process the unprotected login data (you can see it below: the new caption of my Password Manager form displays it). Naturally, before returning from my password manager, I changed the originally entered name and password to some less valuable text ;-) which was captured by spy #4 (numbered from top to bottom on the screen shot). Have a good time with that, SPY#4! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Zwinkerndes Smiley" src="http://lh4.ggpht.com/-TGnDCKH1SDo/Tl4oj1oGCpI/AAAAAAAAHkk/S_fjrj2Nb2c/wlEmoticon-winkingsmile2.png?imgmax=800" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-zg2XU2O7d7A/Tl4okm5evKI/AAAAAAAAHko/M0k8qyp9lL0/image4.png?imgmax=800" width="728" height="428" /&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;hr /&gt;&lt;a title="Download EventTest.Zip from here" href="http://resources.foxquill.de/eventtest.zip" rel="nofollow" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 12px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="download" border="0" alt="download" src="http://lh4.ggpht.com/-cX-Ij8dRxaY/Tl4ok_3GVrI/AAAAAAAAHks/CgXGT2v3R9o/download%25255B5%25255D.png?imgmax=800" width="77" height="67" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Where is the Beef?&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;&lt;font size="2"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;#160; Here it is! Use this download link to get all sources to play with… &lt;/font&gt;&lt;/p&gt;

&lt;h2&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Final Thoughts&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;Native event binding is one of the most useful features that were added to VFP over the time! To be honest, I started developing my own VFP framework not until event binding was introduced! Even though there are many little bumps on the floor (especially, when applying event binding to VFP’s native properties), up to now, I never found another development environment that gave me more freedom to create extraordinary specialties with ease! &lt;/p&gt;

&lt;hr /&gt; 

&lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html" href="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh5.ggpht.com/-_oGMYzhOYn0/Tl4ola5xkgI/AAAAAAAAHkw/yc7nIBUq2jc/NavBack_48_RGBA%25255B6%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Home" border="0" alt="Tips &amp;amp; Tricks Home (TOC)" src="http://lh6.ggpht.com/-afOHUMke75k/Tl4oljrl_GI/AAAAAAAAHk0/fg8MXBGz_xY/NavHome_48_RGBA%25255B3%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="NavForward_48_RGBA" border="0" alt="NavForward_48_RGBA" src="http://lh5.ggpht.com/-usfcq9v2K1s/Tl4ol21z5nI/AAAAAAAAHk4/3W0xWL6JVq0/NavForward_48_RGBA%25255B6%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-134608867953755882?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/134608867953755882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=134608867953755882&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/134608867953755882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/134608867953755882'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html' title='Cool VFP Event Binding'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-Q5xN0BkdiVQ/Tl4oYqaLn3I/AAAAAAAAHi0/g67d6xvu5Ss/s72-c/NavBack_48_RGBA534%25255B13%25255D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-7058985363349527419</id><published>2011-05-12T11:09:00.000+02:00</published><updated>2011-08-31T14:39:11.136+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><title type='text'>Hierarchical Table Order (Part I)</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;Version: 0.01.70 - last update: Wednesday, August 30, 2011, 14:35:00 (page links updated)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html" href="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9c6hvawvI/AAAAAAAAHgA/ZT3MmCjRH5I/NavBack_48_RGBA53%5B4%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Tips &amp;amp; Tricks Home (TOC)" border="0" alt="Tips &amp;amp; Tricks Home (TOC)" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tb9c7Sjk7zI/AAAAAAAAHgE/vvhjDXLo2aA/NavHome_48_RGBA53%5B4%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html" href="http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh5.ggpht.com/-emZAj4FrP5A/Tl4ql28TJbI/AAAAAAAAHlM/iq7I1PyxEC8/NavForward_48_RGBA%25255B1%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;hr /&gt;   &lt;font color="#000080" size="3"&gt;   &lt;h4&gt;&lt;font style="font-weight: bold" color="#000080"&gt;All you have to know about sorting table data hierarchically&lt;/font&gt;&lt;/h4&gt;    &lt;h1&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Intro&lt;/font&gt;&lt;/h1&gt; &lt;/font&gt;  &lt;p&gt;When I implemented my first version of a native VFP TreeView control – just to see if it was feasible – I created the controlling driver table the typical “at least 2-columns” way. You still can download that outdated first try from &lt;a title="http://resources.foxquill.de/gridtree_alpha_01.zip" href="http://resources.foxquill.de/gridtree_alpha_01.zip" rel="nofollow" target="_blank"&gt;here&lt;/a&gt; – just in case you want to peep at the table structure in question :-) After many, many hours of testing I found a couple of neat solutions to master all speed bottlenecks I encountered during test-driving my first VFP TreeView results. Today, I like to present to you one of the most interesting basics: how to sort a DBF-table hierarchically on only one column’s data &lt;strong&gt;&lt;em&gt;WITHOUT loosing to much speed!!!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Hierarchical data - abstract&lt;/font&gt;&lt;/h3&gt;  &lt;p&gt;Some guys out here, even profs of computer sciences, claim that any set(s) of items can be organized hierarchically. Almost all taxonomies, numeric or non-numeric ones, have one thing in common: a one to many relationship between their members, spanning a tree-like structure stemming from one shared root element. &lt;/p&gt;  &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Hierarchies – concrete&lt;/font&gt;&lt;/h3&gt;  &lt;p&gt;Looking at objects at runtime, even during design-time while using “instance programming” in VFP, we immediately notice that any object has its unique identity and at least one reference path through which we can access its public members. Let’s have a look on a pretty common example showing how to print out the content of a VFP application’s textbox:&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="2" face="Courier New"&gt;&lt;strong&gt;? m.goApp.oFormManager.Items(“AddressForm.1”).oPgfMaster.oPage1.oCntLeftPane.oTxtFirstName.Value&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Nothing extravagant so far. So, what do we have here? There seems to be a public variable called “goApp” pointing to a global application object. Obviously, the application object contains some kind of form manager object, through which we can retrieve a form reference. In this case it is one of our address entry forms, from which a reference was stored in the form manager’s collection using a key value “AddressForm.1”. On this form there is a page frame &lt;em&gt;oPgfMaster&lt;/em&gt; with a page &lt;em&gt;oPage1&lt;/em&gt; containing a VFP container object &lt;em&gt;oCntLeftPane&lt;/em&gt; that holds the textbox &lt;em&gt;oTxtFirstName&lt;/em&gt; we are looking for. Wow, finally we hold our textbox reference; from there we can print out the content of its &lt;em&gt;value&lt;/em&gt; member. Well, I said it already, nothing special so far. &lt;/p&gt;  &lt;p&gt;Let’s map this concrete implementation snapshot to the more abstract description: the &lt;strong&gt;&lt;em&gt;root element&lt;/em&gt;&lt;/strong&gt; of our reference path is our global reference &lt;strong&gt;&lt;em&gt;m.goApp&lt;/em&gt;&lt;/strong&gt;. From there we start walking the reference path &lt;em&gt;down&lt;/em&gt; to our textbox object. There may be more than one textbox named &lt;strong&gt;&lt;em&gt;oTxtFirstName&lt;/em&gt;&lt;/strong&gt; in our application at the same time (especially if we’ve enabled multi-instance editing), but NOT inside the parent container named &lt;strong&gt;&lt;em&gt;oCntLeftPane&lt;/em&gt;&lt;/strong&gt; – the one that resides on &lt;strong&gt;&lt;em&gt;oPage1&lt;/em&gt;&lt;/strong&gt; of &lt;strong&gt;&lt;em&gt;oPgfMaster&lt;/em&gt;&lt;/strong&gt; of &lt;em&gt;&lt;strong&gt;.ITEM(“AddressForm.1”)&lt;/strong&gt;&lt;/em&gt; managed by our app’s &lt;em&gt;&lt;strong&gt;FormManager&lt;/strong&gt;&lt;/em&gt;.     &lt;br /&gt;That said, everybody should understand what &lt;strong&gt;&lt;em&gt;&lt;font color="#c0504d"&gt;OBJECT IDENTITY&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; is now. Every object has its own distinct and unique identity. In addition to that, as long as everything works flawlessly, there should be at least one reference path (like the one shown above) through which we are able to access each object individually. What we also see is, that the taxonomy tree spans from left to right. In other words, the &lt;em&gt;one to many&lt;/em&gt; relations are written from left to right along the reference path: the form manager has many forms to manage, a form may contain more than one (top-level) page frame, a page frame usually has more than one page on it, and so on. Whereas every child can only belong to one parent at a time – at least, when it comes to real containment (in VFP). In other words: We cannot &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;ADDOBJECT()&lt;/strong&gt;&lt;/font&gt; a new class instance to more than one parental container object. In contrast to that, it is possible to add an object’s reference to more than only one other object through storing the reference to a property like so: &lt;/p&gt;  &lt;li&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;goApp.oCustomObjects.AddObject(“oMainForm”, “MyMainFormClass”)&lt;/font&gt;&lt;font color="#008080"&gt; &amp;amp;&amp;amp; add object into real container &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;loForm = goApp.oCustomizations.oMainForm &lt;/font&gt;&lt;font color="#008080"&gt;&amp;amp;&amp;amp; retrieve a local working copy of object reference &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;goApp.oFormManager.ADD(m.loForm, “AddressForm.1”) &lt;/font&gt;&lt;font color="#008080"&gt;&amp;amp;&amp;amp; a VFP collection is no container!&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;/li&gt;  &lt;li&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;oApp.oSecurityManager.oMainForm = m.loForm&lt;/font&gt;&lt;font color="#008080"&gt; &amp;amp;&amp;amp; loose coupling only&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;     &lt;p&gt;and so on.      &lt;br /&gt;Line #4 shows how some security manager gets its main form reference. This reference assignment results only in loose coupling. This is no real containment-ship! Best proof: our main form has NO &lt;em&gt;&lt;strong&gt;THIS.PARENT&lt;/strong&gt;&lt;/em&gt; reference (to the security manager!) BTW, even when we use the &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;ADD()&lt;/strong&gt;&lt;/font&gt; method of the form manager collection, like shown on line #3 above, VFP internally does not establish a real containment there! VFP’s collection is no real container class but – well – a collection :-) Only on line #1 above, during instantiation, we added the form object to our custom container instance &lt;strong&gt;&lt;em&gt;as a real child&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;    &lt;p&gt;That said, we can recap that any VFP object reference used as a variable can be assigned many times to many different objects’ properties. In contrast to that, the object itself can only be instantiated once by another parent container class instance using ADDOBJECT() or NEWOBJECT(). I name this kind of parent objects (which references can be retrieved from within any child’s method using &lt;strong&gt;THIS.PARENT&lt;/strong&gt;) the &lt;font color="#0000ff"&gt;&lt;strong&gt;REAL PARENTS&lt;/strong&gt;&lt;/font&gt; or short the &lt;strong&gt;&lt;font color="#0000ff"&gt;CONTAINERS&lt;/font&gt;&lt;/strong&gt;. All other objects holding references may only have some kind of &lt;strong&gt;logical parental relationship&lt;/strong&gt; and therefor are called &lt;strong&gt;&lt;font color="#0000ff"&gt;LOGICAL PARENTS&lt;/font&gt;&lt;/strong&gt;! Again, &lt;strong&gt;&lt;font color="#c0504d"&gt;there is no native support for logical parent-ship in VFP&lt;/font&gt;&lt;/strong&gt;, only containment-ship is fully implemented!&lt;/p&gt;    &lt;h4&gt;&lt;font style="font-weight: bold" color="#000080"&gt;A Short C# PEEK&lt;/font&gt;&lt;/h4&gt;    &lt;p&gt;.NET languages, like C#, don’t have neither functionality, nor class methods comparable to VFP’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;THIS.ADDOBJECT()&lt;/strong&gt;&lt;/font&gt; or &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;THIS.NEWOBJECT()&lt;/strong&gt;&lt;/font&gt;. You can instantiate any GUI control just the way you would do it in VFP with non-visual classes. Making a GUI control instance visible to the user is a simple act of adding the control’s reference to some form’s&amp;#160; &lt;em&gt;controls collection&lt;/em&gt;. Simulating the procedure in VFP would look like so:&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;loTextBox = CREATEOBJECT(“MyTextboxClass”)          &lt;br /&gt;loMainForm.Controls.ADD(m.loTextBox)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;In .NET every container has a controls collection – just like VFP – to which a child object (reference of a class instance) can be added dynamically. &lt;/p&gt;    &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Hierarchies – a General Approach&lt;/font&gt;&lt;/h3&gt;    &lt;p&gt;The only nice thing about long, descriptive reference names is, that most of the tokens we are using there are (more or less) easy to memorize. Even if I did not write the above code myself, I am still able to grasp the idea where to go to get the searched first name value. One of the downsides of descriptive names is that a computer program is not able to deal with the deeper sense transported with the names, like humans do. VFP tokenizes the names and stores them in an internal table (go and Google for VFP’s &lt;strong&gt;&lt;em&gt;NTI – name table index&lt;/em&gt;&lt;/strong&gt; entries). There is not much more you can do with them, but search for existence (e.g.&amp;#160; using &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;PEMSTAT()&lt;/strong&gt;&lt;/font&gt;). Well, you can setup a (complex) naming convention schema if you like but you have to write all of the necessary rule parsers and all the other weird stuff to enforce it on your own. Adding another semantic class to VFP’s variable- and property names introduce a whole new universe of troubles to solve.       &lt;br /&gt;Thus, my proposal is pretty different – &lt;strong&gt;&lt;font size="2"&gt;I say: “Stop using object &lt;u&gt;names&lt;/u&gt;!”&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;No, I do &lt;em&gt;not&lt;/em&gt; mean “stop using names at all” but only in the first place! Let me show you how the textbox object’s value example above may be written within my FoxQuill framework:&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000ff" size="2" face="Courier New"&gt;&lt;strong&gt;? _GlobMem(“1.102.1.15.1.4.1.2.23.”).Value&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;Okay, you’re right, that looks pretty cryptic! But, using some custom &lt;em&gt;intellisense functions&lt;/em&gt; make the whole thing as clear as any “verbose” name approach.&amp;#160; The idea behind my notation is, to substitute human readable reference names with a &lt;em&gt;very simple to understand&lt;/em&gt; enumeration schema! These are my basic rules:&lt;/p&gt; &lt;/li&gt;  &lt;li&gt;Every class instance (object) has a unique (running) number that makes it distinguishable from all other sibling objects at the same level (of containment). &lt;/li&gt;  &lt;li&gt;Object numbering starts with &amp;lt;1&amp;gt;. (All &amp;lt;0&amp;gt;-based object references are reserved for internal use!) &lt;/li&gt;  &lt;li&gt;All objects exactly have at least one &lt;em&gt;logical&lt;/em&gt; parent. There can only be &lt;u&gt;one&lt;/u&gt;&amp;#160;&lt;strong&gt;&lt;em&gt;start-point object&lt;/em&gt;&lt;/strong&gt; that must not have any logical parent (the &lt;em&gt;&lt;strong&gt;root&lt;/strong&gt;&lt;/em&gt;). &lt;/li&gt;  &lt;li&gt;The reference path to any object is written using n-dimensional array notation. (In VFP we have to use strings for that.) &lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Relation rule #1&lt;/strong&gt;: Child numbers are written next to their logical parent IDs on the right side, separated by a dot. &lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Relation rule #2&lt;/strong&gt;: Sibling objects have the same logical parent string and differ only in their own running number.     &lt;p&gt;Let’s look at an example to make things a little bit clearer:      &lt;br /&gt;There’s a form with a container grouping a label and a textbox: &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;oForm1.oCntFirstName.oLblFName&lt;/strong&gt;&lt;/font&gt; and &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;oForm1.ocntFirstName.oTxtFName&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;    &lt;p&gt;Let’s say that the form is the root object in this example. Then there are the following &lt;strong&gt;VECTOR&lt;/strong&gt; expressions:&lt;/p&gt;    &lt;table border="0" cellspacing="0" cellpadding="2" width="542"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="221"&gt;Form Vector&lt;/td&gt;          &lt;td valign="top" width="37"&gt;&amp;gt;&amp;gt; &lt;/td&gt;          &lt;td valign="top" width="282"&gt;“1.”&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="221"&gt;Container Vector&lt;/td&gt;          &lt;td valign="top" width="37"&gt;&amp;gt;&amp;gt;&lt;/td&gt;          &lt;td valign="top" width="282"&gt;“1.1.”&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="221"&gt;Label Vector&lt;/td&gt;          &lt;td valign="top" width="37"&gt;&amp;gt;&amp;gt;&lt;/td&gt;          &lt;td valign="top" width="282"&gt;“1.1.1.”&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="221"&gt;Textbox Vector&lt;/td&gt;          &lt;td valign="top" width="37"&gt;&amp;gt;&amp;gt; &lt;/td&gt;          &lt;td valign="top" width="282"&gt;“1.1.2.”&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;I named my “numbered reference paths” &lt;em&gt;&lt;strong&gt;vectors&lt;/strong&gt;&lt;/em&gt;. Every vector carries some implicit information:&lt;/p&gt; &lt;/li&gt;  &lt;li&gt;It points to exactly one object, the so called &lt;em&gt;&lt;strong&gt;endpoint object &lt;/strong&gt;&lt;/em&gt;(the &lt;em&gt;&lt;strong&gt;endpoint&lt;/strong&gt;&lt;/em&gt;). Thus, it may be used as a &lt;strong&gt;&lt;em&gt;unique identity descriptor&lt;/em&gt;&lt;/strong&gt; for that endpoint! &lt;/li&gt;  &lt;li&gt;It describes the parental hierarchy (the containment path) from the &lt;strong&gt;&lt;em&gt;root&lt;/em&gt;&lt;/strong&gt; to the &lt;strong&gt;&lt;em&gt;endpoint&lt;/em&gt;&lt;/strong&gt;. &lt;/li&gt;  &lt;li&gt;Each number within a vector expression (separated by a dot) is called a &lt;strong&gt;&lt;em&gt;dimension&lt;/em&gt;&lt;/strong&gt;. Dimensions are enumerated from left to right. &lt;/li&gt;  &lt;li&gt;The &lt;em&gt;dot-count&lt;/em&gt; of a vector expression reflects the vector’s &lt;strong&gt;&lt;em&gt;dimension width&lt;/em&gt;&lt;/strong&gt; :=&amp;#160; &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;lnDW = OCCURS(&amp;quot;.&amp;quot;, Vector)&lt;/strong&gt;&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; In our example above the textbox vector has an overall &lt;strong&gt;&lt;em&gt;dimension width&lt;/em&gt;&lt;/strong&gt; of &amp;lt;3&amp;gt;. &lt;/li&gt;  &lt;li&gt;If we want to add a child to any object (even to non-containers!) we simply add the child to the object’s &lt;strong&gt;&lt;em&gt;child dimension&lt;/em&gt;&lt;/strong&gt;.     &lt;p&gt;Let’s look at another example. Let’s say, we want to add some new controls to our form above. This was our form’s vector: &lt;strong&gt;“1.”&lt;/strong&gt;       &lt;br /&gt;Now, let us add a PageFrame along with the existing container (at the same containment level). This is the vector expression of our new PageFrane: &lt;strong&gt;“1.2.”&lt;/strong&gt;       &lt;br /&gt;Next, let us add three pages to the our PageFrane. These are the vector expressions of our new Pages: &lt;strong&gt;“1.2.1.”&lt;/strong&gt;, &lt;strong&gt;“1.2.2.”&lt;/strong&gt; and &lt;strong&gt;“1.2.3.”&lt;/strong&gt;       &lt;br /&gt;Finally, let us add a container with another label and textbox to the 2nd page of our new PageFrane.       &lt;br /&gt;These are the corresponding vector expressions: &lt;strong&gt;“1.2.2.1.”&lt;/strong&gt; (the container), &lt;strong&gt;“1.2.2.1.1.”&lt;/strong&gt; (the label) and &lt;strong&gt;“1.2.2.1.2.”&lt;/strong&gt; (the textbox).&lt;/p&gt;    &lt;div&gt;     &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="hierarchical demo" border="0" alt="hierarchical demo" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9c7wAJyuI/AAAAAAAAHgM/6Pny79h7BtI/5%5B4%5D.png?imgmax=800" width="304" height="328" /&gt;         &lt;br /&gt;Now, the hierarchical object relations should look like in the image above. Naturally, we could have used named references as well:         &lt;br /&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;? oForm.oPageFrame.oPage2.oContainer1.oTextBox1.Value&lt;/strong&gt;&lt;/font&gt; is the same like this: &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;? oConstruct(“1.2.2.1.2.”)&lt;/strong&gt;&lt;/font&gt; given that there is some collection-based object named &lt;strong&gt;&lt;font color="#0000ff" face="Courier New"&gt;oConstruct&lt;/font&gt;&lt;/strong&gt; that holds a keyed reference to our textbox instance.&lt;/p&gt;      &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;More to come&lt;/font&gt;&lt;/h3&gt;     &lt;font color="#0000ff" face="Courier New"&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;/font&gt;&lt;/font&gt;      &lt;p&gt;There are many more things to talk about when explaining “name-less” object reference constructions in-depth: how to maintain references using keyed collection, or how to organize (re-)numbering in case of object deletions. I will describe those different aspects pretty soon in later postings. We will talk about the so-called “zero-nodes” (e.g. “0.0.0.0.0.”), you will hear about a generic “inter-object messaging” system built into an object collection I named “&lt;font color="#0000ff"&gt;&lt;strong&gt;the Matrix&lt;/strong&gt;&lt;/font&gt;”). Finally, I will show you how simple otherwise complex object maintenance tasks can be realized if one uses a collection-based class instance storage (I named mine “&lt;font color="#0000ff"&gt;&lt;strong&gt;the Construct&lt;/strong&gt;&lt;/font&gt;”)… &lt;em&gt;&lt;font color="#c0504d"&gt;&lt;strong&gt;(“The blue or the red one, Nero?” ;-)&lt;/strong&gt;&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;      &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;Hierarchical data – The Solution&lt;/font&gt;&lt;/h3&gt;      &lt;p&gt;The screen shot &lt;u&gt;above&lt;/u&gt; shows a TreeView which displays all items sorted correctly. Now, lets create a VFP free table to type in some test data. The outcome could look like the screen shot &lt;u&gt;below&lt;/u&gt;:&lt;/p&gt;      &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Hierarchical table entries not ordered" border="0" alt="Hierarchical table entries not ordered" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tb9c8Q3gT8I/AAAAAAAAHgQ/OXAumQl6cQk/HierarchicalTable001%5B7%5D.png?imgmax=800" width="569" height="733" /&gt;&lt;/p&gt;      &lt;p&gt;At this early stage, the table has only one VARCHAR (binary) field called &lt;strong&gt;&lt;em&gt;Vector&lt;/em&gt;&lt;/strong&gt; which is 240 characters long. I like the VARCHAR field type, because there are no trailing blanks that have to be removed every time when fetching table data into memory. I think of VARCHAR as a regular CHAR field with an implicit &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RTRIM() &lt;/strong&gt;&lt;/font&gt;functionality. BTW, be aware of the following: &lt;strong&gt;If you change a CHAR field to the VARCHAR field later,&lt;/strong&gt; any data that has been already entered will retain its trailing spaces. An example: Maybe you have a table with a column named &lt;em&gt;Clastname&lt;/em&gt;&amp;#160; (maybe a &lt;em&gt;C(80)&lt;/em&gt; field). After 500 record were entered you decide to change your &lt;em&gt;Clastname&lt;/em&gt; field to the new VARCHAR type V(80).&amp;#160; After that, another 500 address records were entered. Now, running through all 1000 records showing the effective content length of your &lt;em&gt;Clastname&lt;/em&gt; field like so: &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;? LEN(Clastname)&lt;/strong&gt;&lt;/font&gt; will show you, that the first 500 records all still print out &amp;gt; &lt;strong&gt;80&lt;/strong&gt; &amp;lt;! Only the newly entered 500 records print their real “&lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;RTRIM()&lt;/strong&gt;&lt;/font&gt;ed” &lt;em&gt;varchar-lengths&lt;/em&gt;!&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Thus, after changing an existing CHAR field containing data(!) to VARCHAR you should run a &lt;font color="#0000ff" face="Courier New"&gt;REPLACE ALL fieldname WITH ALLTRM(fieldname)&lt;/font&gt;ASAP!&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;The screenshot above shows us the non-ordered list of entries (their so-called &lt;em&gt;chronological ordering&lt;/em&gt;). Now, lets add an index and activate it like so:&lt;/p&gt;      &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Hierarchical table entries with simple ordering" border="0" alt="Hierarchical table entries with simple ordering" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tb9c8jjLz6I/AAAAAAAAHgU/_S4ROfyl-mM/HierarchicalTable002%5B1%5D.png?imgmax=800" width="607" height="733" /&gt;&lt;/p&gt;      &lt;p&gt;Adding a regular VFP index on the Vector column does not result in &lt;strong&gt;&lt;em&gt;correct hierarchical sorting&lt;/em&gt;&lt;/strong&gt;. As we can see, &lt;font color="#ff0000"&gt;&lt;strong&gt;the records starting with “100.2.” should be sorted &lt;em&gt;before&lt;/em&gt; those starting with&amp;#160; “100.10.”.&lt;/strong&gt;&lt;/font&gt; Hierarchical data cannot be indexed using simple INDEX ON … commands without wrecking the correct hierarchical sort order. One way to overcome this would be to do a &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;SORT TO &amp;lt;NewTable&amp;gt; &lt;/strong&gt;&lt;/font&gt;for the whole table immediately after a change happened. This is absolutely impracticable! Another approach could be to use a refreshable view. Alas, REQUERIES&amp;#160; would become to slow, because the whole driving cursor has to be refreshed, even if only one record has been changed. What we need is something to generate an outcome like the following:&lt;/p&gt;      &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Hierarchical table entries with CBV ordering" border="0" alt="Hierarchical table entries with CBV ordering" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tb9c9F3WAeI/AAAAAAAAHgY/DwPOoDlCWN0/HierarchicalTable003%5B3%5D.png?imgmax=800" width="579" height="737" /&gt;&lt;/p&gt;      &lt;p&gt;What is missing above is a second column that I named “Cbv” that holds the magic salt. BTW: the column/index name &lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;CBV&lt;/font&gt;&lt;/strong&gt; stands for &lt;strong&gt;&lt;font color="#0000ff" size="3"&gt;C&lt;/font&gt;ompacted &lt;font color="#0000ff" size="3"&gt;B&lt;/font&gt;inary &lt;font color="#0000ff" size="3"&gt;V&lt;/font&gt;iew&lt;/strong&gt; which describes the kind of data stored in that column. CBV-data can be indexed using a simple Visual FoxPro &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;INDEX ON Cbv TAG ‘cbv’&lt;/strong&gt;&lt;/font&gt; command to solve all our hierarchical ordering problems! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smiley" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tb9c9eu95nI/AAAAAAAAHgc/Rwmbq6Y5CDE/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&amp;#160;&lt;/p&gt;      &lt;p&gt;Before I show you the final implementation, here are some things one has to think about when dealing with VFP’s limited DBF-capacities: A CHAR field is limited in size to 254 (maximum), the size of a compound key is limited even more: 240 bytes is the maximum per index key, if the collating sequence is set to MACHINE. &lt;/p&gt;      &lt;p&gt;We could argue that it is easy to retain the correct sort order. We only have to use dimension values with leading zeros like so:&lt;/p&gt;      &lt;table border="1" cellspacing="0" cellpadding="2" width="591"&gt;&lt;tbody&gt;         &lt;tr&gt;           &lt;td valign="top" width="589"&gt;000000100.000000000.000000000.000000000.&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top" width="589"&gt;000000100.000000001.000000000.000000000.&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top" width="589"&gt;000000100.000000002.000000020.000000410.&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top" width="589"&gt;000000100.000000002.000000010.000000000.&lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign="top" width="589"&gt;000000100.000000003.000000000.000000000.&lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;      &lt;p&gt;Well, that is absolutely right! But, how many dimensions do we need to allocate and how many items should then be provided within each dimension? One upper boundary is our 240 bytes we cannot exceed due to FoxPro’s index limitation. Thus, if we reserve 9 bytes for each dimension plus the dimension delimiting dot, we would end up using 10 bytes per dimension. That means, that we have 24 dimensions with enough address space to reference 999,999,999,999 items within each dimension. Seen from a capacity view point only, the dimensions seem huge enough. But, using our regular decimal system in combination with leading zeros that have to fill up every place throughout all used records generates more difficulties than it solves.        &lt;br /&gt;Fist of all, there is a huge performance hit when dealing with larger record sets. Imagine we have over 100,000 TreeView records; then a new TreeView item has to be added to a dimension which then will become the one with the highest &lt;strong&gt;dimension width&lt;/strong&gt; (a new deepest TreeView nesting level will be reached). All existing 100,000 TreeView records have to be touched to add a new dummy set of “000000000.” to their existing string.&lt;/p&gt;      &lt;p&gt;       &lt;table border="1" cellspacing="0" cellpadding="2" width="703"&gt;&lt;tbody&gt;           &lt;tr&gt;             &lt;td valign="top" width="701"&gt;000000100.000000000.000000000.000000000.&lt;strong&gt;000000001. &amp;lt;&amp;lt; adding&amp;#160; this one means:&lt;/strong&gt;&lt;/td&gt;           &lt;/tr&gt;            &lt;tr&gt;             &lt;td valign="top" width="701"&gt;000000100.000000001.000000000.000000000.&lt;strong&gt;&lt;font color="#400000"&gt;000000000. &amp;lt;&amp;lt; add dummies to all others!&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;           &lt;/tr&gt;            &lt;tr&gt;             &lt;td valign="top" width="701"&gt;000000100.000000002.000000020.000000410.&lt;strong&gt;&lt;font color="#400000"&gt;000000000. &amp;lt;&amp;lt; ditto.&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;           &lt;/tr&gt;            &lt;tr&gt;             &lt;td valign="top" width="701"&gt;000000100.000000002.000000010.000000000.&lt;strong&gt;&lt;font color="#400000"&gt;000000000.&lt;strong&gt;&lt;font color="#400000"&gt;&amp;lt;&amp;lt; ditto.&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;           &lt;/tr&gt;            &lt;tr&gt;             &lt;td valign="top" width="701"&gt;000000100.000000003.000000000.000000000.&lt;strong&gt;&lt;font color="#400000"&gt;000000000.&lt;strong&gt;&lt;font color="#400000"&gt;&amp;lt;&amp;lt; ditto.&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;           &lt;/tr&gt;         &lt;/tbody&gt;&lt;/table&gt;     &lt;/p&gt;      &lt;p&gt;Adding plus re-indexing renders this approach useless when running larger TreeViews. This technique is feasible only, if one is working with really small record sets, like in a Outlook scenario shown below:&lt;/p&gt;      &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Outlook&amp;#39;s navigational TreeView" border="0" alt="Outlook&amp;#39;s navigational TreeView" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9c91RZqtI/AAAAAAAAHgg/dxglhfvjVxE/6%5B4%5D.png?imgmax=800" width="341" height="362" /&gt;&lt;/p&gt;      &lt;p&gt;Such kind of Outlook-style TreeViews are not used to display bulky data sets, but are employed for pure menu navigation purposes only! Thus, they are pretty much static, seen from the &lt;em&gt;node count and ordering&lt;/em&gt; point of view.&lt;/p&gt;      &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;The CBV Column&lt;/font&gt;&lt;/h3&gt;      &lt;p&gt;VFP brought us some cool functions and enhancements. Two of them are enhancements to the complementary CTOBIN() and BINTOC() functions. I do not want to re-type here what everyone can read in VFP’s help file about both function. Instead, I want to quote what is written in VFP’s help file in an additional chapter dealing with improved indexing support: &lt;/p&gt;      &lt;hr /&gt;      &lt;blockquote&gt;       &lt;h4&gt;&lt;strong&gt;&lt;font color="#8080ff"&gt;Create Small Indexes Using BINTOC( ) Sample&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;        &lt;p&gt;&lt;b&gt;File:&lt;/b&gt; ...\Samples\Solution\Db\Index1.scx&lt;/p&gt;        &lt;p&gt;This sample shows various indexing schemes you can use with numeric and integer data types to get significant savings in index size and disk space consumed. In addition, smaller sized indexes usually result in faster searches. The &lt;b&gt;BINTOC()&lt;/b&gt; function makes it possible for you to convert an integer (numeric) value to a binary character representation.&lt;/p&gt;        &lt;p&gt;&lt;b&gt;Syntax&lt;/b&gt;&lt;/p&gt;        &lt;p&gt;BINTOC(&lt;i&gt;nExpression&lt;/i&gt; [, &lt;i&gt;nSize&lt;/i&gt;])&lt;/p&gt;        &lt;p&gt;Depending on the size of your expression, you can set the &lt;i&gt;nSize&lt;/i&gt; parameter to accommodate the value of your expression in the least amount of characters.&lt;/p&gt;        &lt;p&gt;The following line of code creates an index on a numeric field:&lt;/p&gt;        &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;INDEX on line_no TAG line_no&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;        &lt;p&gt;The next time you are working with indexes on numeric integer data, consider using something like the following:&lt;/p&gt;        &lt;p&gt;&lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;INDEX on BINTOC(line_no,1) TAG line_no&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;     &lt;/blockquote&gt;      &lt;hr /&gt;      &lt;p&gt;After playing with both functions for a while (BTW: there is a very informative demo under VFP’s Task Pane &amp;gt;&amp;gt; Solution Samples &amp;gt;&amp;gt; New in Visual FoxPro 9.0 &amp;gt;&amp;gt; BINTOC binary conversion) I started coding some routines to help me creating binary compacted string representations of the dimension values of my Vector column. The following listing takes a readable Vector expression like &lt;strong&gt;&lt;em&gt;454.42.753.146.8.1.77&lt;/em&gt;&lt;/strong&gt; and returns a CBV value that can be used for hierarchical indexing:&lt;/p&gt;      &lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Compact a &amp;quot;readable&amp;quot; VECTOR expression like 12.455.3.5566.1. into a&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 	compressed binary vector string (with fixed dimension blocksizes!)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; CompressVector(tcVector &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;, tnBlockSize &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ check input params&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tcValue) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;C&lt;/span&gt;&amp;quot; OR &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.tcValue)
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; error condition&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ Next line is necessary only if &amp;lt;tcVector&amp;gt;-data stems from a CHAR field &lt;/span&gt;
		&lt;span style="color: #008000"&gt;*** tcVector = ALLTRIM(m.tcVector)&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ let block size default to MAX_BLOCKSIZE&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT ( &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tnBlockSize) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;N&lt;/span&gt;&amp;quot; AND &lt;span style="color: #0000ff"&gt;INLIST&lt;/span&gt;(m.tnBlockSize, 4, 8) )
		tnBlockSize = MAX_BLOCKSIZE &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; MAX_BLOCKSIZE == 8 at the moment&lt;br /&gt;&lt;/span&gt;	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; 	lnLoop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;		,;	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; local loop variable&lt;/span&gt;
			lcNewVector &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; local temprary string buffer			&lt;/span&gt;
	lcNewVector = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
	&lt;span style="color: #008000"&gt;*// define a symbol HSORT_SEPARATOR ”.”&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; lnLoop = 1 &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OCCURS&lt;/span&gt;(HSORT_SEPARATOR, m.tcVector)
		lcNewVector = m.lcNewVector + ;
			&lt;span style="color: #0000ff"&gt;BINTOC&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;VAL&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETWORDNUM&lt;/span&gt;(m.tcVector, m.lnLoop, HSORT_SEPARATOR))), &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;BRS&lt;/span&gt;&amp;quot;)	
	&lt;span style="color: #0000ff"&gt;NEXT&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.lcNewVector
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

    &lt;p&gt;The code I’m posting here is limited in that it allows only a fixed block size of 8 bytes at the moment. In other words, to save some extra bytes, I do not store dots between each dimension data any longer but use a fixed block size (of 8 bytes) instead. The final version will support 4 bytes and 2 bytes as well.&amp;#160; The rule of thumb is: The less block size each dimension occupies, the more dimensions can be used to nest hierarchical (e.g. TreeView-) items. The following screenshot shows you the second &lt;strong&gt;&lt;em&gt;Cbv&lt;/em&gt;&lt;/strong&gt; column filled with: &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;REPLACE ALL Cbv WITH CompressVector(Vector)&lt;/strong&gt;&lt;/font&gt; and then &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;INDEX ON Cbv TAG ‘Cbv’&lt;/strong&gt;&lt;/font&gt;. Setting the order to &lt;strong&gt;&lt;em&gt;Cbv&lt;/em&gt;&lt;/strong&gt; afterwards results in the sorted browse like shown below:&lt;/p&gt;

    &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="The filled Cbv column" border="0" alt="The filled Cbv column" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tb9c-JJiswI/AAAAAAAAHgk/m7b7Y7zUUMo/HierarchicalTable004%5B3%5D.png?imgmax=800" width="606" height="740" /&gt;&lt;/p&gt;

    &lt;p&gt;There are some other interesting side effects: 
      &lt;br /&gt;For instance, it is possible to drop the &lt;em&gt;Vector&lt;/em&gt; column completely before starting digital delivery of your application. Okay, it is pretty easy to spot what kind of encryption is running behind the scenes. Anyway, there is no human readable numbering any longer, which is a better protection than none at all :-) 

      &lt;br /&gt;With a second retrieval function (I called mine “DeCompressVector”) it is also possible to recreate the &lt;strong&gt;&lt;em&gt;Vector&lt;/em&gt;&lt;/strong&gt; column values from the &lt;strong&gt;&lt;em&gt;Cbv&lt;/em&gt;&lt;/strong&gt; column values. You will find all functions below (at the end of this post). 

      &lt;br /&gt;Because the binary vector expressions are unique (due to the uniqueness of object identity) they can also be used as primary keys!&lt;/p&gt;
  &lt;/div&gt;

  &lt;h3&gt;&lt;font style="font-weight: bold" color="#000080"&gt;End of Part I&lt;/font&gt;&lt;/h3&gt;

  &lt;div&gt;
    &lt;p&gt;This is the the end of my first part showing you how to setup a table to get sorted hierarchically on one column only! Keep in mind that there will be more supporting functions which will help us maintaining &lt;strong&gt;&lt;em&gt;TreeView driving tables&lt;/em&gt;&lt;/strong&gt; using a binary vector column like shown above. The most common scenarios that need to be supported are: &lt;/p&gt;
  &lt;/div&gt;
&lt;/li&gt;

&lt;li&gt;Inserting one or more items (creating table rows with appropriate &lt;strong&gt;&lt;em&gt;Cbv&lt;/em&gt;&lt;/strong&gt; values). &lt;/li&gt;

&lt;li&gt;Deleting item(s). &lt;/li&gt;

&lt;li&gt;Moving item(s). &lt;/li&gt;

&lt;li&gt;Reorganizing driving table (re-indexing). &lt;/li&gt;

&lt;li&gt;Re-creating (readable) Vector column entries, in case they were dropped. 
  &lt;p&gt;In addition to that there will be even more functions to support specific TreeView behavior like expanding/collapsing branches and other things. &lt;/p&gt;

  &lt;p&gt;&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sun" alt="Sonne" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9c-hBeRRI/AAAAAAAAHgo/oskVR8Nbyp0/wlEmoticon-sun%5B2%5D.png?imgmax=800" /&gt;&amp;#160;&lt;font color="#f79646" size="3"&gt;&lt;strong&gt;Happy coding &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;hr /&gt;

  

  &lt;h3&gt;&lt;font color="#000080"&gt;&lt;font style="font-weight: bold"&gt;The X-Files&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt;

  &lt;pre&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;SET&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;SYS&lt;/span&gt;(16)) &lt;span style="color: #0000ff"&gt;ADDITIVE&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt;

&lt;span style="color: #008000"&gt;*\\ ***************** //* &lt;/span&gt;
&lt;span style="color: #008000"&gt;*** ***************** ***&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** HierachicSort.prg ***&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** ***************** ***&lt;/span&gt;
&lt;span style="color: #008000"&gt;*// ***************** //*&lt;/span&gt;

#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; HSORT_SEPARATOR &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;.&lt;/span&gt;&amp;quot;
#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; MAX_BLOCKSIZE 8

#&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; .F. &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; ===================================================================&lt;/span&gt;
	&lt;/strong&gt;&lt;strong&gt;&lt;font color="#000000"&gt;MAX_BLOCKSIZE represents the maximum &lt;span style="color: #0000ff"&gt;number&lt;/span&gt; &lt;span style="color: #0000ff"&gt;of&lt;/span&gt; bytes it takes &lt;span style="color: #0000ff"&gt;to&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;compress&lt;/span&gt; one &lt;span style="color: #0000ff"&gt;dimension&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; &lt;span style="color: #0000ff"&gt;of&lt;/span&gt; a given VECTOR-&lt;span style="color: #0000ff"&gt;Expression&lt;/span&gt;. &lt;span style="color: #0000ff"&gt;At&lt;/span&gt; the moment
	(within Visual FoxPro) MAX_BLOCKSIZE MUST BE an 8 bytes &lt;span style="color: #0000ff"&gt;Character&lt;/span&gt; &lt;span style="color: #0000ff"&gt;expression&lt;/span&gt; 
	&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CTOBIN&lt;/span&gt;() using &amp;quot;&lt;/font&gt;&lt;/strong&gt;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&lt;span style="background-color: #ffff00; color: red"&gt;N..&lt;/span&gt;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;&lt;strong&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font color="#000000"&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt; the 2nd parameter &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; work correctly. 
	The &lt;span style="color: #0000ff"&gt;BlockSize&lt;/span&gt; setting &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Dimension&lt;/span&gt;. &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; other words: 
				One CANNOT mix 1, 2, 4 and 8 bit dimensions!

	The &lt;span style="color: #0000ff"&gt;compact&lt;/span&gt; &lt;span style="color: #0000ff"&gt;index&lt;/span&gt; (.&lt;span style="color: #0000ff"&gt;cdx&lt;/span&gt;) we &lt;span style="color: #0000ff"&gt;use&lt;/span&gt; &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; hierachial sorting has a maximum &lt;span style="color: #0000ff"&gt;width&lt;/span&gt; 
	&lt;span style="color: #0000ff"&gt;of&lt;/span&gt; 240 caracters. Thus, we can &lt;span style="color: #0000ff"&gt;store&lt;/span&gt; vectors &lt;span style="color: #0000ff"&gt;with&lt;/span&gt; up &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; 30 dimensions using
	an 8-bytes &lt;span style="color: #0000ff"&gt;width&lt;/span&gt; (30 &lt;span style="color: #008000"&gt;* 8 = 240) or 60 dimensions using a 4-bytes width&lt;/span&gt;
	accordingly. The highest scalar &lt;span style="color: #0000ff"&gt;dimension&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt; that can be compresses &lt;span style="color: #0000ff"&gt;into&lt;/span&gt; 
	8 bytes &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; (15 places) which &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; 999,999,999,999,999 =&amp;gt; 999 trillions!

	BTW: 
		9,007,199,254,740,992 &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; VFP'&lt;span style="background-color: #ffff00; color: red"&gt;s mamimum digits of precision in NUMERIC &lt;/span&gt;
		computations (16 digits).

	&lt;span style="color: #0000ff"&gt;In&lt;/span&gt; other words: &lt;span style="color: #0000ff"&gt;At&lt;/span&gt; the moment we are able &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; handle VECTOR-&lt;span style="color: #0000ff"&gt;Expression&lt;/span&gt; up &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; 
	30 dimensions &lt;span style="color: #0000ff"&gt;with&lt;/span&gt; &lt;span style="color: #0000ff"&gt;each&lt;/span&gt; &lt;span style="color: #0000ff"&gt;dimension&lt;/span&gt; holding up &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; 999999999999999 possible 
	sub-dimensions or nodes!&lt;/font&gt;

#&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; ===================================================================&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Compress a given string/numeric value&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Parameter checking and function overloading&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Compress&lt;/span&gt;(teValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VARIANT) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ the largest &amp;lt;teValue&amp;gt; integer value is 999999999999999&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.teValue) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;N&lt;/span&gt;&amp;quot;
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.teValue &amp;gt; 999999999999999
			&lt;span style="color: #008000"&gt;*\\ error condition&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
		&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ call implementation&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; CompressNumber(m.teValue)		
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.teValue) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;C&lt;/span&gt;&amp;quot; AND NOT &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.teValue)
			&lt;span style="color: #008000"&gt;*\\ the largest &amp;lt;teValue&amp;gt; string value is &amp;gt;999999999999999&amp;lt;&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.teValue &amp;gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;999999999999999&lt;/span&gt;&amp;quot;
				&lt;span style="color: #008000"&gt;*\\ error condition&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
			&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ call implementation&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; CompressString(&lt;span style="color: #0000ff"&gt;ALLTRIM&lt;/span&gt;(m.teValue))
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ error condition&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Compress a given string (compress() function overload#1)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; CompressString(tcValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ Do the job w/o parameter testing&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BINTOC&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;VAL&lt;/span&gt;(m.tcValue)), &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;BRS&lt;/span&gt;&amp;quot;)
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Compress a given number (compress() function overload#2)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; CompressNumber(tnValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NUMBER&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ Do the job w/o parameter testing&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BINTOC&lt;/span&gt;(m.tnValue, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;BRS&lt;/span&gt;&amp;quot;)
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Decompress a given (compacted) binary string value&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; DeCompress(tcValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;, tnBlockSize &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ check input params&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tcValue) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;C&lt;/span&gt;&amp;quot; OR &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.tcValue)
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; error condition&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ let block size default to MAX_BLOCKSIZE&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT ( &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tnBlockSize) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;N&lt;/span&gt;&amp;quot; AND &lt;span style="color: #0000ff"&gt;INLIST&lt;/span&gt;(m.tnBlockSize, 4, 8) )
		tnBlockSize = MAX_BLOCKSIZE &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; MAX_BLOCKSIZE always == 8 in VFP&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;LEN&lt;/span&gt;(m.tcValue) = m.tnBlockSize
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; DeCompressValue(m.tcValue)
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;LEN&lt;/span&gt;(m.tcValue) &amp;lt;= m.tnBlockSize
			&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; DeCompressValue(&lt;span style="color: #0000ff"&gt;PADR&lt;/span&gt;(m.tcValue, m.tnBlockSize, &lt;span style="color: #0000ff"&gt;CHR&lt;/span&gt;(0)))
		&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; DeCompressValue(&lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt;(m.tcValue, m.tnBlockSize))
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Decompress() standard implementation&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; DeCompressValue(tcValue &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ parameter checking is done in ExpandValue()&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CTOBIN&lt;/span&gt;(m.tcValue, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;NRS&lt;/span&gt;&amp;quot;)))
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Compact a &amp;quot;readable&amp;quot; VECTOR expression like 12.455.3.5566.1. into a&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 	compressed binary vector string (with fixed dimension blocksizes!)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; CompressVector(tcVector &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;, tnBlockSize &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ check input params&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tcValue) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;C&lt;/span&gt;&amp;quot; OR &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.tcValue)
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; error condition&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ Next line is necessary only if &amp;lt;tcVector&amp;gt;-data stems from a CHAR field &lt;/span&gt;
		&lt;span style="color: #008000"&gt;*** tcVector = ALLTRIM(m.tcVector)&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ let block size default to MAX_BLOCKSIZE&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT ( &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tnBlockSize) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;N&lt;/span&gt;&amp;quot; AND &lt;span style="color: #0000ff"&gt;INLIST&lt;/span&gt;(m.tnBlockSize, 4, 8) )
		tnBlockSize = MAX_BLOCKSIZE &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; MAX_BLOCKSIZE always == 8 in VFP&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; 	lnLoop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;		,;	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; local loop variable&lt;/span&gt;
			lcNewVector &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; local temprary string buffer			&lt;/span&gt;
	lcNewVector = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; lnLoop = 1 &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OCCURS&lt;/span&gt;(HSORT_SEPARATOR, m.tcVector)
		lcNewVector = m.lcNewVector + ;
			&lt;span style="color: #0000ff"&gt;BINTOC&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;VAL&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETWORDNUM&lt;/span&gt;(m.tcVector, m.lnLoop, HSORT_SEPARATOR))), &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;BRS&lt;/span&gt;&amp;quot;)	
	&lt;span style="color: #0000ff"&gt;NEXT&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.lcNewVector &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; + &amp;quot;.&amp;quot;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

&lt;span style="color: #008000"&gt;***---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Expand a compressed (binary) VECTOR string into a &amp;quot;readable&amp;quot; VECTOR&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 	expression like 12.455.3.5566.1.&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; DeCompressVector(tcExpression &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;, tnBlockSize &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ check input params&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tcExpression) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;C&lt;/span&gt;&amp;quot; OR &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.tcExpression)
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; error condition&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ default block size to max block size&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT ( &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tnBlockSize) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;N&lt;/span&gt;&amp;quot; AND &lt;span style="color: #0000ff"&gt;INLIST&lt;/span&gt;(m.tnBlockSize, 4, 8) )
		tnBlockSize = MAX_BLOCKSIZE &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; MAX_BLOCKSIZE is always 8 in VFP&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; 	lnLoop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;		,;	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; local loop variable&lt;/span&gt;
			lcNewVector &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;STRING&lt;/span&gt;		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; local temprary string buffer&lt;/span&gt;
	lcNewVector = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; lnLoop = 0 &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; ( &lt;span style="color: #0000ff"&gt;LEN&lt;/span&gt;(tcExpression) / m.tnBlockSize ) - 1		
		m.lcValue =	&lt;span style="color: #0000ff"&gt;SUBSTR&lt;/span&gt;(m.tcExpression, m.lnLoop &lt;span style="color: #008000"&gt;* m.tnBlockSize + 1, m.tnBlockSize)&lt;/span&gt;
		lcNewVector = m.lcNewVector + ;
				&lt;span style="color: #0000ff"&gt;TRANSFORM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;CTOBIN&lt;/span&gt;( 						;
				&lt;span style="color: #0000ff"&gt;SUBSTR&lt;/span&gt;(m.tcExpression, m.lnLoop &lt;span style="color: #008000"&gt;* m.tnBlockSize + 1, m.tnBlockSize),;&lt;/span&gt;
				&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;NRS&lt;/span&gt;&amp;quot;))) + &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;.&lt;/span&gt;&amp;quot;
	&lt;span style="color: #0000ff"&gt;NEXT&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.lcNewVector
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

  &lt;hr /&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html" href="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh6.ggpht.com/-pzpLp_wX-eQ/Tl4qmHSHLSI/AAAAAAAAHlA/aqQuEFCxECM/NavBack_48_RGBA%25255B3%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Tips &amp;amp; Trics Home (TOC)" border="0" alt="Tips &amp;amp; Trics Home (TOC)" src="http://lh6.ggpht.com/-JviBkwZoMjE/Tl4qmc0CMjI/AAAAAAAAHlE/8rfM1PIE0EU/NavHome_48_RGBA%25255B6%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html" href="http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh4.ggpht.com/-Jprh9MD6ir4/Tl4qm2sSn_I/AAAAAAAAHlQ/W-5BSCVrrWY/NavForward_48_RGBA%25255B3%25255D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;

  
&lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-7058985363349527419?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/7058985363349527419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=7058985363349527419&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/7058985363349527419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/7058985363349527419'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html' title='Hierarchical Table Order (Part I)'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9c6hvawvI/AAAAAAAAHgA/ZT3MmCjRH5I/s72-c/NavBack_48_RGBA53%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-8713628786408247643</id><published>2011-04-30T16:50:00.000+02:00</published><updated>2011-08-31T14:57:15.875+02:00</updated><title type='text'></title><content type='html'>&lt;p&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-foxtools.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Foxtools Home" border="0" alt="Foxtools Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsG7uLbtVzI/AAAAAAAACCY/XN6NiuKM4RA/Home_32_RGBA%5B1%5D.png?imgmax=800" width="32" height="43" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FoxQuill Home" border="0" alt="FoxQuill Home" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsG7uj4FhjI/AAAAAAAACCc/2bRbnuDWyDg/Home_48_RGBA%5B1%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VFPX Projects Home" border="0" alt="VFPX Projects Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsG7vGV-2cI/AAAAAAAACCg/LnG3L-Zc1d4/Home_64_RGBA%5B1%5D.png?imgmax=800" width="64" height="85" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Miscellaneous Home" border="0" alt="Miscellaneous Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsG7vWR74gI/AAAAAAAACCk/lkw3az3-eZA/Home_72_RGBA%5B1%5D.png?imgmax=800" width="72" height="96" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-windows-api-calling.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Windows API Home" border="0" alt="Windows API Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsG7vnG_i1I/AAAAAAAACCs/CXrlkWDBfqw/Home_96_RGBA%5B1%5D.png?imgmax=800" width="96" height="128" /&gt;&lt;/a&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="News Home" border="0" alt="News Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsG7wTrojkI/AAAAAAAACCw/Ai2538g7Awg/Home_128_RGBA%5B1%5D.png?imgmax=800" width="160" height="160" /&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/basics-home.html" href="http://myvfpblog.blogspot.com/2009/09/basics-home.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Basics Home" border="0" alt="Basics Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsG7w6mLMQI/AAAAAAAABs4/ZMCZlQncCSU/Home_96_RGBA%5B4%5D.png?imgmax=800" width="96" height="128" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Tips&amp;amp;Tricks Home" border="0" alt="Tips&amp;amp;Tricks Home" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsG7xcpCfLI/AAAAAAAABtA/lHwWlG5m9hI/Home_72_RGBA%5B4%5D.png?imgmax=800" width="72" height="96" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-toolbox-in-this-section.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-toolbox-in-this-section.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Toolbox Home" border="0" alt="Toolbox Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsG7xkSynnI/AAAAAAAABtE/t_FSa245s8o/Home_64_RGBA%5B4%5D.png?imgmax=800" width="64" height="85" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Complex Controls Home" border="0" alt="Complex Controls Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsG7yZVAklI/AAAAAAAACC4/gYXsXhOhQAo/Home_48_RGBA%5B2%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/neat-solutions-home.html" href="http://myvfpblog.blogspot.com/2009/09/neat-solutions-home.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Neat Solutions Home" border="0" alt="Neat Solutions Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsG7yqemKGI/AAAAAAAABtQ/XQgXPDq6Mw8/Home_32_RGBA%5B4%5D.png?imgmax=800" width="32" height="43" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;h1 style="background-color: #cccccc; font-family: verdana,sans-serif; color: #444444"&gt;&lt;span style="font-size: x-large"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VogelStrauss" border="0" alt="VogelStrauss" align="left" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TVr9MEqEzEI/AAAAAAAAHMA/v1mLhtDjcDY/VogelStrauss%5B9%5D.jpg?imgmax=800" width="131" height="131" /&gt; &lt;/span&gt;&lt;span style="font-size: small"&gt;&lt;/span&gt;&lt;/h1&gt;  &lt;h1&gt;&lt;font color="#000080"&gt;&lt;strong&gt;&lt;span style="font-size: x-large"&gt;Latest News&lt;/span&gt;&lt;span style="font-size: small"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/h1&gt; &lt;span style="font-size: small"&gt;&lt;/span&gt;  &lt;h4&gt;&lt;font color="#000080"&gt;This section of my VFP Blog gets filled at random times and with random content. One could say, this is the remaining most blog-like part of my VFP Blog. Most of the entries will be dealing with what I’ve added to the other sections of my blog lately. Thus, it seems to be a good idea to check this news section first…&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ffffff"&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#000080"&gt;Wednesday, August 30, 2011, 06:05:00&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="4"&gt;&lt;strong&gt;&lt;font color="#000080"&gt;As time goes by…&lt;/font&gt;         &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;I finished my C# course and passed the examine. Now, instead of starting using it, I’m facing a new challenge:     &lt;br /&gt;I need to set up some Apache-based internet sites (with cool interactivity)! Thus, I started learning (renewing) PHP and ALAX. &lt;strong&gt;&lt;em&gt;I’m afraid, learning will never end&lt;/em&gt;&lt;/strong&gt; :-)&lt;/p&gt;  &lt;p&gt;I’m still working on my VFP TreeView (but not spending too much time on it at the moment). At least I will make a download link available.    &lt;br /&gt;I’m going to add more chapters to my FoxTools reference in the future as well as to my OOP-basics chapters, and: I have written an new exhaustive post about cool and unknown(!) &lt;a title="http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html" href="http://myvfpblog.blogspot.com/2011/05/cool-vfp-event-binding.html"&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;EVENTBINDING features&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;!    &lt;br /&gt;    &lt;br /&gt;Finally, I’m afraid, I have to stop posting long “articles” here on this blog because of missing free time. Creating new VFP blog entries using my current blogger template is too time-consuming. I will reset this VFP blog to one of the common/regular layouts, so I can publish my future VFP-related latest news here in minutes, not in hours.&lt;/p&gt;  &lt;p&gt;I won’t drop my VFP-related activities completely – never ever! But there will be another platform for my activities (watch out on &lt;a href="http://www.alligora.com" target="_blank"&gt;www.alligora.com&lt;/a&gt;). &lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Monday, July 18, 2011, 13:00:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;Some of you found all my download links broken last days. This was caused by a high jacking attack on my CMSystem I was running on my FoxQuill.de website. I missed an important maintenance upgrade and found my CMS site cracked short time later. So, take my advice and never miss any CMS upgrades! I deleted my CMS test-drive installation (containing my blogger-resources as well). Thus, sorry for going offline for some days, now you should be able to download again.      &lt;br /&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Monday, May 02, 2011, 24:00:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;Another step towards the final release of my native TreeView: I added the first part of hierarchical indexing &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html" href="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="hierarchical indexing for nerds ;-)" border="0" alt="hierarchical indexing for nerds ;-)" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tb9gV7uqJEI/AAAAAAAAHhU/JeqhcEjqJ70/icon_go_up%5B8%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt;      &lt;br /&gt;Let me introduce to you *Bruno* – my RR &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/bruno-my-rr-rhodesian-ridgeback.html" href="http://myvfpblog.blogspot.com/2011/04/bruno-my-rr-rhodesian-ridgeback.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bruno my RR" border="0" alt="Bruno my RR" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbwhtoLydNI/AAAAAAAAHhY/ALSzXOcB-lY/icon_go_up%5B9%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt; &lt;/font&gt;&lt;/p&gt; &lt;font color="#a5a5a5"&gt;   &lt;hr /&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Friday, April 29, 2011, 22:25:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;Finally I found some time to start filling some old gaps; I added a first entry under the &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html"&gt;&lt;font color="#a5a5a5"&gt;VFPX projects section&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt; &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/vfpx-help-file-corrected-supported-and.html" href="http://myvfpblog.blogspot.com/2011/04/vfpx-help-file-corrected-supported-and.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Go to Post" border="0" alt="Go to Post" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbsh0vKwj_I/AAAAAAAAHcE/ssDw10vikKw/icon_go_up%5B15%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt;      &lt;br /&gt;Next, I restructured my &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html" href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;font color="#a5a5a5"&gt;FoxQuill framework section&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt; because I am going to post new entries there ASAP. &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/foxquill-becomes-foxquillnet.html" href="http://myvfpblog.blogspot.com/2011/04/foxquill-becomes-foxquillnet.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Go to Post" border="0" alt="Go to Post" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbsh1JfWlJI/AAAAAAAAHb8/1-Holrp-JRU/icon_go_up%5B9%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt;      &lt;br /&gt;Last but not least, my native TreeView story develops further. There are only two or three post left to describe some needed background.&lt;/font&gt;&lt;/p&gt; &lt;font color="#a5a5a5"&gt;   &lt;hr /&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Monday, April 25, 2011, 23:45:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;As announced: I added a new entry under my “Tips &amp;amp; Tricks” section &amp;gt;&amp;gt;&amp;gt; &lt;strong&gt;&lt;em&gt;LOADPICTURE() Function – Some Myths Revealed&lt;/em&gt;&lt;/strong&gt;. &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html" href="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Go to Post" border="0" alt="Go to Post" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXuHrkocpI/AAAAAAAAHZc/bFb-_Bl5PTY/icon_go_up%5B7%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt;      &lt;br /&gt;Started publishing some thoughts under my framework section “FoxQuill”, too. &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html" href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;/font&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html" href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Go to Post" border="0" alt="Go to Post" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXuH6ETEXI/AAAAAAAAHcA/5i8teUbuXxI/icon_go_up%5B7%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt; &lt;font color="#a5a5a5"&gt;   &lt;hr /&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Tuesday, April 12, 2011, 15:15:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;Added a new “How to…” under my Miscellaneous section. &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html" href="http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Go to Post" border="0" alt="Go to Post" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbXvH0ERiCI/AAAAAAAAHZk/Dqa5kEgr3pQ/icon_go_up%5B13%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt;      &lt;br /&gt;Busily working on my final native VFP TreeView. See chapter 5 under my Complex Controls section. &lt;/font&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/native-treeview-part-v.html" href="http://myvfpblog.blogspot.com/2011/04/native-treeview-part-v.html"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Go to Post" border="0" alt="Go to Post" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbXvIOi3NDI/AAAAAAAAHZo/57M--aS-HZM/icon_go_up%5B18%5D.gif?imgmax=800" width="15" height="15" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt;      &lt;br /&gt;Just going to release another very interesting entry under my Tips&amp;amp;Tricks section. Be prepared :-)&lt;/font&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Monday, April 4, 2011, 23:35:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;Gosh, I started a C# learning course end of last year – 6 month intensive fulltime-training:&amp;#160; 8 hours a day! Folks I can tell: many new classes and new concepts to learn but after a while one gets used to it. Especially the VS2010 IDE is cool! VFP’s code editor and class/form designers look a little bit shabby after some month working exclusively with VS2010. The only feature I still was missing in VS is VFP’s command window. But then I found a little something called FastSharpForm written by Matthew Manela (see below)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="FastSharpForm - Rapid .NET Scripting Created by Matthew Manela" href="http://matthewmanela.com/projects/fastsharp/" rel="nofollow" target="_blank"&gt;&lt;font color="#a5a5a5"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FastSharpForm" border="0" alt="FastSharpForm" src="http://matthewmanela.com/wp-content/uploads/2009/05/FastSharpForm.png" width="240" height="190" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#a5a5a5"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;So, now I can hack in a simple line containing a C# expression or even a whole code block and click [run] – an Voilà! there it is, the result (or an error :-) Just like using VFP’s command window – well, almost. To be honest, still, there are missing a lot of well-known VFP features. But who knows, maybe Matthew will add some of them to his smart little helper in the future!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;/font&gt;&lt;/p&gt; &lt;font color="#a5a5a5"&gt;   &lt;hr /&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;&lt;strong&gt;&lt;em&gt;Tuesday, February 15, 2011, 23:22:00&lt;/em&gt;&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#a5a5a5"&gt;Just “recovering” from the second removal within one year (the third within the last two years) - From now on the old saying: “Three removals are as bad as fire” makes much more sense!      &lt;br /&gt;After more than three month without any stable internet connection, it was good to see my VFP blog today filled with many comments waiting to be accepted/published. I am happy to see that there are many people still out there willing to read my writings.       &lt;br /&gt;At first glance, Visual FoxPro is getting closer to the binary nirvana year after year? (;-) Hold on! There is life in the old dog yet, and I am going to prove that pretty soon! Thus, stay tuned and be prepared…&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;/font&gt;&lt;/p&gt; &lt;font color="#808080"&gt;   &lt;hr /&gt;&lt;/font&gt;  &lt;div style="background-color: #cccccc; font-family: verdana,sans-serif; color: #444444"&gt;&lt;font color="#ffffff"&gt;&lt;font color="#ff0080"&gt;&lt;strong&gt;&lt;em&gt;Wednesday, September 15, 2010, 09:25:00&lt;/em&gt;&lt;/strong&gt; Finally published an old demo (a VFP exe) you may want to play with while waiting for “the real thing” – the &lt;/font&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#ff0080"&gt;One and Only Native VFP TreeView&lt;/font&gt;&lt;/em&gt; :-) &lt;a href="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html" target="_blank"&gt;http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html&lt;/a&gt;&lt;/strong&gt;&lt;/font&gt; &lt;font color="#ffffff"&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#000080"&gt;Thursday, August 26, 2010, 16:25:00&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; &lt;font color="#000000"&gt;Since my last posting some months went by neither giving me time to write any blog updates nor adding new stuff as expected. Please, don’t blame me for that! Even if I would like to post much more, reality is that driving this blog is only my hobby and not my profession. Beside my VFP work &lt;font color="#a618d9"&gt;I began learning C# (using VS2010)&lt;/font&gt; which is another good exculpation for not fostering these pages during the past months.&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div style="background-color: #eeeeee; font-family: verdana,sans-serif; color: #444444"&gt;   &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;strong&gt;&lt;u&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/div&gt;    &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;strong&gt;&lt;u&gt;&lt;font color="#000000"&gt;There are some unfinished “projects” I started here that I definitely will bring to a presentable/usable state!&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/div&gt;    &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;font color="#ffffff"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;1.) The “ominous” native VFP tree view&lt;/strong&gt;. This still is a “living” work in progress! It was (and still is!) attracting interest! What’s going on “behind the green door” is that I’m busily working on some essential speed improvements, which tend to be much more than simple refactorings!&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;    &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;2.) The Global Resource Manager&lt;/strong&gt;. This also is a work in progress! In fact, I’m actually working on that solution (parallel to writing these lines)!&lt;/font&gt;&lt;/div&gt;    &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;3.) The Complete Foxtools Reference&lt;/strong&gt;. Again, this isn’t forgotten, but does not have that high priority ATM.&lt;/font&gt;&lt;/div&gt;    &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;4.) The RTF2HTML Converter&lt;/strong&gt;. &lt;/font&gt;&lt;font color="#ff0000"&gt;I dropped that project because there are enough free plug-ins available that do that job very well.&lt;/font&gt;&lt;/div&gt;    &lt;div style="background-color: #cccccc; color: #444444"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;5.) VFP’S BASICS&lt;/strong&gt;. My initial intension when starting this thread was to have a place where I can pile up my own OOP-related findings and believing so that I’m able to look them up whenever I needed to do so. Still, part II &amp;amp; III have to be written, even part I needs to be polished up, but like my Foxtools reference, this isn’t flagged “urgent” ATM.&lt;/font&gt;&lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-8713628786408247643?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/8713628786408247643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/8713628786408247643'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2009/09/latest-news-this-section-of-my-vfp-blog.html' title=''/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsG7uLbtVzI/AAAAAAAACCY/XN6NiuKM4RA/s72-c/Home_32_RGBA%5B1%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-3906711473203910605</id><published>2011-04-30T15:42:00.000+02:00</published><updated>2011-04-30T16:55:04.168+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miscellaneous'/><title type='text'>Bruno - My RR (Rhodesian Ridgeback)</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;Version: 1.00.01 - last update: Saturday, April 30, 2011, 16:50:00&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbwg-1eQQ7I/AAAAAAAAHeE/TCO2VI9JvYU/NavBack_48_RGBA%5B2%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Miscellaneous Home (TOC)" border="0" alt="Miscellaneous Home (TOC)" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbwg_HSny7I/AAAAAAAAHeI/L00CsoFrGVA/NavHome_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html" href="http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbwg_SgUdrI/AAAAAAAAHeM/PeL8bQSpBnQ/NavForward_48_RGBA%5B7%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;hr /&gt;    &lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&lt;strong&gt;Everybody should have one &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Zwinkerndes Smiley" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbwclUFwWJI/AAAAAAAAHcY/vA9pE2nzR0I/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800" /&gt;&amp;#160; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&lt;strong&gt;Let me introduce to you, BRUNO, my four years old RR boy &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smiley" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tbwclm4Wz9I/AAAAAAAAHcc/kkhX2Ffxv4Y/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 11px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Attentive" border="0" alt="Attentive" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbwcmfdXvII/AAAAAAAAHcg/PFrnGLN7w6c/Bruno_Wohnzimmer_Kronenstrasse%5B37%5D.jpg?imgmax=800" width="800" height="1067" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bruno with tooth-brush" border="0" alt="Bruno with tooth-brush" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbwcnbA5cBI/AAAAAAAAHck/Y2SPgiQP30Y/Bruno_Spielzeug_im_Maul%5B19%5D.jpg?imgmax=800" width="800" height="1421" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bruno on sofa" border="0" alt="Bruno on sofa" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbwcnopjZuI/AAAAAAAAHco/cIcf3pcOcJo/Bruno_Sofa_Kronenstrasse%5B12%5D.jpg?imgmax=800" width="800" height="450" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Watch out!" border="0" alt="Watch out!" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbwcoTl3gII/AAAAAAAAHcs/ky54twrG33k/Bruno_Balkon_Kronberg%5B12%5D.jpg?imgmax=800" width="800" height="1065" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bruno the black-nose Reindeer" border="0" alt="Bruno the black-nose Reindeer" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbwcpTbcWDI/AAAAAAAAHcw/Lo3FEzG8dCU/Bruno_Elchgeweih%5B12%5D.jpg?imgmax=800" width="800" height="1067" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Contemplative" border="0" alt="Contemplative" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbwcqL-CD9I/AAAAAAAAHc0/gXC5p_hXlPM/Bruno_Strandkorb_1085%5B21%5D.jpg?imgmax=800" width="800" height="1065" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Power Nap" border="0" alt="Power Nap" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbwcqrYSuiI/AAAAAAAAHc4/t6nSkXWGJYA/Bruno_Zimmer_Sylt_2009_1121%5B13%5D.jpg?imgmax=800" width="800" height="601" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bruno is watching you!" border="0" alt="Bruno is watching you!" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbwcrHIoOVI/AAAAAAAAHc8/eoCoJGZWPuI/Bruno_Liege_S%C3%BCrdring%5B14%5D.jpg?imgmax=800" width="800" height="601" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Let sleeping dogs lie!" border="0" alt="Let sleeping dogs lie!" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbwcrhc9DaI/AAAAAAAAHdA/7x8fZ9tDu4g/Bruno_Portrait_Gelbe_Decke%5B13%5D.jpg?imgmax=800" width="800" height="601" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="How to leash a dog" border="0" alt="How to leash a dog" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbwcsQHU1mI/AAAAAAAAHdE/2au3_FuT5GI/Bruno_Petra_Bl%C3%BChender_Baum%5B12%5D.jpg?imgmax=800" width="800" height="601" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Baby you can drive my car" border="0" alt="Baby you can drive my car" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbwcszf8s3I/AAAAAAAAHdI/IKkGQOTjuDA/Bruno_Petra_im_Beetle%5B12%5D.jpg?imgmax=800" width="800" height="600" /&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbwg_o2j1CI/AAAAAAAAHeQ/_E2U0Cj3TH0/NavBack_48_RGBA%5B5%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Miscellaneous Home (TOC)" border="0" alt="Miscellaneous Home (TOC)" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/Tbwg_ynDh8I/AAAAAAAAHeU/YfTWqAhbiAE/NavHome_48_RGBA%5B7%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html" href="http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbwhANBN8TI/AAAAAAAAHeY/C1inG7N_wig/NavForward_48_RGBA%5B6%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-3906711473203910605?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/3906711473203910605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=3906711473203910605&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/3906711473203910605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/3906711473203910605'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/04/bruno-my-rr-rhodesian-ridgeback.html' title='Bruno - My RR (Rhodesian Ridgeback)'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbwg-1eQQ7I/AAAAAAAAHeE/TCO2VI9JvYU/s72-c/NavBack_48_RGBA%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-8591855353109439104</id><published>2011-04-29T22:10:00.000+02:00</published><updated>2011-04-29T22:10:57.267+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VFPX'/><title type='text'></title><content type='html'>&lt;p&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-toolbox-in-this-section.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Toolbox Home" border="0" alt="Toolbox Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFf2JY1hI/AAAAAAAAB7Q/a7XgOPHFNKI/Home_32_RGBA%5B9%5D.png?imgmax=800" width="32" height="43" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Complex Controls Home" border="0" alt="Complex Controls Home" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsIFgOfelSI/AAAAAAAAB7U/Od3I8X_RBpI/Home_48_RGBA%5B9%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/neat-solutions-home.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Neat Solutions Home" border="0" alt="Neat Solutions Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFgnbJ5SI/AAAAAAAACAw/Yu_ZfEIrkkI/Home_64_RGBA%5B1%5D.png?imgmax=800" width="64" height="85" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-foxtools.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Foxtools Home" border="0" alt="Foxtools Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFg0k0YuI/AAAAAAAACA0/LdD9Gxu3QNg/Home_72_RGBA%5B1%5D.png?imgmax=800" width="72" height="96" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FoxQuill Home" border="0" alt="FoxQuill Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsIFhUHwQgI/AAAAAAAACA4/2pdC4KVfFsE/Home_96_RGBA%5B1%5D.png?imgmax=800" width="96" height="128" /&gt;&lt;/a&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VFPX Projects Home" border="0" alt="VFPX Projects Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsIFiGBYjpI/AAAAAAAAC1o/MlTG0eXB_s4/Home_128_RGBA%5B1%5D.png?imgmax=800" width="160" height="160" /&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Miscellaneous Home" border="0" alt="Miscellaneous Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFiRZqzSI/AAAAAAAAB7w/aHFU_ny9ZiQ/Home_96_RGBA%5B4%5D.png?imgmax=800" width="96" height="128" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-windows-api-calling.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Windows API Home" border="0" alt="Windows API Home" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsIFirxEoVI/AAAAAAAAB70/LEfWHlE0J1g/Home_72_RGBA%5B4%5D.png?imgmax=800" width="72" height="96" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/latest-news-this-section-of-my-vfp-blog.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="News Home" border="0" alt="News Home" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsIFjNraTEI/AAAAAAAAB74/LBFAxy7dsVo/Home_64_RGBA%5B4%5D.png?imgmax=800" width="64" height="85" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/basics-home.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Basics Home" border="0" alt="Basics Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFjcHGH9I/AAAAAAAAB78/5i29jnUvEWk/Home_48_RGBA%5B4%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Tips&amp;amp;Tricks Home" border="0" alt="Tips&amp;amp;Tricks Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFjvKBMgI/AAAAAAAAB8A/J3QAF9BpzsA/Home_32_RGBA%5B4%5D.png?imgmax=800" width="32" height="43" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;h1&gt;&lt;strong&gt;&lt;font color="#ee2d14"&gt;&lt;a title="http://vfpx.codeplex.com/" href="http://vfpx.codeplex.com/" target="_blank"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" align="left" src="http://1.bp.blogspot.com/_MOmDLu4Rm5Y/Sr--7vUpxZI/AAAAAAAABWQ/ge4n8iXYypg/S214/vfpxbanner.gif" width="243" height="106" /&gt;&lt;/a&gt;VFPX Projects&lt;/font&gt;&lt;/strong&gt;&lt;/h1&gt;  &lt;h4&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;This section holds topics dealing with VFPX projects – existing and maybe some future ones…&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;There are very cool tools, addons and other smart gizmos written in VFP (or even using C/C++) to enhance Visual FoxPro available for free download on &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbsQ7naGFjI/AAAAAAAAHbI/IYsyDF0POPc/OffSiteLink%5B2%5D.gif?imgmax=800" width="11" height="7" /&gt; &lt;a title="http://vfpx.codeplex.com/" href="http://vfpx.codeplex.com/" rel="nofollow" target="_blank"&gt;VFPX&lt;/a&gt;. The VFP community is still alive and agile! Some of the cool tools are designed to speed up development, others can be built into one’s own applications to add some sophisticated functionality at runtime. What’s still missing is some kind of an overall picture – a path to follow while designing and implementing all kind of VFPX addons, either design-time, or run-time related ones! I’m not the guru who can tell the one and only truth about such a “mission to mars”; I don’t even come close! In addition, I must admit that some years passed by since I tried to use some VFPX addons in my own applications the last time. What I do have instead is, enough experience what’s best not to do with VFP&amp;#160; &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Zwinkerndes Smiley" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbsQ8NsdxzI/AAAAAAAAHbM/0Ci2xgptErA/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;This section will be the place to read about VFPX projects I was working with and, sometimes, contributed to. As usual I start without a precisely predefined layout. I hope, some fine day a golden thread will appear of its own volition ;-)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 6px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Home_24_RGBA" border="0" alt="Home_24_RGBA" align="left" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbsQ8Rfz7ZI/AAAAAAAAHbQ/_LA0Sl5uFYw/Home_24_RGBA%5B3%5D.png?imgmax=800" width="28" height="28" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Doc_Full_0" border="0" alt="Doc_Full_0" align="left" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbsQ8j4FAbI/AAAAAAAAHbU/JvNYB-gDWKM/Doc_Full_0%5B4%5D.png?imgmax=800" width="54" height="89" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;font style="font-weight: bold" color="#ff0000" size="4"&gt;VFPX – A Community-Based Effort&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#000000"&gt;Still to be (re-)written / published.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;   &lt;hr /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/vfpx-help-file-corrected-supported-and.html" href="http://myvfpblog.blogspot.com/2011/04/vfpx-help-file-corrected-supported-and.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 6px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="VFPX – VFP 9 SP2 Help File" border="0" alt="VFPX – VFP 9 SP2 Help File" align="left" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbsQ8wlU6-I/AAAAAAAAHb0/IjKf2wavr6c/Doc_Full_1%5B3%5D.png?imgmax=800" width="54" height="89" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font style="font-weight: bold" color="#ff0000" size="4"&gt;VFPX – VFP 9 SP2 Help File &lt;a href="http://vfpx.codeplex.com/wikipage?title=VFP%209%20SP2%20Help%20File&amp;amp;referringTitle=Home" rel="nofollow" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="VFPX – VFP 9 SP2 Help File" border="0" alt="VFPX – VFP 9 SP2 Help File" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbsQ9NKZM5I/AAAAAAAAHbc/2j1-d-xWZlU/external%5B19%5D.png?imgmax=800" width="17" height="17" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;The Visual FoxPro 9 SP2 Help file corrected, supported, and enhanced&lt;/b&gt;&lt;strong&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-8591855353109439104?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/8591855353109439104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/8591855353109439104'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html' title=''/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIFf2JY1hI/AAAAAAAAB7Q/a7XgOPHFNKI/s72-c/Home_32_RGBA%5B9%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-7312444312237710876</id><published>2011-04-29T22:07:00.000+02:00</published><updated>2011-04-30T01:30:11.052+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VFPX'/><title type='text'>VFPX - Help file corrected, supported, and enhanced</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;Version: 0.01.10 - last update: Saturday, April 30, 2011, 01:30:00&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/Tbsaz8KMrLI/AAAAAAAAHbg/0Ixuucmw1v8/NavBack_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="VFPX Projects Home (TOC)" border="0" alt="VFPX Projects Home (TOC)" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbsa0b_F6HI/AAAAAAAAHbw/mkRtHqLnNA0/NavHome_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbsa0u_gWKI/AAAAAAAAHbo/9u8lSl5c0N0/NavForward_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt; &lt;/p&gt;  &lt;hr /&gt;   &lt;font color="#000080"&gt;   &lt;h4&gt;&lt;b&gt;&lt;font color="#800000"&gt;Get a refurbished and enhanced Visual FoxPro Help file.&lt;/font&gt;&lt;/b&gt;&lt;/h4&gt;    &lt;p&gt;&lt;font color="#000000"&gt;I downloaded a copy of the latest VFP9 SP2 help file (dv_foxhelp_vfp9sp2_b6.exe) today. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;I contributed the &lt;font face="Courier New"&gt;&lt;strong&gt;LOADPICTURE()&lt;/strong&gt;&lt;/font&gt; help page. &lt;/font&gt;&lt;font color="#000000"&gt;       &lt;br /&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="New LOADPICTURE() Help" border="0" alt="New LOADPICTURE() Help" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbtKAGyhaII/AAAAAAAAHcI/-0XDNu6z6J0/2%5B5%5D.png?imgmax=800" width="532" height="147" /&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;At the end of this help page my example #4 is now missing.        &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;It had to be dropped because otherwise the whole page would have been to long. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;No problem, you can get the whole story (and even more) directly from &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="external" border="0" alt="external" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/Tbsa1E9XC0I/AAAAAAAAHbs/iIxhYOApiOI/external%5B3%5D.png?imgmax=800" width="10" height="10" /&gt; &lt;/font&gt;&lt;a title="Loadpicture() function - Some Myths Revealed" href="http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html"&gt;&lt;font color="#000000"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#000000"&gt;. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font color="#800000"&gt;Do not forget to get your own copy of the latest VFP Help file! &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Francis Faure" border="0" alt="Francis Faure" align="left" src="http://download.codeplex.com/Project/Download/Avatar.ashx?DownloadId=149161" width="111" height="128" /&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbtKAlKMf-I/AAAAAAAAHcM/QVhzdTPLk2I/OffSiteLink%5B2%5D.gif?imgmax=800" width="11" height="7" /&gt;&amp;#160;&lt;a title="http://www.codeplex.com/site/users/view/Faure" href="http://www.codeplex.com/site/users/view/Faure" rel="nofollow" target="_blank"&gt;Francis Faure&lt;/a&gt; who is the project manager is doing a really great job!         &lt;br /&gt;It is hard to keep track of all the little and large oddities that need         &lt;br /&gt;to be corrected – a time-consuming and sometimes nerving task!&lt;/font&gt;&lt;/p&gt; &lt;/font&gt;          &lt;p&gt;Thanks Francis!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-7312444312237710876?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/7312444312237710876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=7312444312237710876&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/7312444312237710876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/7312444312237710876'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/04/vfpx-help-file-corrected-supported-and.html' title='VFPX - Help file corrected, supported, and enhanced'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_MOmDLu4Rm5Y/Tbsaz8KMrLI/AAAAAAAAHbg/0Ixuucmw1v8/s72-c/NavBack_48_RGBA%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-1204301278974881730</id><published>2011-04-29T17:20:00.000+02:00</published><updated>2011-04-30T02:12:04.076+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FoxQuill.NET'/><title type='text'>The Future of FoxQuill</title><content type='html'>&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;/span&gt;&lt;shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"&gt;&lt;stroke joinstyle="miter"&gt;&lt;/stroke&gt;&lt;formulas&gt;&lt;f eqn="if lineDrawn pixelLineWidth 0"&gt;&lt;/f&gt;&lt;f eqn="sum @0 1 0"&gt;&lt;/f&gt;&lt;f eqn="sum 0 0 @1"&gt;&lt;/f&gt;&lt;f eqn="prod @2 1 2"&gt;&lt;/f&gt;&lt;f eqn="prod @3 21600 pixelWidth"&gt;&lt;/f&gt;&lt;f eqn="prod @3 21600 pixelHeight"&gt;&lt;/f&gt;&lt;f eqn="sum @0 0 1"&gt;&lt;/f&gt;&lt;f eqn="prod @6 1 2"&gt;&lt;/f&gt;&lt;f eqn="prod @7 21600 pixelWidth"&gt;&lt;/f&gt;&lt;f eqn="sum @8 21600 0"&gt;&lt;/f&gt;&lt;f eqn="prod @7 21600 pixelHeight"&gt;&lt;/f&gt;&lt;f eqn="sum @10 21600 0"&gt;&lt;/f&gt;&lt;/formulas&gt;&lt;path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"&gt;&lt;/path&gt;&lt;lock aspectratio="t" v:ext="edit"&gt;&lt;/lock&gt;&lt;/shapetype&gt;  &lt;h4&gt;&lt;font size="2"&gt;&lt;font style="font-weight: bold" color="#f79646"&gt;Version: 1.11.01 - last update: Saturday, April 30, 2011, 02:10:00&lt;/font&gt;&lt;/font&gt;&lt;/h4&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Chapter" border="0" alt="Previous Chapter" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbrf8zQ2XfI/AAAAAAAAHak/6ZIyGVNViEc/NavBack_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html" href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FoxQuill.Net Home (TOC)" border="0" alt="FoxQuill.Net Home (TOC)" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tbrf9fA9QII/AAAAAAAAHao/9NF_5TceFMo/NavHome_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Next Chapter" border="0" alt="Next Chapter" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbrf9nKFCnI/AAAAAAAAHas/xH2cPPxNSak/NavForward_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&amp;#160; &lt;hr /&gt;&lt;/p&gt;  &lt;h4&gt;&lt;font style="font-weight: bold" color="#9b00d3"&gt;FoxQuill will become FoxQuill.NET&lt;/font&gt;&lt;/h4&gt;  &lt;h1&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;VFP’s Future&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h1&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Visual FoxPro will not die abruptly – neither tomorrow, nor next week! There is enough work left to be done for smart and experienced VFP developers – okay, maybe with additional programming language skills. I am sure, migrating VFP/XBase based legacy-systems to C# or any other language will become a pretty remarkable line of business in the future. &lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;b&gt;&lt;span style="font-family: &amp;#39;Trebuchet MS&amp;#39;,&amp;#39;sans-serif&amp;#39;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 6px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FQ_Framework_TV" border="0" alt="FQ_Framework_TV" align="left" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbtN9L6iitI/AAAAAAAAHcQ/M6K1JESBBzM/FQ_Framework_TV%5B12%5D.png?imgmax=800" width="316" height="637" /&gt;&lt;/span&gt;&lt;/b&gt;The Future of FoxQuill&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Microsoft’s initial release of the NET framework was on 13. February 2002. During the past decade countless books were written touching almost every NET-related aspect. &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Why should one think about doing another one?&lt;/span&gt;&lt;/em&gt; Well, first of all, I think this is a universal question, which also is true for other businesses: “&lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Why should we build another new type of car? Don’t we have enough to choose from?”&lt;/span&gt;&lt;/em&gt; I believe, one possible answer is: “As long as we can make something better, we should go for it!” Another good answer: “As long as we can re-sharpen something to become more precise, we should do that, too!”       &lt;br /&gt;&lt;/span&gt;&lt;shape style="z-index: 2; position: absolute; margin-top: 0px; width: 54pt; height: 85.5pt; visibility: visible; margin-left: 0px; mso-wrap-style: square; mso-wrap-distance-left: 0; mso-wrap-distance-top: 0; mso-wrap-distance-right: 0; mso-wrap-distance-bottom: 0; mso-position-horizontal: left; mso-position-horizontal-relative: text; mso-position-vertical: absolute; mso-position-vertical-relative: line" id="Bild_x0020_3" title="&amp;quot;The book is here on Amazon.com&amp;quot;" o:button="t" o:allowoverlap="f" target="&amp;quot;_blank&amp;quot;" href="http://www.amazon.com/What-Would-Google-Jeff-Jarvis/dp/0061709719/ref=ntt_at_ep_dpi_1/187-5903716-4665321" o:spid="_x0000_s1026" alt="Book link to Amazon.com" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaZMFJEHAGI/AAAAAAAAHWY/5y_RD8KFJAU/10%5b8%5d.png?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image004.png"&gt;&lt;/imagedata&gt;&lt;wrap type="square" anchory="line"&gt;&lt;/wrap&gt;&lt;/shape&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;     &lt;br /&gt;But there is more to mediate on! Lately, I read &lt;a title="Read more about the author..." href="http://en.wikipedia.org/wiki/Jeff_Jarvis" target="_blank"&gt;Jeff Jarvis&lt;/a&gt;’ book &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: black"&gt;What would Google Do?&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; I &lt;u&gt;do recommend&lt;/u&gt; reading it!&lt;/span&gt;&lt;/strong&gt; Amongst many other things, I learned that the Internet brought a big change in the global market: Yesterday we had some (few) big companies; earning big bucks was only possible for these mainstream players. Today, with the help of the internet, there are much more small-sized companies. &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Specialization&lt;/span&gt;&lt;/em&gt; is the buss word today! Do not try to capture all potential customers in your country, but only a small group that you’ve tailored your perfect fitting offer for. With the help of the internet, your customer base will be multiplied for sure. Now, the whole world has become your country!       &lt;br /&gt;My strategy is to niche a market with &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;FoxQuill.Net&lt;/span&gt;&lt;/strong&gt; in a special way. The experience I’ve made learning C# on the .NET platform, I will publish as an &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;open-source book&lt;/span&gt;&lt;/em&gt;. In addition, I will publish parts of &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;FoxQuill&lt;/span&gt;&lt;/strong&gt; also as an open-source project. I just started to add and refactor some of my old FoxQuill classes. My intention is to make them “look and feel” more like their counterparts in my C#-based &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;FoxQuill.Net&lt;/span&gt;&lt;/strong&gt; version. An effort that will pay back when finally migrating to the .Net platform one fine day. Finally, &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;FoxQuill.Net&lt;/span&gt;&lt;/strong&gt; will be an open-source project as well! I would never presume to create a 100% compatible VFP.NET clone (see below). When Microsoft buried VB6 and published VB.NET they must have had good reasons not to recreate a 100% backwards compatible VB.Net version! &lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Good Starting Points&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Most VFP developers seriously interested in the .NET platform know about the &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1032" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaZMFBG2uLI/AAAAAAAAHWc/smuZhgAkPWw/OffSiteLink%5b10%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;a title="http://foxcentral.net/microsoft/VFPToolkitNET.htm" href="http://foxcentral.net/microsoft/VFPToolkitNET.htm" target="_blank"&gt;Visual FoxPro Toolkit for .NET&lt;/a&gt;. I believe, a closer look at it gives you a good starting point. But, it is not my intention to trample down that trail again. I believe, that most of the authors of .NET books first learned C#, or VB.NET thoroughly and gained experience while working with Visual Studio. They all started writing after they have been there, done it, got the T-shirts :-) I will start now, immediately writing about what I am learning. Even better, writing about what I am missing and what is hard to understand, because there is counterpart within VFP. The best way to learn C#/VB.NET seen from my VFP-biased point of view surely differs from the mainstream. Voilà: there the niche is :-)&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;VFP.NET the Unborn ‘Flatliner’&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Lately I followed a thread on Google groups &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1031" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaZMF0e4DaI/AAAAAAAAHWg/blx8cb_FPNE/OffSiteLink%5b18%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&lt;a title="Go to this Google group" href="https://groups.google.com/group/vfpnet-compiler-community-support-group" target="_blank"&gt;VFP.Net Compiler Community Support Group&lt;/a&gt;. In a nutshell: There is (or was?) a company named &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1030" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaZMGdTTHpI/AAAAAAAAHWk/o5dau_xGi18/OffSiteLink%5b22%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&amp;#160;&lt;a title="http://www.etecnologia.net/" href="http://www.etecnologia.net/" target="_blank"&gt;eTecnologia&lt;/a&gt;. They sell (or sold?)&amp;#160; &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1029" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaZMGvtWZ7I/AAAAAAAAHWo/0VnK461RZIA/OffSiteLink%5b26%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;a &lt;a title="http://www.etecnologia.net/Products/CLRExtender/CLRExtender-index.htm" href="http://www.etecnologia.net/Products/CLRExtender/CLRExtender-index.htm" target="_blank"&gt;Net Extender for VFP&lt;/a&gt;. This tool was intended to be a VFP wrapper that lets us access all the cool .NET functionality flawlessly. But the wrapper was very instable and thus, almost good for nothing! Next they told us, that pretty soon they would come up with a &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1028" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaZMGgCYXwI/AAAAAAAAHWs/UxUq8vFF718/OffSiteLink%5b30%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;a title="http://www.etecnologia.net/Products/VFPCompiler/VFPDeveloperStudio.html" href="http://www.etecnologia.net/Products/VFPCompiler/VFPDeveloperStudio.html" target="_blank"&gt;VFP Developer Studio&lt;/a&gt; – a complete VFP 9 port to the .NET platform! Still it is not much more than an alpha version, even today (April 2011).&amp;#160; &lt;br /&gt;&lt;em&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;IMOH:&lt;/span&gt;&lt;/b&gt;&lt;/em&gt;&lt;em&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; Today, no small (even no mid-sized) company is able to allow itself the luxury of doing a full-featured (100% compatible) VFP 9 to VFP.NET port! Maybe they might be able to implement 95% of VFP’s overall functionality in the first half of their “migration-game”. But, for the remaining 5% of VFP’s functionality ( – believe me –) they will need much more than a second half!&lt;/span&gt;&lt;/b&gt;&lt;/em&gt; &lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;FoxQuill.Net Another Unborn Successor&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;The future of Visual FoxPro, better &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;the spirit of VFP,&lt;/span&gt;&lt;/em&gt; must no longer be controlled by &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;bigger brothers&lt;/span&gt;&lt;/em&gt;. Today, it is possible to form developer teams loosely coupled worldwide from &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;small herds&lt;/span&gt;&lt;/em&gt; to &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;large swarms :-)&lt;/span&gt;&lt;/em&gt; Today, we are able to create a new VFP.NET implementation by our joint efforts from scratch. The outcome may not be &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;the real thing&lt;/span&gt;&lt;/em&gt; compared to VFP 9, but it will definitely be an enhanced development environment that re-enables us to write bullet-proof, stable running, paramount apps for modern operation systems in the shortest possible time! We must not waist our money on compatibility issues! Let’s learn from the past, but do not lose time to repeat it unsuccessfully! Of course, backward compatibility is a “nice to have”-feature, especially if one owes a lot of old sources written in VFP, or even in FPW (or even better in FoxPro for DOS/MAC/UNIX :-)&amp;#160; &lt;br /&gt;Most cardinal errors made in the past stem from &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;how program logic was implemented&lt;/span&gt;&lt;/em&gt;! The logic (the coded behavior) of a program was bound to the programming language much too tight. Every time you have to rewrite parts (or all) of your code during migration, you encounter this flaw. Look at good old macro substitution for example which is a very VFP/XBase - specific feature. Doing an automated port of a PRG that is heavily using macro substitution to C#&amp;#160; is next to impossible! &lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Revert Backward Compatibility to Forward Compatibility!&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Let us face some of the troubles a &lt;em&gt;&lt;strong&gt;T&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;omorrow VFP Developer&lt;/span&gt;&lt;/strong&gt;&lt;/em&gt; may ran into: &lt;/span&gt;&lt;/p&gt;  &lt;ul type="disc"&gt;   &lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Microsoft stopped supporting and maintaining VFP. &lt;/span&gt;&lt;/li&gt;    &lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;VFP will no longer be compatible with Win 8, 9 or 10. &lt;/span&gt;&lt;/li&gt;    &lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;No raising generation of VFP developers any more. &lt;/span&gt;&lt;/li&gt;    &lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Tons of NET programmers with neither XBase knowledge, nor any sympathy. &lt;/span&gt;&lt;/li&gt;    &lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Many companies wish to upsize/migrate their legacy VFP systems to .NET (but only &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;for little fees, please&lt;/span&gt;&lt;/strong&gt;!) &lt;/span&gt;&lt;/li&gt;    &lt;li style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Missing migration tools will hinder you, because you are to expensive! &lt;/span&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p style="margin-bottom: 12pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;The business landscape described above is closer than one might think! A .NET developer always advises any CEO during an in-depth consultation to migrate to the .NET language that meet his skills! No .NET developer would phone you up and ask for you assistance because of your prominent VFP skills – never ever! At the utmost, they may need your expertise during migration of their VFP tables. Upsizing dbf content to any kind of SQL Server instance might spawn subtle errors, as we know! The rest of the plot is very simple: all legacy VFP source code gets dropped. A complete rewrite will be done, because with some very clever NET tools this can be realized very fast and very cheap by someone with less .NET-skills than yours!      &lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;Now, how could we revert compatibility to always point &lt;/span&gt;&lt;/strong&gt;&lt;em&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;forward&lt;/span&gt;&lt;/b&gt;&lt;/em&gt;&lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt; to our latest, most powerful implementations? &lt;/span&gt;&lt;/strong&gt;The answer is astonishingly simple: We have to GENERATE all of our source code by using a program and not by hacking in each line manually! Code that was generated by a machine can be maintained by a machine as well. Automatic maintenance finally leads to computer-based upgrading, upsizing and, if necessary, migration. All we have to do is &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: black"&gt;decouple&lt;/span&gt;&lt;/strong&gt; &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;user interface design&lt;/span&gt;&lt;/em&gt; and &lt;em&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;program logic definition&lt;/span&gt;&lt;/em&gt; from the process of creating the corresponding source code. Look at Microsoft’s WPF and you know what I mean when I’m taking about decoupling the user interface design. This technology is already there! Decoupling program logic (the entire application behavior) from generating the corresponding source code can be realized in almost the same way. &lt;em&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Believe me!&lt;/span&gt;&lt;/b&gt;&lt;/em&gt;       &lt;br /&gt;Using my (future:-) &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;FoxQuill.Net&lt;/span&gt;&lt;/strong&gt; development system, resembles the way we create internet pages in an WYSIWYG editor, today. Yes, it still will be possible to manually write and add source code, but that’s generally not necessary in 95% of all business cases. Even my so called ‘micro-workflows’ can easily be assembled by selecting the appropriate building blocks from context sensitive lists. Dropping them on a design form afterwards and finally arrange/configure them is all that has to be done. I like to point you to Google’s &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1027" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaZMGySxznI/AAAAAAAAHWw/_YGDHSrT1p4/OffSiteLink%5b34%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;a title="http://appinventor.googlelabs.com/about/" href="http://appinventor.googlelabs.com/about/" target="_blank"&gt;App Inventor for Android&lt;/a&gt; where you can watch some short YouTube demos and tutorials. Especially the blocks editor user interface looks very promising (see below)! &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 12pt" class="MsoNormal"&gt;&lt;a title="http://appinventor.googlelabs.com/about/moreinfo/" href="http://appinventor.googlelabs.com/about/moreinfo/" rel="nofollow" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="http://appinventor.googlelabs.com/about/moreinfo/" border="0" alt="http://appinventor.googlelabs.com/about/moreinfo/" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbtT0trPZrI/AAAAAAAAHcU/KENN3Eooa_4/3%5B5%5D.png?imgmax=800" width="619" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="text-align: center" class="MsoNormal" align="center"&gt;&lt;a title="&amp;quot;Watch the movie on YouTube&amp;quot; t " href="http://www.youtube.com/watch?v=Iq9KkAbhxQg&amp;amp;feature=player_embedded"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 556.5pt; height: 411pt; visibility: visible" id="_x0000_i1026" title="&amp;quot;Watch the movie on YouTube&amp;quot;" alt="blocks editor user interface " type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaZMHh6vnjI/AAAAAAAAHW0/YhUDmpbAG4Y/12%5b9%5d.png?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image006.png"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Google still is some development-miles away from having the perfect App generator, but we all know that they will have one in the near future :-)      &lt;br /&gt;GUI layout, workflows, messaging, data-storage, -manipulation and -transport, as well as event-handling and system configuration; all these things are aspects that can be configured using universal XML-based schemas. Any &lt;strong&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3"&gt;FoxQuill.NET&lt;/span&gt;&lt;/strong&gt; editor (just like Google’s Block-Editor shown above partially) emits XML-based data which belongs to the additional abstraction/separation layer I mentioned earlier in this post. Thus, what we are creating during our future development with FoxQuill.NET is neither .NET’s IL code, nor C#/VB.NET source code, but XML files representing a concrete DESIGN; e.g. some GUI layout, or a process workflow, maybe an inter-object messaging specification, or some storage structure definition, or a details system configuration definition, to name only a few possibilities. &lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: #9b00d3; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Pros &amp;amp; Cons&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt; &lt;/span&gt;&lt;/h2&gt;  &lt;p style="margin-bottom: 12pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;At the beginning, as long as adequate tools are rare, there is less interactivity compared to VFP. VFP’s command window is a very unique and useful feature, for example. Such pervasive interactivity normally requires an interpretative language driving the system like &lt;/span&gt;&lt;a title="&amp;quot;Read more about the author...&amp;quot; t " href="http://en.wikipedia.org/wiki/Jeff_Jarvis"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; text-decoration: none; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-no-proof: yes; text-underline: none"&gt;&lt;shape style="width: 8.25pt; height: 5.25pt; visibility: visible" id="_x0000_i1025" title="&amp;quot;Read more about the author...&amp;quot;" alt="OffSiteLink" type="#_x0000_t75"&gt;&lt;imagedata o:href="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaZMH7K8fdI/AAAAAAAAHW4/M1jOLrQ9gIo/OffSiteLink%5b38%5d.gif?imgmax=800" src="file:///C:\DOKUME~1\PETRAU~1\LOKALE~1\Temp\msohtmlclip1\01\clip_image003.gif"&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;Python.&amp;#160; Luckily, there are much more Pros than Cons!      &lt;br /&gt;Every XML output generated by a designer can be preprocessed and/or redirected before the target generator starts it’s code generation. This enables dynamic workflows: we will be able to enhance/add, modify or delete parts of the XML data on the fly based on external conditions. Another big plus is, that the designer tools themselves will be able to pre-check the user-input. With these client-site validations enabled (available only in a local workstation mode) it is possible to catch potential errors at a very early state (still in the designer), which helps to eliminate unnecessary development round-trips.       &lt;br /&gt;The XML files generated by the different designers can be interchanged over the internet. The generation site can be a remote one. Thus, someone may build some very specialized&amp;#160; generator, or a much better version than the original one provided by FoxQuill.NET. The developer of such a super-generator tool then may publish the availability of her advanced functionality so that the community knows about it. After that, she can offer access to the (remote) service for free, or associated with a certain pricing plan. Because a generation service outputs text files only (e.g. C# source code), such a distributed remote source code generation is secure and can be packed and encrypted in addition.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 12pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 10.5pt; mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;"&gt;&lt;font color="#f79646" size="2"&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;to be continued…&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;h3&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Previous Chapter" border="0" alt="Previous Chapter" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbrf91eKrKI/AAAAAAAAHaw/-3tSkpezDpI/NavBack_48_RGBA%5B7%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html" href="http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FoxQuill.Net Home (TOC)" border="0" alt="FoxQuill.Net Home (TOC)" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tbrf-F9S5wI/AAAAAAAAHa0/ZtRPz-8P4pQ/NavHome_48_RGBA%5B7%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Next Chapter" border="0" alt="Next Chapter" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbrf-SSK-DI/AAAAAAAAHa4/Bnv5bTodL4E/NavForward_48_RGBA%5B13%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/h3&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-1204301278974881730?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/1204301278974881730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=1204301278974881730&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/1204301278974881730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/1204301278974881730'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/04/foxquill-becomes-foxquillnet.html' title='The Future of FoxQuill'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tbrf8zQ2XfI/AAAAAAAAHak/6ZIyGVNViEc/s72-c/NavBack_48_RGBA%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-7281860236088425141</id><published>2011-04-25T19:21:00.000+02:00</published><updated>2011-05-03T03:48:28.592+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips and Tricks'/><title type='text'>The LOADPICTURE() Function – (Some) ALL Myths Revealed!</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;Version: 0.02.02 - last update: Thursday, April 26, 2011, 14:35:00&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/design-time-references-monitor-designer.html" href="http://myvfpblog.blogspot.com/2009/09/design-time-references-monitor-designer.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbWxElzvv5I/AAAAAAAAHhA/26-c47w72Gc/NavBack_48_RGBA5%5B1%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Tips &amp;amp; Tricks Home (TOC)" border="0" alt="Tips &amp;amp; Tricks Home (TOC)" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbWxFPKGLQI/AAAAAAAAHXU/6PVUdp4S3jA/NavHome_48_RGBA5%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html" href="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9e5jpq3II/AAAAAAAAHhE/CXkhhet64Zc/NavForward_48_RGBA%5B10%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;hr /&gt;  &lt;h4&gt;&lt;strong&gt;&lt;font color="#000080"&gt;All you have to know about VFP’s LOADPICTURE() function &lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;&lt;font color="#d80e55"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h1&gt;&lt;font color="#000080"&gt;Intro&lt;/font&gt;&lt;/h1&gt;  &lt;p&gt;VFP’s LOADPICTURE() creates a COM picture object and returns a fancy ‘crippled’ interface reference! VFP’s &lt;b&gt;LOADPICTURE()&lt;/b&gt;&lt;b&gt; &lt;/b&gt;function is nothing more than a wrapper around the Windows API function called &lt;b&gt;OleCreatePictureIndirect()&lt;/b&gt;, which in turn creates a COM picture object. These COM–wrapped objects are used by many ActiveX controls. You can find out more about &lt;em&gt;OleCreatePictureIndirect()&lt;/em&gt;&amp;#160;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbWxF_B3EnI/AAAAAAAAHXc/etBIxAEPdzs/OffSiteLink%5B2%5D.gif?imgmax=800" width="11" height="7" /&gt; &lt;a title="http://msdn.microsoft.com/en-us/library/ms694511(v=vs.85).aspx" href="http://msdn.microsoft.com/en-us/library/ms694511(v=vs.85).aspx" rel="nofollow" target="_blank"&gt;here&lt;/a&gt;. There are some VERY GOOD reasons to use VFP’s LOADPICTURE() functionality! After all, carelessly using COM image objects created by VFP’s LOADPICTURE() function in conjunction with VFP’s native Image controls will introduce some almost non-trappable very tricky malfunctions! If you want to get the best out of it, without spending hours on debugging what seems to be impossible, read the rest of this post!&lt;/p&gt;  &lt;p&gt;This is the syntax of the API call wrapped by VFP’s LOADPICTURE() function:&lt;/p&gt;  &lt;pre&gt;&lt;font size="2"&gt;&lt;strong&gt;OleCreatePictureIndirect(pPictDesc,; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Pointer to the structure of parameters for picture&lt;/span&gt;
			   Riid	  ,;&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Reference to the identifier of the interface&lt;/span&gt;
			   fOwn	  ,;&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Whether the picture is to be destroyed&lt;/span&gt;
			   ppvObj     &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Address of output variable that receives the &lt;/span&gt;
				        &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Interface pointer requested in riid&lt;/span&gt;&lt;/strong&gt;
&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;As we all know, the right way to call a COM object’s implementation (inside a DLL) is using one of its interfaces. To figure out the interfaces that are available within a picture COM object, use VFP’s &lt;font color="#000000"&gt;&lt;strong&gt;Object Browser&lt;/strong&gt;&lt;/font&gt;. You can load either the “StdTypes” DLL itself (at &amp;lt;windir&amp;gt;\SYSTEM32\OLEPRO32.DLL), or its type library file (&amp;lt;windir&amp;gt;\SYSTEM32\STDOLE2.TLB).&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ObjectBrowser_StdType" border="0" alt="ObjectBrowser_StdType" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXxtM7S-gI/AAAAAAAAHZs/bVT1M6NuNpM/ObjectBrowser_StdType%5B3%5D.png?imgmax=800" width="456" height="398" /&gt;&lt;/p&gt;

&lt;h2&gt;&lt;font color="#000080"&gt;COM Interfaces&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ffc000" size="3"&gt;&lt;em&gt;&lt;/em&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you can see, in VFP’s Object Browser the interface called “PICTURE” is VFP’s default interface that is returned each time we are using some command like:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;oPicture = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(GETPIC())&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;
&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ObjectBrowser_TLB" border="0" alt="ObjectBrowser_TLB" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbXh4XMSEbI/AAAAAAAAHZw/FNXoVCvlojw/ObjectBrowser_TLB%5B1%5D.png?imgmax=800" width="560" height="435" /&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;em&gt;oPicture&lt;/em&gt; reference above is a COM object reference of an interface named “Picture” through which we can access our image’s properties and methods. &lt;/p&gt;

&lt;p&gt;Let VFP’s IntelliSense help us and type &lt;strong&gt;&lt;em&gt;&lt;font color="#0000ff" face="Courier New"&gt;opicture.&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt; into the command window after we created a picture instance like shown above. IntelliSense shows us a list of five properties and one method accessible through this primary interface. BTW: The same popup can be shown within your debugger:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IntelliDebugger" border="0" alt="IntelliDebugger" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXh4tUU5qI/AAAAAAAAHZ0/HtoDz8gqJ1Q/IntelliDebugger%5B1%5D.png?imgmax=800" width="587" height="290" /&gt;&lt;/p&gt;

&lt;p&gt;This &lt;strong&gt;&lt;em&gt;Picture&lt;/em&gt;&lt;/strong&gt; interface is suitable in cases where we only want to pass a COM object reference to another ActiveX control, or we want to display the image using VFP’s own native image class like this:&lt;/p&gt;

&lt;pre&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;AddObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oImage&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;IMAGE&lt;/span&gt;&amp;quot;)
oPicture = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(GETPIC())
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oPicture
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;Visible&lt;/span&gt; = .T.&lt;/strong&gt;&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;However, if we try to use the COM object’s &lt;strong&gt;&lt;em&gt;render()&lt;/em&gt;&lt;/strong&gt; method directly, bypassing the use of VFP’s&amp;#160; &lt;strong&gt;&lt;em&gt;Image&lt;/em&gt;&lt;/strong&gt; object, we will only receive an OLE error complaining about non-optional parameters. &lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OleErrorDialog" border="0" alt="OleErrorDialog" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbXh5Lv4jvI/AAAAAAAAHZ4/_1MA1lbRttk/OleErrorDialog%5B1%5D.png?imgmax=800" width="388" height="137" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without any further investigations, we are stuck at this point!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;By The Way 1,2,3&lt;/font&gt;&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;b&gt;&lt;/b&gt;There is a BUG in the VFP online documentation for the image object’s &lt;strong&gt;&lt;em&gt;PictureVal&lt;/em&gt;&lt;/strong&gt; property! Actual writing reads: “&lt;font color="#c0504d"&gt;&lt;strong&gt;If eExpression is an object, the object must be in an IPicture interface format. The IPicture interface format is the same format returned by the LOADPICTURE( ) Function.&lt;/strong&gt;”&lt;/font&gt; &lt;font style="background-color: #ffff00"&gt;This is wrong!&lt;/font&gt; It should be “&lt;font color="#008040"&gt;&lt;strong&gt;If eExpression is an object, the object must implement one of the following interfaces: “Picture” OR “iPicture”, which both _*do*_ work! The Picture interface is the same returned by VFP’s &lt;em&gt;LOADPICTURE()&lt;/em&gt; function. If you need the iPicture-interface, you can retrieve it by the help of VFP’s &lt;em&gt;GETINTERFACE()&lt;/em&gt; function&lt;/strong&gt;.&lt;/font&gt;” 

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;VFP’s &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;SAVEPICTURE()&lt;/strong&gt;&lt;/font&gt; function is nothing more than a wrapper around the &lt;em&gt;&lt;strong&gt;SaveAsFile()&lt;/strong&gt;&lt;/em&gt; function of the COM picture object (accessible by VFP through the &lt;strong&gt;&lt;em&gt;iPicture&lt;/em&gt; &lt;/strong&gt;interface)! 

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;&lt;b&gt;&lt;/b&gt;You can read one sentence in VFP’s online help about the &lt;strong&gt;&lt;em&gt;LOADPICTURE()&lt;/em&gt;&lt;/strong&gt; function: „If cFileName is omitted, the &lt;b&gt;null picture&lt;/b&gt; is returned“. This sounds Greek. However, as you can read &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbXh5XuOtoI/AAAAAAAAHY4/hKSnCDeBgXg/OffSiteLink%5B3%5D.gif?imgmax=800" width="11" height="7" /&gt;&amp;#160;&lt;a title="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/fb021348-07d4-4974-a71e-abb1b8d760c4.asp" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/fb021348-07d4-4974-a71e-abb1b8d760c4.asp" rel="nofollow" target="_blank"&gt;here&lt;/a&gt;, it is nothing more than a parameterization option defined in the &lt;strong&gt;&lt;em&gt;OleCreatePictureIndirect()&lt;/em&gt;&lt;/strong&gt; function of the underlying Windows API. The NULL-Picture-Object is nothing else, but an uninitialized object which can initialize itself through the &lt;em&gt;Load()&lt;/em&gt; method of its &lt;i&gt;IPersistStream&lt;/i&gt; interface. Got it? No? Do not hesitate – nothing we have to deal with (in the next future:-) 

    &lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;&lt;font color="#000080"&gt;To make a long story short&lt;/font&gt;&lt;/h2&gt;

&lt;p&gt;… Let me show you how to get the darn thing work. As you should have guessed, we &lt;b&gt;must not&lt;/b&gt; use the &lt;strong&gt;&lt;em&gt;Picture&lt;/em&gt;&lt;/strong&gt; interface that we get back using the &lt;strong&gt;&lt;em&gt;LOADPICTURE()&lt;/em&gt;&lt;/strong&gt; function, but the other (hidden) interface: &lt;b&gt;&lt;i&gt;IPicture&lt;/i&gt;&lt;/b&gt; is the right one to use! And this is how to get the right COM-Object reference:&lt;/p&gt;

&lt;pre&gt;&lt;font size="3"&gt;&lt;strong&gt;oPicture = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(GETPIC())
oIPicture = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(oPicture, “iPicture”)&lt;/strong&gt;&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;Typing in the first line in VFP’s command window, you will get some similar &lt;font color="#0000ff" face="Courier New"&gt;&lt;strong&gt;GETPIC()&lt;/strong&gt;&lt;/font&gt; dialogue like below:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OpenPicture Dialog" border="0" alt="OpenPicture Dialog" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXh501jmNI/AAAAAAAAHZ8/UoSxo_T4N1I/OpenPicture%20Dialog%5B1%5D.png?imgmax=800" width="726" height="419" /&gt;&lt;/p&gt;

&lt;p&gt;I have a little image on my disk called “tree.jpg” – a 100 x 100 pixels JPEG file that I will use during this walkthrough. Now, if we are using VFP’s Intellisense on &lt;strong&gt;&lt;em&gt;oIPicture&lt;/em&gt;&lt;/strong&gt; it shows us a longer list of properties and methods (see Object Browser screen shot below). The biggest point is that we now can use our COM object’s &lt;strong&gt;&lt;em&gt;render()&lt;/em&gt;&lt;/strong&gt; method directly!&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ObjectBrowser_Interfaces" border="0" alt="ObjectBrowser_Interfaces" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbX8oOm4d7I/AAAAAAAAHaQ/BufQU6HOVZs/ObjectBrowser_Interfaces%5B2%5D.png?imgmax=800" width="728" height="678" /&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;The COM Object’s Render() Method&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;This is how the &lt;strong&gt;&lt;em&gt;render()&lt;/em&gt;&lt;/strong&gt; method’s signature reads in VFP’s &lt;strong&gt;Object Browser&lt;/strong&gt; followed by a short description of each parameter:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="IntelliRender" border="0" alt="IntelliRender" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbXxvrTuAgI/AAAAAAAAHaE/lQr-34YIblw/IntelliRender%5B3%5D.png?imgmax=800" width="763" height="167" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="3" face="Courier New"&gt;&lt;strong&gt;Render(hdc As Integer, x As Long, y As Long, cx As Long, cy As Long, xSrc As Long, ySrc As Long, cxSrc As Long, cySrc As Long, lprcWBounds As Void) As H Result&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[target] &lt;strong&gt;hdc&lt;/strong&gt; := the device context handle (a pointer to something like a canvas) 

    &lt;br /&gt;There are two Windows API functions to retrieve a handle to an existing device context: &lt;strong&gt;GetDC()&lt;/strong&gt; and &lt;strong&gt;GetWindowDC().&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[target] x:= left-property of output-rectangle (top left corner’s X-coordinate)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[target] y:= top-property of output-rectangle (top left corner’s Y-coordinate)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[target] cx:= width-property of output-rectangle (the width of output)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[target] cy:= height-property of output-rectangle (the height of output)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;Up to this point all coordinates are measured in pixel (we VFP developers are used to use) and could be mapped 
    &lt;br /&gt;to LEFT, TOP, WIDTH and HEIGHT properties of an imaginary VFP image object.&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[source] xSrc:= X-offset into image source (from where column-copy starts)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[source] ySrc:= Y-offset into image source (from where line-copy starts)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[source] cxSrc:= Width of each line to copy (#no of columns)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[source] cySrc:= Height of each column to copy (#no of lines)&lt;/font&gt;&lt;/p&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;HiMetric&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;To make things a little bit more “interesting” one have decided to use &lt;b&gt;&lt;i&gt;HiMetric&lt;/i&gt;&lt;/b&gt; units for &lt;u&gt;some&lt;/u&gt; of the COM object’s properties (those dealing with the image source dimensions). &lt;font color="#000080"&gt;&lt;strong&gt;That is why a 100x100 pixels image loaded from disk ends up in our internal COM in-memory representation having 2646 x 2646 units!&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;Coordinates&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;“HiMetric” scaling must have been not difficult enough for some of &lt;i&gt;&lt;strong&gt;them&lt;/strong&gt;&lt;/i&gt;, someone decided to move the coordinate-origin (0, 0-point) from the top-left corner of the COM-Image source to the lower-left corner (maybe to spice things up ;-)&lt;/p&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;Some manual testing&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;Let’s have a look at my original source image:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Testbild" border="0" alt="Testbild" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbXh6-JudtI/AAAAAAAAHZE/wJ4X8QsfFNU/Testbild%5B3%5D.jpg?imgmax=800" width="100" height="100" /&gt;&lt;/p&gt;

&lt;p&gt;Let us now assume, that we already have a valid handle to a device context to render our image on. The following call to render() &lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; oIPic
   = .Render(m.hDC, 0, 0, 100, 100, 0, 0, .&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, .&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;)
&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;would then produce the following output:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ComTestbild" border="0" alt="ComTestbild" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXh7QZRTdI/AAAAAAAAHZI/zFyIYET9Y7U/ComTestbild%5B3%5D.jpg?imgmax=800" width="100" height="100" /&gt;&lt;/p&gt;

&lt;p&gt;The origin of the COM coordinate system is somehow rotated in memory by 180° After some wild guesses one may find out that the following code produces the expected output: 
  &lt;br /&gt;

  &lt;br /&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; oIPic 

        &lt;br /&gt;&amp;#160;&amp;#160; = .Render(m.hDC ,; 

        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160; 0&amp;#160;&amp;#160; ,&amp;#160;&amp;#160; 100 ,&amp;#160;&amp;#160; 100&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,; 

        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0, &lt;font color="#0000ff"&gt;.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, .&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, .&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;&lt;font color="#ff0000"&gt;*-1&lt;/font&gt;&lt;font color="#000000"&gt;,;&lt;/font&gt;&lt;/span&gt; 

        &lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NULL&lt;/span&gt;) 

        &lt;br /&gt;&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;We have to understand what’s going on internally to see things a little bit clearer! The image loaded into memory is nothing more than a memory block filled with pixel related color values. This memory block can be abstractly treated as a rectangle. During rendering, which internally is the process of transferring data from the source rectangle to the destination rectangle, our COM object uses different values which are passed in through parameter #6 to #9 (the [source] parameters) to control the process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The origin of the source rectangle, one could name “copy starting point”. &lt;/li&gt;

  &lt;li&gt;The width and the height of the source rectangle to support cases when we do not want to render out a source image completely! &lt;/li&gt;

  &lt;li&gt;The direction in which to “read-out” the source data (bytes). &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is important to know, that the very first source pixel (the one that is the origin of the source rectangle) always gets rendered out at position 1,1 of the target rectangle. The second source pixel (what exact pixel will be copied next depends on the read-out direction) gets renders out at position 2,1 and so on. Thus, by selecting the appropriate origin to start from, it is possible to render a mirrored image into the destination device context.&lt;/p&gt;

&lt;h5&gt;&lt;font color="#000080"&gt;The xSrc und ySrc Parameter&lt;/font&gt;&lt;/h5&gt;

&lt;p&gt;The 6th and 7th parameter value of the &lt;strong&gt;&lt;em&gt;render()&lt;/em&gt;&lt;/strong&gt; function determine where the starting point of the copy process within the image source lays. One of the 4 corners of the source rectangle will become the origin. Below, we can see the memory based COM – image with a given source rectangle (the red frame). In this case the source rectangle’s size matches the whole image. The coordinate pairs of all four valid xSrc/ySrc – combinations are also depicted. The values shown reflect HiMetric scaling (a 100x100 pixels square on a 96 dpi device context)&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Nullpunkte" border="0" alt="Nullpunkte" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbXh7uzWFKI/AAAAAAAAHZM/81jT8wJlb7Q/Nullpunkte%5B6%5D.png?imgmax=800" width="291" height="214" /&gt;&lt;/p&gt;

&lt;p&gt;Through determining the origin of where to start reading out the source pixel values, we also determine the direction of read out indirectly! The direction of read out is established by the sign of the last two input parameters (&lt;em&gt;cxSrc&lt;/em&gt; and &lt;em&gt;cySrc&lt;/em&gt;) of the &lt;em&gt;render()&lt;/em&gt; method. (Don’t be surprised, just take it as read :-)&lt;/p&gt;

&lt;h5&gt;&lt;b&gt;&lt;font color="#000080"&gt;The cxSrc und cySrc Parameter&lt;/font&gt;&lt;/b&gt;&lt;/h5&gt;

&lt;p&gt;On the one hand, the 8th und 9th parameter determine width and height of the source rectangle, on the other hand they also determine the read direction during the rendering data transfer. The absolute values&amp;#160; &lt;span style="color: #0000ff"&gt;ABS&lt;/span&gt;(cxSrc) and &lt;span style="color: #0000ff"&gt;ABS&lt;/span&gt;(cySrc) define the width and height of the source rectangle, the sign of both values (+/-) the direction of read out. The picture below might help to shed some light on that:&amp;#160; &lt;/p&gt;

&lt;pre&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Ausleserichtung" border="0" alt="Ausleserichtung" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TbXh7--rglI/AAAAAAAAHZQ/ZTM1mCdIAC0/Ausleserichtung%5B1%5D.png?imgmax=800" width="557" height="153" /&gt;&lt;/pre&gt;

&lt;p&gt;The [source] coordinate parameters of the &lt;font color="#0000ff" size="2" face="Courier New"&gt;&lt;strong&gt;oIPic.Render()&lt;/strong&gt;&lt;/font&gt; call (see above) tell us: “Position the ‘copy from – origin’ at x = 0, y=2646 (see 2nd pic from the left within the image just above) and start the line-wise transfer from there. Each transferred line in &lt;strong&gt;&lt;font color="#ff0000"&gt;–&amp;gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;x&lt;/font&gt;&lt;/strong&gt; direction with a pixel-width defined by &lt;strong&gt;ABS(&lt;i&gt;HiMetric-Units&lt;/i&gt;)&lt;/strong&gt; of the &lt;strong&gt;&lt;em&gt;cxSrc&lt;/em&gt;&lt;/strong&gt; parameter. Proceed with next line in &lt;strong&gt;&lt;font color="#ff0000"&gt;-&lt;/font&gt;&lt;font color="#ff0000"&gt;y&lt;/font&gt;&lt;/strong&gt; direction. Loop until as much pixel lines were transferred as defined in &lt;strong&gt;ABS(&lt;i&gt;HiMetric-Units&lt;/i&gt;)&lt;/strong&gt; of the &lt;strong&gt;&lt;em&gt;cySrc&lt;/em&gt;&lt;/strong&gt; parameter. Now, we are able to mirror any image during rendering along both axis:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Spiegelungen" border="0" alt="Spiegelungen" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbXh8XCAsBI/AAAAAAAAHZU/WoEcWhmDLI4/Spiegelungen%5B1%5D.png?imgmax=800" width="361" height="357" /&gt;&lt;/p&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;Solving the Hourglass Problem&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;&lt;font size="3"&gt;There is another weird VFP behavior most of us already encountered in the past: the “hourglass problem”! Sometimes, we want VFP to refresh some form content which results in a cascading refresh. Controls that have to be refreshed sometimes have images assigned to their .Picture properties. Such image references always point to a file on the disk (or the app/exe which makes no difference). In other words, VFP has to access the disk in one way or another. If these disk accesses last more than a few milliseconds, then the operating system changes the mouse cursor to an hourglass! And sometimes VFP isn’t aware of that change. As long as the user doesn’t touch the mouse, VFP doesn’t refresh (reset) the mouse cursor symbol. Thus, for the user it seems like VFP still is busy. With the help of VFP’s &lt;strong&gt;&lt;em&gt;LOADPICTURE()&lt;/em&gt;&lt;/strong&gt; function (and the newly introduced &lt;strong&gt;&lt;em&gt;.PictureVal&lt;/em&gt;&lt;/strong&gt; property) it is now possible to avoid a wrong hourglass cursor display. Using code like the following one&lt;/font&gt;&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;AddObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oImage&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;IMAGE&lt;/span&gt;&amp;quot;) 
oPicture = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(GETPIC()) 
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oPicture 
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;Visible&lt;/span&gt; = .T.&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;&lt;font size="3"&gt;never ever again will display the wrong hourglass mouse cursor, because there no longer is any disk access! Before you now shout: “That’s COOL!”, read on; there is a severe drawback caused by a VFP bug!&lt;/font&gt;&lt;/p&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;Solving the PictureVal Bug&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;&lt;font size="3"&gt;This is a short excerpt taken from one of my elder VFP projects. First, the INIT() of one of my VFP Image classes is the place where I load the COM-Images&lt;/font&gt;&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lcPicture &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&lt;font color="#000000"&gt;   &lt;/font&gt;IF&lt;/span&gt; .EnableMultiStatePictures
	&lt;span style="color: #008000"&gt;*\\ reassure we have pictures to display &lt;/span&gt;
	lcPicture = &lt;span style="color: #0000ff"&gt;JUSTFNAME&lt;/span&gt;(.&lt;span style="color: #0000ff"&gt;Picture&lt;/span&gt;)
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(.PictureEnabled)
		.PictureEnabled = m.lcPicture
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(.PictureDisabled)
		.PictureDisabled = m.lcPicture
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(.PictureMouseOver)
		.PictureMouseOver = m.lcPicture
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(.PicturePressed)
		.PicturePressed = .PictureMouseOver
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(.PictureSelected)
		.PictureSelected = .PicturePressed
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ set basic state&lt;/span&gt;
	.ImageState = &lt;span style="color: #0000ff"&gt;IIF&lt;/span&gt;(.&lt;span style="color: #0000ff"&gt;Enabled&lt;/span&gt;, 1, 0)
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;   ENDIF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&lt;font color="#000000"&gt;   &lt;/font&gt;IF&lt;/span&gt; .EnableComPictureHandling
	&lt;span style="color: #008000"&gt;*\\ The reason for using COM instances of JPG-images in conjunction with Image.PictureVal properties&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\	is, that we no longer have disk access. Thus, the hourglas mouse cursor never appears when&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\	clicking or hovering in/out on an image (refreshing it). BUT we have to be very carefully NOT&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\	to assign the same COM interface to THIS.PictureVal _twice_in_a_row!!! Doing so, will result in&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\	VFP looses the COM-reference to that picture object randomly. For more details see&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\	THIS._old_oPictureDisabled_Access() method.&lt;/span&gt;
	.PictureEnabled = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOCFILE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;JUSTSTEM&lt;/span&gt;(.PictureEnabled),&lt;span style="color: #0000ff"&gt;JUSTEXT&lt;/span&gt;(.PictureEnabled),&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Locate image&lt;/span&gt;&amp;quot;))
	.PictureDisabled = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOCFILE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;JUSTSTEM&lt;/span&gt;(.PictureDisabled),&lt;span style="color: #0000ff"&gt;JUSTEXT&lt;/span&gt;(.PictureDisabled),&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Locate image&lt;/span&gt;&amp;quot;))
	.PictureMouseOver = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOCFILE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;JUSTSTEM&lt;/span&gt;(.PictureMouseOver),&lt;span style="color: #0000ff"&gt;JUSTEXT&lt;/span&gt;(.PictureMouseOver),&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Locate image&lt;/span&gt;&amp;quot;))
	.PicturePressed = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOCFILE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;JUSTSTEM&lt;/span&gt;(.PicturePressed),&lt;span style="color: #0000ff"&gt;JUSTEXT&lt;/span&gt;(.PicturePressed),&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Locate image&lt;/span&gt;&amp;quot;))
	.PictureSelected = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOCFILE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;JUSTSTEM&lt;/span&gt;(.PictureSelected),&lt;span style="color: #0000ff"&gt;JUSTEXT&lt;/span&gt;(.PictureSelected),&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Locate image&lt;/span&gt;&amp;quot;))
&lt;span style="color: #0000ff"&gt;&lt;font color="#000000"&gt;   &lt;/font&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;This is the content of the _old_oPictureDisabled_Access() method:&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #008000"&gt;*\\	It took me hours to find out what was going wrong! &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	These are my findings:&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	Assigning an interface reference of a COM-ImageObject &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	(created using VFP's LOADPICTURE() function) to &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	This.PictureVal property will work properly as long as &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	you do not *reassign* the same reference to .PictureVal again!!&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	Reassignment may work many times flawlessly, but (and that's for sure!) &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	eventually VFP looses its internal COM reference completely &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	after a reassignment! Apart from the fact that reassignments&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	aren't necessary at all (coz the picture already is shown), &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	they might occur, especially if one had coded COM-image reference &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	assignments to .PictureVal properties all over the place generously &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\	without knowing about this issue!&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;pre&gt;&lt;span style="color: #008000"&gt;*\\ My solution now is to use a new integer property &amp;lt;.ImageState&amp;gt; &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ that may hold one of the following values: 0=Disabled; 1=Enabled; &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 2=MouseOver; 4=Pressed; 8=Selected (a bit field). This property tells &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ me exactly which COM-ImageObject reference is assigned to &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ the .PictureVal property at any moment. In all places where I &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ have to assign another COM-Image reference, I carefully test &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ against the &amp;lt;.ImageState&amp;gt; property value before assigning the &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ new reference to eliminate reassignments completely!&lt;/span&gt;
&lt;/pre&gt;&lt;/font&gt;&lt;/strong&gt;&lt;p&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;The bottom line is: &lt;strong&gt;&lt;font color="#ff0000"&gt;THIS IS A VFP BUG&lt;/font&gt;&lt;/strong&gt;! &lt;br /&gt;But, luckily, a solution (a workaround) is pretty easy to implement. In fact, it may even help to speed up your executable/application. &lt;/font&gt;&lt;font face="Calibri"&gt;I have to stress it here once more: The buggy behavior does only appear if one is reassigning the same COM interface reference to an image-object’s PictureVal property more than once in a row! &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="3" face="Calibri"&gt;The the first loop of following  code works flawlessly:&lt;/font&gt;&amp;#160;&lt;/p&gt;&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnLoop &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, oComPic1 &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; olePic
oComPic1 = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETFILE&lt;/span&gt;())
oComPic2 = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETFILE&lt;/span&gt;())
&lt;span style="color: #0000ff"&gt;TRY&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Addobject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oImage&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;IMAGE&lt;/span&gt;&amp;quot;)
&lt;span style="color: #0000ff"&gt;CATCH&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FINALLY&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;Visible&lt;/span&gt; = .T.
ENDTRY
&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; lnLoop = 1 &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; 100
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oComPic1
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oComPic2
&lt;span style="color: #0000ff"&gt;NEXT&lt;/span&gt; 
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #008000"&gt;*\\ whereas the next loop will break somewhere down the road:&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; lnLoop = 1 &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; 100
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oComPic1
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oComPic1
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oComPic2
	&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.oImage.&lt;span style="color: #0000ff"&gt;PictureVal&lt;/span&gt; = m.oComPic2
&lt;span style="color: #0000ff"&gt;NEXT&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;&lt;font size="3" face="Calibri"&gt;You will receive the following error, leaving you with a superficially valid COM object!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="1" border="0" alt="1" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbbQyxLwMWI/AAAAAAAAHaY/P7oqVlhTyFk/1%5B6%5D.png?imgmax=800" width="476" height="159" /&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000" size="3" face="Calibri"&gt;&lt;strong&gt;Believe me, that’s no fun to debug! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Trauriges Smiley" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbbQzLf6g0I/AAAAAAAAHac/FMJQH88HHvg/wlEmoticon-sadsmile%5B2%5D.png?imgmax=800" /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;ToDOs&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;&lt;font size="3"&gt;Now, we really have some work to do before displaying our COM images directly:&lt;/font&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;font size="3"&gt;We have to get a device context handle &lt;/font&gt;&lt;/li&gt;

  &lt;li&gt;&lt;font size="3"&gt;We have to get our current display resolution (DPI) &lt;/font&gt;&lt;/li&gt;

  &lt;li&gt;&lt;font size="3"&gt;We have to know all about “dots per inch” and &lt;i&gt;HiMetric&lt;/i&gt; units &lt;/font&gt;&lt;/li&gt;

  &lt;li&gt;&lt;font size="3"&gt;We have to convert pixels to &lt;i&gt;HiMetric&lt;/i&gt; units and vice versa (before we can use them) &lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;font color="#000080" size="3"&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="4"&gt;&lt;strong&gt;The rest of this post is the content of my &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbX_M2WsnpI/AAAAAAAAHaU/l-fMgq3n4XE/OffSiteLink%5B2%5D.gif?imgmax=800" width="22" height="14" /&gt;&amp;#160;&lt;/strong&gt;&lt;/font&gt;&lt;a title="http://vfpx.codeplex.com/wikipage?title=VFP%209%20SP2%20Help%20File&amp;amp;referringTitle=Home" href="http://vfpx.codeplex.com/wikipage?title=VFP%209%20SP2%20Help%20File&amp;amp;referringTitle=Home" rel="nofollow" target="_blank"&gt;&lt;font color="#9b00d3" size="4"&gt;&lt;strong&gt;VFPX Help file project&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;font color="#0000ff" size="4"&gt;&lt;strong&gt; contribution.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;

&lt;h2&gt;LOADPICTURE([cFileName])&lt;/h2&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Parameters&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;cFileName 
      &lt;br /&gt;&lt;/i&gt;&lt;/b&gt;Specifies the image file on disk for which an object is created. The following image types are supported: 

  &lt;table border="1" cellspacing="0" cellpadding="5" width="638"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td style="background-color: #6633ff; color: #ffffff" width="325"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Image Type Groups&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="311"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Filename Extensions&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="331"&gt;
          &lt;p&gt;bitmaps&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="314"&gt;
          &lt;p&gt;.bmp, .jpg, .jpeg, .jpe, .jfif, .gif, .giff, .gfa&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="332"&gt;
          &lt;p&gt;icons&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="316"&gt;
          &lt;p&gt;.ico&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="331"&gt;
          &lt;p&gt;windows metafiles&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="317"&gt;
          &lt;p&gt;.wmf&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="331"&gt;
          &lt;p&gt;windows enhanced metafiles&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="317"&gt;
          &lt;p&gt;.emf&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="331"&gt;
          &lt;p&gt;cursor&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="317"&gt;
          &lt;p&gt;.cur&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
  &lt;strong&gt;Table 1 Supported Image Types&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The following restrictions (tested with VFP 9 SP2 and OlePro32.dll Version 6.0.6002.18005) exist: 
  &lt;table border="1" cellspacing="0" cellpadding="5" width="649"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td style="background-color: #6633ff; color: #ffffff" width="284"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Image Type Groups&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="363"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Restrictions &amp;amp; Issues&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="285"&gt;
          &lt;p&gt;bitmaps&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="363"&gt;
          &lt;p&gt;Loading &lt;b&gt;.tif&lt;/b&gt; and &lt;b&gt;.png&lt;/b&gt; formats will cause an OLE error.&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="285"&gt;
          &lt;p&gt;icons&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="363"&gt;
          &lt;p&gt;Icons are allowed with sizes up to 128x128 and must not have more than 256 colors. Even if there is more than one icon stored in the icon file, always only the smallest icon gets displayed. The icon file may contain much more icons - even with more colors and larger sizes - as long as there is at least one that complies with the rules above, then no exception is thrown.&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td valign="top" width="285"&gt;
          &lt;p&gt;cursor&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="363"&gt;
          &lt;p&gt;Cursor files must not have more than 1K of file size, otherwise an OLE error is generated. Cursor files containing 16 color cursors can be loaded flawlessly, but only monochrome output is supported. Loading an animated cursor (.ani) causes an OLE error to be raised.&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table 2 Known Limitations&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;Null Picture Support&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;If &lt;i&gt;cFileName&lt;/i&gt; is omitted, an uninitialized “&lt;b&gt;null picture”&lt;/b&gt; object is returned. &lt;/p&gt;

&lt;p&gt;You can include GETPICT( ) as &lt;i&gt;cFileName&lt;/i&gt; to display the Open dialog from which you can choose a bitmap file.&lt;b&gt; 
    &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Return Value&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;VFP’s &lt;i&gt;LOADPICTURE()&lt;/i&gt; function returns a &lt;b&gt;&lt;i&gt;Picture&lt;/i&gt;&lt;/b&gt; type COM object reference that can be assigned to ActiveX controls and VFP’s Image object’s &lt;i&gt;PictureVal&lt;/i&gt; property. However, the real primary interface &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; only can be retrieved using code like this: 

  &lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;oIPicture = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETPICT&lt;/span&gt;()), &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;iPicture&lt;/span&gt;&amp;quot;)
&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Remarks&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;Picture objects provide a language-neutral abstraction for bitmaps, icons, and metafiles. As with the standard font object, the system provides a standard implementation of the picture object. Its primary interfaces are &lt;strong&gt;&lt;i&gt;i&lt;/i&gt;&lt;/strong&gt;&lt;strong&gt;&lt;i&gt;Picture&lt;/i&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;i&gt;iPictureDisp&lt;/i&gt;&lt;/strong&gt;. A picture object is created with &lt;strong&gt;&lt;i&gt;OleCreatePictureIndirect&lt;/i&gt;&lt;/strong&gt; and supports both the &lt;strong&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/strong&gt; and the &lt;strong&gt;&lt;i&gt;iPctureDisp&lt;/i&gt;&lt;/strong&gt; interfaces. The OLE-provided picture object implements the complete semantics of the &lt;strong&gt;&lt;i&gt;iPcture&lt;/i&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;i&gt;iPictureDisp&lt;/i&gt;&lt;/strong&gt; interfaces. In other words, there’s no need to use another interface than &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt;!&lt;/p&gt;

&lt;p&gt;VFP’s &lt;i&gt;LOADPICTURE()&lt;/i&gt; function internally wraps the &lt;b&gt;&lt;i&gt;OleCreatePictureIndirect()&lt;/i&gt;&lt;/b&gt; function implemented in &lt;b&gt;&lt;i&gt;OleAut32.dll&lt;/i&gt;&lt;/b&gt;. Thus, all you can read about that function (above and online) is also true for VFP’s &lt;i&gt;LOADPICTURE()&lt;/i&gt; function. &lt;i&gt;LOADPICTURE ()&lt;/i&gt; was added to VFP’s vocabulary to make it easier to load images with COM interfaces that many presentation properties of ActiveX controls require for their settings. For example, the &lt;i&gt;ActiveX Outline control&lt;/i&gt; has a &lt;i&gt;PictureOpen&lt;/i&gt; property that requires a COM object image reference for its setting.&lt;/p&gt;

&lt;p&gt;The COM object returned by VFP’s &lt;i&gt;LOADPICTURE()&lt;/i&gt; function hides its primary interface &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt;. In contrast to the reference&lt;b&gt;&lt;i&gt; &lt;/i&gt;&lt;/b&gt;returnd by VFP’s &lt;i&gt;LOADPICTURE()&lt;/i&gt;, the OLE-image’s primary &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; interface is the only fully functional one. In other words, only &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; can be used in VFP programms without generating any OLE errors. Because &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; is a superset of &lt;b&gt;&lt;i&gt;Picture&lt;/i&gt;&lt;/b&gt; it may be, better, &lt;i&gt;it should be&lt;/i&gt; used everywhere instead of the one returnd by &lt;i&gt;LOADPICTURE()&lt;/i&gt; ! &lt;b&gt;Example #1&lt;/b&gt; in the examples section below proves that it makes no difference which OLE image interface gets assigned to a VFP &lt;i&gt;oIMAGE.PICTUREVAL&lt;/i&gt; property. &lt;/p&gt;

&lt;p&gt;The IID of the &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; interface is defined as “{7BF80980-BF32-101A-8BBB-00AA00300CAB}”. Thus, the following two lines of code both create a &lt;b&gt;&lt;i&gt;null picture OLE image object&lt;/i&gt;&lt;/b&gt;: 

  &lt;br /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;oIPicture1 = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETPICT&lt;/span&gt;()), &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;iPicture&lt;/span&gt;&amp;quot;)
oIPicture2 = &lt;span style="color: #0000ff"&gt;CREATEOBJECTEX&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;StdPicture&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;{7BF80980-BF32-101A-8BBB-00AA00300CAB}&lt;/span&gt;&amp;quot;)&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;
    &lt;br /&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Interface Members&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;The following table summarizes the PEMs (with prefix P: = property, M: = method) of the &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; interface. ‘Green’ PEMs are read/writable, all others are readonly. 

  &lt;table border="1" cellspacing="0" cellpadding="5" width="650"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td style="background-color: #6633ff; color: #ffffff" width="201"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;PEM&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="242"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Used for&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="205"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;ValueType&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: Attributes&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current set of the picture's bit attributes.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;DWORD (int)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: CurDC&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current device context into which this picture is selected.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;HDC (long)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: Handle&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;Handle to the picture managed within this picture object.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;OLE_Handle (int)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: Height&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current height of the picture in the picture object.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;OLE_XSIZE_HIMETRIC (long)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: hPal&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current palette of the picture (if any).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;OLE_Handle (int)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: KeepOriginalFormat&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current value of the picture object's &lt;i&gt;KeepOriginalFormat&lt;/i&gt; property.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;Bool&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: Type&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current type of the picture.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;Short (int)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;P: Width&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;The current width of the picture in the picture object.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;
          &lt;p&gt;OLE_XSIZE_HIMETRIC (long)&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;M: PictureChanged&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;Notifies the picture object that its picture resource changed.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;&amp;#160;&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;M: Render&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;Draws the specified portion of the picture onto the specified device context, positioned at the specified location.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;&amp;#160;&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;M: SaveAS File&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="242"&gt;
          &lt;p&gt;Saves the picture's data into a stream in the same format that it would save itself into a file.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="205"&gt;&amp;#160;&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="201"&gt;
          &lt;p&gt;&lt;b&gt;M: SelectPicture&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="266"&gt;
          &lt;p&gt;Selects a bitmap picture into a given device context, returning the device context in which the picture was previously selected as well as the picture's handle.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="263"&gt;&amp;#160;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table 3 iPicture Interface Members&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;i&gt;Attributes&lt;/i&gt; property is said to hold the picture’s bit attributes. Actually, there are only two, which can be set alone, or additive. The following table lists both possible values: 

  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td style="background-color: #6633ff; color: #ffffff" width="168"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Constant &lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="378"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Description&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="57"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Value&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="168"&gt;
          &lt;p align="center"&gt;&lt;b&gt;PICTURE_SCALABLE&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="378"&gt;
          &lt;p&gt;The picture object is scalable, such that it can be redrawn with a different size than was used to create the picture originally. Metafile-based pictures are considered scalable; icon and bitmap pictures, while they can be scaled, do not express this attribute because both involve bitmap stretching instead of true scaling.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="57"&gt;
          &lt;p&gt;1&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="168"&gt;
          &lt;p&gt;&lt;b&gt;PICTURE_TRANSPARENT&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="378"&gt;
          &lt;p&gt;The picture object contains an image that has transparent areas, such that drawing the picture will not necessarily fill in all the spaces in the rectangle it occupies. Metafile and icon pictures have this attribute; bitmap pictures do not.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td width="57"&gt;
          &lt;p&gt;2&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table 4 PictureAttributes Enumeration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The following table lists all possible values of the &lt;i&gt;iPicture.Type&lt;/i&gt; property: 

  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td style="background-color: #6633ff; color: #ffffff" width="145"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Constant &lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="306"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Description&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="151"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Value&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="145"&gt;
          &lt;p align="center"&gt;&lt;b&gt;PICTYPE_UNINITIALIZED&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="306"&gt;
          &lt;p&gt;The picture object is currently uninitialized. &lt;b&gt;This value will never be returned within VFP&lt;/b&gt;!&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="151"&gt;
          &lt;p&gt;-1&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="145"&gt;
          &lt;p&gt;&lt;b&gt;PICTYPE_NONE&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="306"&gt;
          &lt;p&gt;A new picture object is to be created without an initialized state. &lt;b&gt;This value is returned from VFP if LoadPicture() is used without a parameter&lt;/b&gt;.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="151"&gt;
          &lt;p&gt;0&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="145"&gt;
          &lt;p&gt;&lt;b&gt;PICTYPE_BITMAP&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="306"&gt;
          &lt;p&gt;The picture type is a bitmap.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="151"&gt;
          &lt;p&gt;1&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="145"&gt;
          &lt;p&gt;&lt;b&gt;PICTYPE_METAFILE&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="306"&gt;
          &lt;p&gt;The picture type is a metafile.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="151"&gt;
          &lt;p&gt;2&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="145"&gt;
          &lt;p&gt;&lt;b&gt;PICTYPE_ICON&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="306"&gt;
          &lt;p&gt;The picture type is an icon.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="151"&gt;
          &lt;p&gt;3&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="145"&gt;
          &lt;p&gt;&lt;b&gt;PICTYPE_ENHMETAFILE&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="306"&gt;
          &lt;p&gt;The picture type is an enhanced metafile.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="151"&gt;
          &lt;p&gt;4&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table 5 Type Property Values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most interesting method of the COM image object’s &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; interface ist &lt;b&gt;&lt;i&gt;render()&lt;/i&gt;&lt;/b&gt; which also works flawlessly only when called on the &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; interface. The following table summarises the parameters of the &lt;b&gt;&lt;i&gt;render()&lt;/i&gt;&lt;/b&gt; method: 

  &lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td style="background-color: #6633ff; color: #ffffff" width="95"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Parameter&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="416"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Used for&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td style="background-color: #6633ff; color: #ffffff" width="90"&gt;
          &lt;p align="center"&gt;&lt;b&gt;&lt;font size="2"&gt;Scale Unit&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p align="left"&gt;&lt;b&gt;hdc&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p align="left"&gt;A handle of the device context on which to render the image.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;------&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;x&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The horizontal coordinate in &lt;em&gt;hdc&lt;/em&gt; at which to place the rendered image (X-position of upper left corner of output rectangle).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;pixel&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;y&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The vertical coordinate in &lt;em&gt;hdc&lt;/em&gt; at which to place the rendered image (X-position of upper left corner of output rectangle).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;pixel&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;cx&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The horizontal dimension (width) of the destination rectangle (with of output rectangle).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;pixel&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;cy&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The vertical dimension (height) of the destination rectangle (height of output rectangle).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;pixel&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;xSrc&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The horizontal offset in the source picture from which to start copying.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;HiMetric&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;ySrc&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The vertical offset in the source picture from which to start copying.&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;HiMetric&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;cxSrc&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The horizontal extent to copy from the source picture (width of image source’s clipping region AND direction of readout).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;HiMetric&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;cySrc&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;The vertical extent to copy from the source picture (height of image source’s clipping region AND direction of readout).&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;HiMetric&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td width="95"&gt;
          &lt;p&gt;&lt;b&gt;lprcWBounds&lt;/b&gt;&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="416"&gt;
          &lt;p&gt;If &lt;i&gt;hdc&lt;/i&gt; is a metafile device context, the lprcWBounds parameter points to a &lt;i&gt;RECTL&lt;/i&gt; structure specifying the bounding rectangle in the underlying metafile. The rectangle structure contains the window extent and window origin. These values are useful for drawing metafiles. The rectangle indicated by lprcBounds is nested inside this lprcWBounds rectangle; they are in the same coordinate space. If hdcDraw is not a metafile device context, lprcWBounds will be NULL. If hdcDraw is a metafile device context, lprcWBounds cannot be NULL!&lt;/p&gt;
        &lt;/td&gt;

        &lt;td valign="top" width="90"&gt;
          &lt;p&gt;------&lt;/p&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table 6 Render() Parameter Galore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The method returns standard values like E_FAIL, E_INVALIDARG and E_OUTOFMEMORY, as well as S_OK, E_POINTER and CTL_E_INVALIDPROPERTYVALUE. These values are described on &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TbXq1iLBkEI/AAAAAAAAHZY/Ae_4r_bk0SU/OffSiteLink%5B6%5D.gif?imgmax=800" width="11" height="7" /&gt;&amp;#160;&lt;a title="http://msdn.microsoft.com/de-de/library/ms644512(v=VS.100).aspx" href="http://msdn.microsoft.com/de-de/library/ms644512(v=VS.100).aspx" target="_blank"&gt;MSDN&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Applications&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;The render function has plenty of parameters&lt;/b&gt;. Some of them passing in pixel values, others HiMetric values. &lt;b&gt;Example #3&lt;/b&gt; has some useful conversions as well as other supporting functions and definitions. To figure out how &lt;b&gt;&lt;i&gt;render()&lt;/i&gt;&lt;/b&gt; works try the VFP code below; type it in line by line into VFP’s command window:&lt;/p&gt;

&lt;pre&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;span style="color: #008000"&gt;* locate an image with round about 100 x 100 pixels &lt;/span&gt;
goPic = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETPICT&lt;/span&gt;()) 
gIP = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(m.goPic, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;iPicture&lt;/span&gt;&amp;quot;) 
goForm = &lt;span style="color: #0000ff"&gt;CREATEOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Form&lt;/span&gt;&amp;quot;) 
goForm.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;() 
&lt;span style="color: #008000"&gt;* declare access to the _client_area_ of a window &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; GetDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt; 
&lt;span style="color: #008000"&gt;* hDC should be &amp;lt;&amp;gt; 0 (otherwise that's an error)! &lt;/span&gt;
hDC = GetDC(goForm.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;) 
&lt;span style="color: #008000"&gt;* render your image directly onto form's client area &lt;/span&gt;
gIP.Render(m.hDC,0,0,100,100,0,gIP.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;,gIP.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;,- gIP.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;) 
&lt;span style="color: #008000"&gt;* declare release function &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; ReleaseDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; hDC 
&lt;span style="color: #008000"&gt;* next line should print 1 on the form's background &amp;gt;&amp;gt; &amp;quot;Okay&amp;quot; &lt;/span&gt;
? ReleaseDC(m.goForm.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, m.hDC) 
&lt;span style="color: #008000"&gt;* declare access to the _whole_ window &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; GetWindowDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt; 
&lt;span style="color: #008000"&gt;* hDC now references form's caption an border areas as well! &lt;/span&gt;
hDC = GetWindowDC(goForm.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;) 
&lt;span style="color: #008000"&gt;* render out partially overwriting form's border and caption &lt;/span&gt;
gIP.Render(m.hDC,0,0,100,100,0,gIP.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;,gIP.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;,- gIP.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;) 
&lt;span style="color: #008000"&gt;* never forget to free an allocated device context &lt;/span&gt;
? ReleaseDC(m.goForm.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, m.hDC)
&lt;/strong&gt;&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Direct input into VFP’s command window&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;iPicture.Render()&lt;/i&gt;&lt;/b&gt; qualifies for painting on otherwise unreachable form regions, like titlebar or borders. Another interesting application for direct rendering stems from the fact that no VFP object reference is necessary for painting. The &lt;b&gt;&lt;i&gt;render()&lt;/i&gt;&lt;/b&gt; method solely uses a common windows handle. Thus, one can render on any known device context.&lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Drawback&lt;/font&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;iPicture.Render()&lt;/i&gt;&lt;/b&gt; does its work outside of - and unnoticed by – the VFP engine itself. That’s why VFP has no idea of what was painted “between the lines”. Each time VFP refreshes the form’s area (we’ve just rendered our picture onto), will clear out our image. To make rendered output persistent measures have to be taken against VFP wiping it out! &lt;/p&gt;

&lt;h3&gt;&lt;font color="#000080"&gt;Examples&lt;/font&gt;&lt;/h3&gt;

&lt;h4&gt;Example #1&lt;/h4&gt;

&lt;p&gt;The following example shows that both interfaces (&lt;b&gt;&lt;i&gt;Picture&lt;/i&gt;&lt;/b&gt; and &lt;b&gt;&lt;i&gt;IPicture&lt;/i&gt;&lt;/b&gt;) of a COM image instance can be assigned to VFP’s &lt;b&gt;&lt;i&gt;Image.PictureVal&lt;/i&gt;&lt;/b&gt; property:&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #0000ff"&gt;PUBLIC&lt;/span&gt; goPic &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Object, goIPic &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Object
goPic = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETPICT&lt;/span&gt;()) 
goIPic = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(m.goPic, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;iPicture&lt;/span&gt;&amp;quot;) 
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;AddObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oPic1&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;IMAGE&lt;/span&gt;&amp;quot;) 
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;AddObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oPic2&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;IMAGE&lt;/span&gt;&amp;quot;) 
&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.oPic1 
	.&lt;span style="color: #0000ff"&gt;VISIBLE&lt;/span&gt; = .T.
	.&lt;span style="color: #0000ff"&gt;PICTUREVAL&lt;/span&gt; = m.goPic &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; &amp;quot;Picture&amp;quot;-Interface &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.oPic2
	.&lt;span style="color: #0000ff"&gt;LEFT&lt;/span&gt; = 110 
	.&lt;span style="color: #0000ff"&gt;VISIBLE&lt;/span&gt; = .T.
	.&lt;span style="color: #0000ff"&gt;PICTUREVAL&lt;/span&gt; = m.goIPic &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; &amp;quot;IPicture&amp;quot;-Interface&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;HIDE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOWS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Press any key...&lt;/span&gt;&amp;quot; 
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;RemoveObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oPic1&lt;/span&gt;&amp;quot;) 
&lt;span style="color: #0000ff"&gt;_SCREEN&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;RemoveObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;oPic2&lt;/span&gt;&amp;quot;) 
&lt;span style="color: #0000ff"&gt;STORE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; goPic, goIPic 
&lt;span style="color: #0000ff"&gt;CLEAR&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;SHOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOWS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;h4&gt;Example #2&lt;/h4&gt;

&lt;p&gt;The following example shows how to query the &lt;b&gt;&lt;i&gt;iPicture&lt;/i&gt;&lt;/b&gt; interface of a COM image instance. Intentionally, there are no Try…Catch…Endtry sections in this demo code, so that OLE errors may occur. You have to run the code snippet multiple times with different image types to see them.&lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;goPic = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;GETPICT&lt;/span&gt;()) 
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.goPic) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
	goIPic = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(m.goPic, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;iPicture&lt;/span&gt;&amp;quot;)
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.goIPic) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot; 
		&lt;span style="color: #0000ff"&gt;CLEAR&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; just some informal output: &lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; m.goIPic 
			? 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Properties of 'IPicture'-Interface:&lt;/span&gt;&amp;quot; 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Attributes&lt;/span&gt;&amp;quot; ,.&lt;span style="color: #0000ff"&gt;Attributes&lt;/span&gt; 
			&lt;span style="color: #008000"&gt;*\\ next line will fail if an ICOn loaded &lt;/span&gt;
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;CurDC&lt;/span&gt;&amp;quot; ,.CurDC 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Handle&lt;/span&gt;&amp;quot; ,.Handle 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Height&lt;/span&gt;&amp;quot; ,.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt; 
			&lt;span style="color: #008000"&gt;*\\ next line will fail if an ICOn loaded &lt;/span&gt;
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;hPal&lt;/span&gt;&amp;quot; ,.hPal 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;KeepOriginalFormat&lt;/span&gt;&amp;quot;,.KeepOriginalFormat 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Type&lt;/span&gt;&amp;quot; ,.&lt;span style="color: #0000ff"&gt;Type&lt;/span&gt; 
			? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Width&lt;/span&gt;&amp;quot; ,.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt; 
			? 
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt; 
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt; &lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;h4&gt;&lt;a name="_Hlk291204454"&gt;&lt;font color="#000000"&gt;Example #3&lt;/font&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;a name="_Hlk291204454"&gt;&lt;/a&gt;

&lt;p&gt;&lt;a name="_Hlk291204454"&gt;&lt;b&gt;&lt;/b&gt;&lt;/a&gt;The following code is a collection of supporting functions and declarations that come in handy while programming OLE image objects. &lt;/p&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;span style="color: #008000"&gt;* Supporting Functions &amp;amp; DEFINEs&lt;/span&gt;
#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; INCH2MILLIMETER 25.4 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; 1 Inch = 25.4 millimeters&lt;/span&gt;
#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; INCH2HIMETRICS (INCH2MILLIMETER &lt;span style="color: #008000"&gt;* 100) &amp;amp;&amp;amp; 1 HIMETRIC = 0.01&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; PXL2HIME(tnPixel &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* Pixel to HiMetric conversion&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnPixelsOnOneHiMetricUnit &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	lnPixelsOnOneHiMetricUnit = INCH2HIMETRICS / GetDPI()
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ROUND&lt;/span&gt;(lnPixelsOnOneHiMetricUnit &lt;span style="color: #008000"&gt;* m.tnPixel, 0)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; HIME2PXL(tnHimetric &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* HiMetric to Pixel conversion&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnPixelsOnOneHiMetricUnit &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	lnPixelsOnOneHiMetricUnit = INCH2HIMETRICS / GetDPI()
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ROUND&lt;/span&gt;(m.tnHimetric / m.lnPixelsOnOneHiMetricUnit, 0)
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; GetDPI(tnHDC &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      &lt;span style="color: #008000"&gt;* retrieve dots per inch resolution &lt;/span&gt;
      &lt;span style="color: #008000"&gt;* for VFP's _SCREEN device context&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; GetDeviceCaps &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; GDI32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; hdc, &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; nIndex
	&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; GetWindowDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; ReleaseDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; hDC
	&lt;span style="color: #008000"&gt;* For simplicity, we assume X- and Y- dimensions &lt;/span&gt;
      &lt;span style="color: #008000"&gt;* using the same DPI resolution.&lt;/span&gt;
	#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; LOGPIXELSX 88 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Logical pixels/inch in X	&lt;/span&gt;
      #&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; LOGPIXELSY 90 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Logical pixels/inch in Y&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* Get VFP's _Screen-hDC to calculate resolution:&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lhDC &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, lnDPI &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;STORE&lt;/span&gt; 0 &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; lhDC, lnDPI
	lhDC = GetWindowDC(&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;)
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT m.lhDC = 0
		lnDPI = GetDeviceCaps(m.lhDC, LOGPIXELSX)
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		lnDPI = 96 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; default to 96 DPI&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* Free device context&lt;/span&gt;
	= ReleaseDC(&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, m.lhDC)
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.lnDPI
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; GetCanvas(tnHWND &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, tlChild &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Boolean) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* Retrieve hDC (handle DeviceContext) of window handle&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* tlChild = TRUE  := Use GetDC()&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* tlChild = FALSE := Use GetWindowDC()&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; GetDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; GetWindowDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnHDC &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.tlChild
		lnHDC = GetDC(m.tnHWND)
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		lnHDC = GetWindowDC(m.tnHWND)
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.lnHDC
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; ReleaseCanvas(tnHWND &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, tnHDC &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* Releases a borrowed hDC&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; ReleaseDC &lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; USER32 &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;integer&lt;/span&gt; hDC
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; ReleaseDC(m.tnHWND, m.tnHDC)
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
&lt;span style="color: #008000"&gt;&lt;font color="#ff0000"&gt;* The following function is not bullet-proof, as it fails on forms with scrollbars ;&lt;br /&gt;  &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;font color="#ff0000"&gt;&lt;span style="color: #008000"&gt;&lt;font color="#ff0000"&gt;(oForm.Scrollbars &amp;gt; 0) See Example #4 for a working solution!&lt;/font&gt;&lt;/span&gt;
&lt;/font&gt;&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; GetChildAreaCanvas(tnhWnd &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* VFP ‘TopLevelForms’ (oForm.ShowWindow = 2) have&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*      a secondary window inside the outer one.&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* This is also true for forms showing scrollbars!&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnVfpHANDLE &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, lnClienthWnd &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, lnHDC &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #008000"&gt;* Convert the given Windows hWnd to an internal VFP WHANDLE&lt;/span&gt;
	lnVfpHANDLE = &lt;span style="color: #0000ff"&gt;SYS&lt;/span&gt;(2326, m.tnhWnd)
	&lt;span style="color: #008000"&gt;* Retrieve the Windows hWnd for a client window &lt;/span&gt;
	&lt;span style="color: #008000"&gt;* (WCLIENTWINDOW) of a specified Visual FoxPro parent window&lt;/span&gt;
	lnClienthWnd = &lt;span style="color: #0000ff"&gt;SYS&lt;/span&gt;(2325, m.lnVfpHANDLE)
	&lt;span style="color: #008000"&gt;* Check if there is a WCLIENTWINDOW&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; lnClienthWnd = lnVfpHANDLE
		&lt;span style="color: #008000"&gt;* No such WCLIENTWINDOW, return child’s client area&lt;/span&gt;
		lnHDC = GetCanvas(m.tnhWnd, .T.)	
	&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
		&lt;span style="color: #008000"&gt;* There IS a WCLIENTWINDOW!&lt;/span&gt;
		&lt;span style="color: #008000"&gt;* Get the device context handle for the &lt;/span&gt;
		&lt;span style="color: #008000"&gt;* whole client area of that window:&lt;/span&gt;
		lnHDC = GetCanvas(lnClienthWnd)
	&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.lnHDC
&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;h4&gt;&lt;font color="#000080"&gt;Example #4&lt;/font&gt;&lt;/h4&gt;

&lt;p&gt;The following example demonstrates how to render an image on different types of forms. Copy the code to a PRG file, then compile and run it. &lt;/p&gt;

&lt;p&gt;The first section of the program can be seen as a testing setup. You will be asked four times to select a picture from your local disk. Then, a form will be created and the chosen picture will be rendered inside it. The MyForm class definition holds all functionality. At the end of this listing there are three supporting subclasses of &lt;em&gt;MyForm&lt;/em&gt; called &lt;i&gt;&lt;strong&gt;MyScrollableForm&lt;/strong&gt;, &lt;strong&gt;MyDockableForm&lt;/strong&gt;, &lt;/i&gt;and&lt;i&gt; &lt;strong&gt;MyTopLevelForm&lt;/strong&gt;&lt;/i&gt; which gets instantiated to test all kinds of form types. You may want to run the demo several times while changing/varying the base form’s (MyForm) &lt;b&gt;Scrollbars&lt;/b&gt; and &lt;b&gt;MDIForm&lt;/b&gt; property values. In addition to that you may uncomment the DEBUGOUT lines in &lt;i&gt;MyForm.HandleWinMsg1()&lt;/i&gt; and &lt;i&gt;HandleWinMsg2()&lt;/i&gt; to watch WinMessages in your debugger. The method &lt;b&gt;&lt;i&gt;MyForm.ImageAttribs()&lt;/i&gt;&lt;/b&gt;&lt;i&gt; &lt;/i&gt;is called at the end of &lt;b&gt;&lt;i&gt;MyForm.RetrievePicture()&lt;/i&gt;&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method. If you like to see additional information about the loaded image, uncomment the invocation there.&lt;/p&gt;
&lt;span style="color: #0000ff"&gt;&lt;/span&gt;

&lt;pre&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;span style="color: #0000ff"&gt;CLEAR&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** SET STEP ON &lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RELEASE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;LIKE&lt;/span&gt; goForm&lt;span style="color: #008000"&gt;*&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;PUBLIC&lt;/span&gt; goForm1, goForm2, goForm3, goForm4
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Try rendering on a form in SCREEN&lt;/span&gt;
goForm1 = &lt;span style="color: #0000ff"&gt;CREATEOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;MyForm&lt;/span&gt;&amp;quot;)	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; IN_SCREEN (MDIForm = .T.)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.goForm1) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
	goForm1.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;()
	goForm1.&lt;span style="color: #0000ff"&gt;Caption&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm1 =&amp;gt; IN_SCREEN (MDIForm = .T.)&lt;/span&gt;&amp;quot;
	goForm1.&lt;span style="color: #0000ff"&gt;Name&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm1&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;* SET STEP ON&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Try rendering on a dockable form&lt;/span&gt;
goForm2 = &lt;span style="color: #0000ff"&gt;CREATEOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;MyDockableForm&lt;/span&gt;&amp;quot;) &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; IN_SCREEN (dockable = 1)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.goForm2) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
	goForm2.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;()
	goForm2.&lt;span style="color: #0000ff"&gt;Caption&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm2 =&amp;gt; IN_SCREEN (dockable = 1)&lt;/span&gt;&amp;quot;
	goForm2.&lt;span style="color: #0000ff"&gt;Name&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm2&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;* SET STEP ON &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Try rendering on a TopLevelForm (TLF)&lt;/span&gt;
goForm3 = &lt;span style="color: #0000ff"&gt;CREATEOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;MyTopLevelForm&lt;/span&gt;&amp;quot;) &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; AS_TOPLEVEL_FORM&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.goForm3) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
	goForm3.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;()
	goForm3.&lt;span style="color: #0000ff"&gt;Caption&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm3 =&amp;gt; AS_TOPLEVEL_FORM&lt;/span&gt;&amp;quot;
	goForm3.&lt;span style="color: #0000ff"&gt;Name&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm3&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;* SET STEP ON &lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Try rendering on a regular (child) form (with scrollbars)&lt;/span&gt;
goForm4 = &lt;span style="color: #0000ff"&gt;CREATEOBJECT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;MyScrollableForm&lt;/span&gt;&amp;quot;) &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; IN_SCREEN (scrollbars = 3)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.goForm4) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
	goForm4.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;()
	goForm4.&lt;span style="color: #0000ff"&gt;Caption&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm4 =&amp;gt; IN_SCREEN (scrollbars = 3)&lt;/span&gt;&amp;quot;
	goForm4.&lt;span style="color: #0000ff"&gt;Name&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;goForm4&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Bye, bye!&lt;/span&gt;

&lt;span style="color: #008000"&gt;***********************************************************&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** SYS(602,0) &amp;amp;&amp;amp; set off-screen bitmaps to &amp;quot;OFF&amp;quot;&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 	setting of off-screen bitmaps may have some impact&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 	but only, if one does not take care of all oddities.&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ 	!!!!! This demo program is side effect free !!!!!&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** SYS(602,1) &amp;amp;&amp;amp; set off-screen bitmaps to &amp;quot;ON&amp;quot;&lt;/span&gt;
&lt;span style="color: #008000"&gt;***********************************************************&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLASS&lt;/span&gt; MyForm &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Form&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ ----------------------------------&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;AllowOutput&lt;/span&gt; = .F.	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; ? will be echoed on form while active&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ShowWindow&lt;/span&gt; = 0 	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; 0 := In Screen, 1 := In TLF, 2:= AS TLF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt; = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; 0 : = None, 1 := horizontal, 2:= vertical, 3 := both&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;MDIForm&lt;/span&gt; = .T. 	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; .T. := form is a MDI form&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ user defined ---------------------&lt;/span&gt;
	oPic = &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; VFP's LOADPICTURE() COM object reference&lt;/span&gt;
	oIPic = &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; promary iPicture interface reference&lt;/span&gt;
	cPicturePath = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; full qualified DOS path to image&lt;/span&gt;
	lEventsBound = .F.&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; flag&lt;/span&gt;
	nhDC = -1		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; device context to render the image on&lt;/span&gt;
	nHwnd = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; window handle of rendering device context (.nhDC)&lt;/span&gt;
      &lt;span style="color: #008000"&gt;*** HWnd = ....	&amp;amp;&amp;amp; thisform's native window handle which must not always&lt;/span&gt;
				&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; be the window handle of the rendering device context!&lt;/span&gt;
	xDPI = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; VFP's _SCREEN X-Resolution&lt;/span&gt;
	yDPI = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; VFP's _SCREEN Y-Resolution&lt;/span&gt;
	iWindowProc1 = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Buffer &lt;/span&gt;
	iWindowProc2 = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Buffer&lt;/span&gt;
	nWidth = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Ole-Image property: Image width (pixels)&lt;/span&gt;
	nHeight = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Image height (pixels)&lt;/span&gt;
	nTop = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Image top position (pixels)&lt;/span&gt;
	nLeft = 0		&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Image left position (pixels)&lt;/span&gt;
	nXOffset = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Horiz.Offset in source (where copying starts)&lt;/span&gt;
	nYOffset = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Vert.Offset in source (where copying starts)&lt;/span&gt;
	nCopyWidth = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Horiz.Extend to copy from + readout direction&lt;/span&gt;
	nCopyHeight = 0	&lt;span style="color: #008000"&gt;&amp;amp;&amp;amp;  dito : Vert.Extend to copy from + readout direction&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*// ----------------------------------&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INIT&lt;/span&gt;() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; BOOLEAN
		&lt;span style="color: #008000"&gt;*\\ call public implementation&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.INITIALIZE()
		&lt;span style="color: #008000"&gt;*// &lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; .T. &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; always allow form to stay in memory&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; INITIALIZE() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\&lt;/span&gt;
			.DeclareWinAPI()
			.RetrieveDPI()
			.RetrieveWinHandle()
			.RetrieveWinProcs()
			.RetrieveHandleDC()
			.RetrievePicture()
			.DoBind()
			&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PAINT&lt;/span&gt;() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #008000"&gt;*\\ common entry point to render our COM pictures&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.RenderImages()
		&lt;span style="color: #008000"&gt;*// Secondary entry points (even more important) see HandleWinMsg1 &amp;amp; 2&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;DESTROY&lt;/span&gt;() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			.UnbindAll()
			.ResetAll()
			.ReleaseDeviceContext()
			&lt;span style="color: #008000"&gt;*\\ release the public variable&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;_SHELL&lt;/span&gt; = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;RELEASE &lt;/span&gt;&amp;quot; + .&lt;span style="color: #0000ff"&gt;Name&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; UnbindAll() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID	
		&lt;span style="color: #0000ff"&gt;UNBINDEVENTS&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;)
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; .lEventsBound
				&lt;span style="color: #008000"&gt;*\\ restore form's message loop&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;UNBINDEVENTS&lt;/span&gt;(.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;)
				&lt;span style="color: #0000ff"&gt;UNBINDEVENTS&lt;/span&gt;(.nHWnd)
				&lt;span style="color: #008000"&gt;*\\ .T. when BINDEVENT(hWnd,...) was successful&lt;/span&gt;
				.lEventsBound = .F.	
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; ResetAll() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			.oPic = &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;
			.oIPic = &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;
			.cPicturePath = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
			.nHwnd = 0
			.xDPI = 0
			.yDPI = 0
			.iWindowProc1 = 0
			.iWindowProc2 = 0
			&lt;span style="color: #008000"&gt;*\\ parameter for oIPic.Render()&lt;/span&gt;
			.nWidth = 0
			.nHeight = 0
			.nTop = 0
			.nLeft = 0
			.nXOffset = 0
			.nYOffset = 0
			.nCopyWidth = 0
			.nCopyHeight = 0
			&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; ReleaseDeviceContext() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #008000"&gt;*\\ Release .nHDC&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; .nHDC &amp;lt;&amp;gt; 0 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; handle of device context&lt;/span&gt;
				ReleaseDC(.nHWnd, .nHDC)
				.nHDC = 0
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; DeclareWinAPI() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
	&lt;span style="color: #008000"&gt;*\\ Register WINAPI declarations&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ WIN32API: Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll, and Advapi32.dll&lt;/span&gt;
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; CallWindowProc	&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; lpPrevWndFunc, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWND&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; Msg, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; wParam, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; LPARAM
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; GetDC 		&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWND&lt;/span&gt;
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; GetDeviceCaps 	&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; hDC, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; nIndex
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; GetWindow		&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWND&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; wFlag
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; GetWindowDC	&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWND&lt;/span&gt;
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; GetWindowLong	&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWND&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; nIndex
	    &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; ReleaseDC		&lt;span style="color: #0000ff"&gt;IN&lt;/span&gt; WIN32API &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; &lt;span style="color: #0000ff"&gt;HWND&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt; hDC
	    &lt;span style="color: #008000"&gt;*// some more unused (but useful) at the end of this listing&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; RetrieveDPI() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
	&lt;span style="color: #008000"&gt;*\\ calculate X/Y _screen resolutions&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*\\ retrieves dots per inch resolution for VFP's _SCREEN device context&lt;/span&gt;
		#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; LOGPIXELSX 88 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Logical pixels/inch in X&lt;/span&gt;
		#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; LOGPIXELSY 90 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Logical pixels/inch in Y&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//				&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lhDC &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, lnDPI &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		lhDC = GetWindowDC(&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;)
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.lhDC &amp;lt;&amp;gt; 0
			&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.xDPI = GetDeviceCaps(m.lhDC, LOGPIXELSX)
			&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.yDPI = GetDeviceCaps(m.lhDC, LOGPIXELSY)
			= ReleaseDC(&lt;span style="color: #0000ff"&gt;_Screen&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;HWnd&lt;/span&gt;, m.lhDC)
		&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ fallback defaults&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;STORE&lt;/span&gt; 96 &lt;span style="color: #0000ff"&gt;TO&lt;/span&gt; ._xDPI, ._yDPI
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; RetrieveWinHandle() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; GW_CHILD 5
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ default: THISFOEM.HWnd&lt;/span&gt;
			.nHWnd = .&lt;span style="color: #0000ff"&gt;hWnd&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ handle different scenarios:&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;DO&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;Dockable&lt;/span&gt; &amp;gt; 0
					&lt;span style="color: #008000"&gt;*\\ dockable forms do not have any child windows&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;ShowWindow&lt;/span&gt; = 2
					&lt;span style="color: #008000"&gt;*\\ If the parent form is a TopLevelForm then&lt;/span&gt;
					&lt;span style="color: #008000"&gt;*\\	there must be another child window, thus&lt;/span&gt;
					&lt;span style="color: #008000"&gt;*\\	drill down to get inner-most child&lt;/span&gt;
					.nhWnd = GetWindow(.nHWnd, GW_CHILD)
					&lt;span style="color: #008000"&gt;*\\ TopLevelWindow with additional scroll bars&lt;/span&gt;
					&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt; &amp;gt; 0
						&lt;span style="color: #008000"&gt;*\\IF there are scrollbars enabled, there is &lt;/span&gt;
						&lt;span style="color: #008000"&gt;*\\an additional view port window. Thus,&lt;/span&gt;
						&lt;span style="color: #008000"&gt;*\\drill down and get this window's handle&lt;/span&gt;
						.nhWnd = GetWindow(.nHWnd, GW_CHILD)
						&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
					&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;CASE&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt; &amp;gt; 0
					&lt;span style="color: #008000"&gt;*\\ Regular VFP form with scroll bars enabled&lt;/span&gt;
					.nhWnd = GetWindow(.nHWnd, GW_CHILD)
			&lt;span style="color: #0000ff"&gt;ENDCASE&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; RetrieveWinProcs() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; GWL_WNDPROC		(-4)
		&lt;span style="color: #008000"&gt;*\\ retrieves the WIN Message handler ID for a given window &lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ 	which defaults to THISFORM&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.iWindowProc1 = GetWindowLong(.&lt;span style="color: #0000ff"&gt;Hwnd&lt;/span&gt;, GWL_WNDPROC)
			&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.iWindowProc2 = GetWindowLong(.nHwnd, GWL_WNDPROC)
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; RetrieveHandleDC(tlAll &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; Boolean) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ force parameter default to boolean FALSE&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tlAll) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;L&lt;/span&gt;&amp;quot;
				tlAll = .F.
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; m.tlAll
				&lt;span style="color: #008000"&gt;*\\ the full window device context&lt;/span&gt;
				.nHDC = GetWindowDC(.nHwnd)
			&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ the child area device context&lt;/span&gt;
				.nHDC = GetDC(.nHwnd)
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; RetrievePicture(tcFileName &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #008000"&gt;*\\ Load picture from disk.&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ Initializes .oPIC and .oIPIC&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; (NOT &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.tcFileName) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;C&lt;/span&gt;&amp;quot;)
			tcFileName = &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;&lt;/span&gt;&amp;quot;
		&lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;
			tcFileName = &lt;span style="color: #0000ff"&gt;ALLTRIM&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;UPPER&lt;/span&gt;(m.tcFileName))
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.tcFileName)
			&lt;span style="color: #008000"&gt;*\\ prompt user&lt;/span&gt;
			m.tcFileName = &lt;span style="color: #0000ff"&gt;GETPICT&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;windows bitmap files:bmp;&lt;/span&gt;&amp;quot;+;
							&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;windows icon files:ico;&lt;/span&gt;&amp;quot;+;
							&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;run-length encoded files:rle;&lt;/span&gt;&amp;quot;+;
							&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;metafiles:wmf;&lt;/span&gt;&amp;quot;+;
							&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;enhanced metafiles:emf;&lt;/span&gt;&amp;quot;+;
							&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;JPEG files:jpg,jpeg&lt;/span&gt;&amp;quot;,;
							&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Render from file:&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Load&lt;/span&gt;&amp;quot; )
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ load the picture&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;TRY&lt;/span&gt;
			loPic = &lt;span style="color: #0000ff"&gt;LOADPICTURE&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;IIF&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;EMPTY&lt;/span&gt;(m.tcFileName), &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.cPicturePath, m.tcFileName))
		&lt;span style="color: #0000ff"&gt;CATCH&lt;/span&gt;
			loPic = &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;
		ENDTRY
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(m.loPic) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
			&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ save VFP's COM ref.&lt;/span&gt;
				.oPic = m.loPic
				&lt;span style="color: #008000"&gt;*\\ save pimary COM pic ref&lt;/span&gt;
				.oIPic = &lt;span style="color: #0000ff"&gt;GETINTERFACE&lt;/span&gt;(m.loPic, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;IPicture&lt;/span&gt;&amp;quot;)
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ calculate pixel based width and height&lt;/span&gt;
				.nWidth = .HIME2PXL(.oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;X&lt;/span&gt;&amp;quot;)
				.nHeight = .HIME2PXL(.oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Y&lt;/span&gt;&amp;quot;)
				.nTop = 0
				.nLeft = 0
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ Next section positions a 1x1 pixel line object on the form&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ at lower right corner of the rendered image. Scrollbars&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ will appear if form is smaller than the picture loaded&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt; &amp;gt; 0
					&lt;span style="color: #008000"&gt;*\\ Make the scrollbars appear if secessary&lt;/span&gt;
					&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; (.nWidth + .nLeft &amp;gt; .&lt;span style="color: #0000ff"&gt;WIDTH&lt;/span&gt;) AND &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(.&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt;, 0) OR ;
						(.nHeight + .nTop &amp;gt; .&lt;span style="color: #0000ff"&gt;HEIGHT&lt;/span&gt;) AND &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(.&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt;, 1)
						&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; NOT PEMSTATUS(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;_oPixel&lt;/span&gt;&amp;quot;,5) 
							.&lt;span style="color: #0000ff"&gt;AddObject&lt;/span&gt;(&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;_oPixel&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;LINE&lt;/span&gt;&amp;quot;)
							._oPixel.&lt;span style="color: #0000ff"&gt;top&lt;/span&gt; = .nHeight + .nTop
							._oPixel.&lt;span style="color: #0000ff"&gt;left&lt;/span&gt; = .nWidth + .nLeft
							._oPixel.&lt;span style="color: #0000ff"&gt;DrawMode&lt;/span&gt; = 11 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; NOP: In effect, this setting turns drawing off&lt;/span&gt;
							._oPixel.&lt;span style="color: #0000ff"&gt;Visible&lt;/span&gt; = .T. &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; Must be set visible! Due to .DrawMode it is not rendered!&lt;/span&gt;
						&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
					&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
					&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ Want to echo some of the extended COM attributes?&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\	Uncomment next line (will echo to VFP's desktop)&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*** .ImageAttribs()&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ finally render new image the 1st time&lt;/span&gt;
				.RenderImages()
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; DoBind() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; WM_ERASEBKGND	0x0014
		&lt;span style="color: #008000"&gt;*\\ Bind to WIN-Messages&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ the regular case: simple VFP form IN SCREEN&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(.nhWnd, WM_ERASEBKGND, &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;HandleWinMsg2&lt;/span&gt;&amp;quot;, 4)
			&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ TopLevel form -or- simple form with scrollbars -or-&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\		a combination of both&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; .&lt;span style="color: #0000ff"&gt;ShowWindow&lt;/span&gt; = 2
				&lt;span style="color: #008000"&gt;*\\ Some VFP forms receive &amp;quot;erase_background&amp;quot; message&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\		at their &amp;quot;outer&amp;quot; window&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;BINDEVENT&lt;/span&gt;(.&lt;span style="color: #0000ff"&gt;hWnd&lt;/span&gt;, WM_ERASEBKGND, &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;HandleWinMsg1&lt;/span&gt;&amp;quot;, 4)
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
			.lEventsBound = .T.
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; HandleWinMsg1(tnHWnd &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;, tnMsg &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;, tnWPARAM &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;, tnLPARAM &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		&lt;span style="color: #008000"&gt;**** DEBUGOUT &amp;quot;HandleWinMsg1 - WM_ERASEBKGND WPARAM = &amp;quot; + TRANSFORM(m.tnWPARAM) + &amp;quot; | LPARAM = &amp;quot;+ TRANSFORM(m.tnLPARAM)&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ 1st Windows Message handler (either bound to outer TLF window or&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\		to the 'one &amp;amp; only' window handle &amp;gt;&amp;gt;&amp;gt; thisform.hwnd)&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; nRetvalue
		&lt;span style="color: #008000"&gt;*\\ This routine gets called on Windows &amp;quot;EraseBackground&amp;quot; messages. &lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\	Thus, first forward the message (which will wipe out the background)...&lt;/span&gt;
		nRetvalue = CallWindowProc(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.iWindowProc1, m.tnHWnd, m.tnMsg, m.tnWPARAM, m.tnLPARAM)
		&lt;span style="color: #008000"&gt;*\\ ... and finally, render our image(s) again&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.RenderImages()
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.nRetvalue
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;

	&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; HandleWinMsg2(tnHWnd &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;, tnMsg &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;, tnWPARAM &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;, tnLPARAM &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;INTEGER&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*** DEBUGOUT &amp;quot;HandleWinMsg2 - WM_ERASEBKGND WPARAM = &amp;quot; + TRANSFORM(m.tnWPARAM) + &amp;quot; | LPARAM = &amp;quot;+ TRANSFORM(m.tnLPARAM)&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*\\ 2nd Windows Message handler (bound to any inner window, if such one exists)&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; nRetvalue
		nRetvalue = CallWindowProc(&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.iWindowProc2, m.tnHWnd, m.tnMsg, m.tnWPARAM, m.tnLPARAM)
		&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.RenderImages()
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; m.nRetvalue
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;PROTECTED&lt;/span&gt; &lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; RenderImages() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
			&lt;span style="color: #008000"&gt;*\\ output loaded COM image (4 times to demonstrate FXs)&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ errors may rise during INIT() and DESTROY()&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\	it makes not much sense to catch them separately.&lt;/span&gt;
			&lt;span style="color: #008000"&gt;*\\ Thus, just wrap all rendering with TRY...CATCH here&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;TRY&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ render the loaded picture 4 times:&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ 1st: upper left one &amp;gt;&amp;gt;&amp;gt; normal output&lt;/span&gt;
				.oIPic.Render(.nhDC, 0, 0, .nWidth, .nHeight, 0,;
					.oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, .oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, - .oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;)
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ 2nd: upper right one &amp;gt;&amp;gt;&amp;gt; mirrored vertically&lt;/span&gt;
				.oIPic.Render(.nhDC, .nWidth+10, 0, .nWidth, .nHeight, .oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;,;
					.oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, - .oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, - .oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;)
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ lower left one &amp;gt;&amp;gt;&amp;gt; mirrored horizontally&lt;/span&gt;
				.oIPic.Render(.nhDC, 0, .nHeight+10, .nWidth, .nHeight,;
					0, 0, .oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, .oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;)
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ lower right one &amp;gt;&amp;gt;&amp;gt; mirrored horizontally + vertically&lt;/span&gt;
				.oIPic.Render(.nhDC, .nWidth+10, .nHeight+10, .nWidth, .nHeight, .oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, 0,;
					- .oIPic.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;, .oIPic.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;)
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;CATCH&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*\\ eat all rendering errors&lt;/span&gt;
			ENDTRY
			&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;	
			
	&lt;span style="color: #0000ff"&gt;PROCEDURE&lt;/span&gt; ImageAttribs() &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; VOID
		&lt;span style="color: #008000"&gt;*\\ only for testing&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;VARTYPE&lt;/span&gt;(.oIPic) == &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;O&lt;/span&gt;&amp;quot;
				&lt;span style="color: #008000"&gt;*\\ Output some interesting(?) things&lt;/span&gt;
				&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; .oIPic
					?
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Eigenschaften des 'IPicture'-Interface:&lt;/span&gt;&amp;quot;
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Attributes&lt;/span&gt;&amp;quot;,.&lt;span style="color: #0000ff"&gt;Attributes&lt;/span&gt;
					&lt;span style="color: #0000ff"&gt;TRY&lt;/span&gt;
						? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;CurDC&lt;/span&gt;&amp;quot;,.CurDC
					&lt;span style="color: #0000ff"&gt;CATCH&lt;/span&gt;
						? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;No CurDC&lt;/span&gt;&amp;quot; &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; .ICO file&lt;/span&gt;
					ENDTRY
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Handle&lt;/span&gt;&amp;quot;,.Handle
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Height&lt;/span&gt;&amp;quot;,.&lt;span style="color: #0000ff"&gt;Height&lt;/span&gt;
					&lt;span style="color: #0000ff"&gt;TRY&lt;/span&gt;
						? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;hPal&lt;/span&gt;&amp;quot;,.hPal
					&lt;span style="color: #0000ff"&gt;CATCH&lt;/span&gt;
						? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;No hPal&lt;/span&gt;&amp;quot;
					ENDTRY
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;KeepOriginalFormat&lt;/span&gt;&amp;quot; ,.KeepOriginalFormat
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Type&lt;/span&gt;&amp;quot;			,.&lt;span style="color: #0000ff"&gt;Type&lt;/span&gt;
					? &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Width&lt;/span&gt;&amp;quot;			,.&lt;span style="color: #0000ff"&gt;Width&lt;/span&gt;
					?
				&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
				&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
			&lt;span style="color: #0000ff"&gt;ENDIF&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;ENDWITH&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDPROC&lt;/span&gt;
		
	#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; INCH2MILLIMETER 25.4 &lt;span style="color: #008000"&gt;&amp;amp;&amp;amp; 1 Inch (German: 'Zoll') = 25.4 millimeters&lt;/span&gt;
	#&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; INCH2HIMETRICS (INCH2MILLIMETER &lt;span style="color: #008000"&gt;* 100) &amp;amp;&amp;amp; 1 HIMETRIC = 0.01 &lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; PXL2HIME(tnPixel &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, tcDimension &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Character&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnPixelsOnOneHiMetricUnit &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		lnPixelsOnOneHiMetricUnit = INCH2HIMETRICS / &lt;span style="color: #0000ff"&gt;IIF&lt;/span&gt;(m.tcDimension== &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;X&lt;/span&gt;&amp;quot;, &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.xDPI,&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.yDPI)
		&lt;span style="color: #008000"&gt;*\\&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ROUND&lt;/span&gt;(lnPixelsOnOneHiMetricUnit &lt;span style="color: #008000"&gt;* m.tnPixel, 0)&lt;/span&gt;
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; HIME2PXL(tnHimetric &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, tcDimension &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Character&lt;/span&gt; ) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;LOCAL&lt;/span&gt; lnPixelsOnOneHiMetricUnit &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
		lnPixelsOnOneHiMetricUnit = INCH2HIMETRICS / &lt;span style="color: #0000ff"&gt;IIF&lt;/span&gt;(m.tcDimension== &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;X&lt;/span&gt;&amp;quot;, &lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.xDPI,&lt;span style="color: #0000ff"&gt;THIS&lt;/span&gt;.yDPI)
		&lt;span style="color: #008000"&gt;*\\&lt;/span&gt;
		&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ROUND&lt;/span&gt;(m.tnHimetric / m.lnPixelsOnOneHiMetricUnit, 0)
		&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
	
	&lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; buf2dword(m.tcBuffer &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
	&lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CTOBIN&lt;/span&gt;(m.tcBuffer, &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;4rs&lt;/span&gt;&amp;quot;)
	&lt;span style="color: #0000ff"&gt;ENDFUNC&lt;/span&gt;
	&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;ENDDEFINE&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLASS&lt;/span&gt; MyDockableForm &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; MyForm
	&lt;span style="color: #0000ff"&gt;Dockable&lt;/span&gt; = 1
	&lt;span style="color: #0000ff"&gt;MDIForm&lt;/span&gt;	= .F.
&lt;span style="color: #0000ff"&gt;ENDDEFINE&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLASS&lt;/span&gt; MyScrollableForm &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; MyForm
	&lt;span style="color: #0000ff"&gt;Scrollbars&lt;/span&gt; = 3
	&lt;span style="color: #0000ff"&gt;MDIForm&lt;/span&gt;	= .F.
&lt;span style="color: #0000ff"&gt;ENDDEFINE&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;DEFINE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLASS&lt;/span&gt; MyTopLevelForm &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt; MyForm
	&lt;span style="color: #0000ff"&gt;ShowWindow&lt;/span&gt; = 2
	&lt;span style="color: #0000ff"&gt;MDIForm&lt;/span&gt;	= .F.
&lt;span style="color: #0000ff"&gt;ENDDEFINE&lt;/span&gt;

&lt;span style="color: #008000"&gt;*\\ unused defines and other useful declarations&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** #define WM_USER		 0x0400&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** #define WM_KILLFOCUS 0x0008&lt;/span&gt;
&lt;span style="color: #008000"&gt;*** #define WM_PAINT	 0x000F&lt;/span&gt;

&lt;span style="color: #008000"&gt;*\\ Unused, but useful WIN32API DECLAEs&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER IsWindowVisible	IN WIN32API INTEGER HWND&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER DefWindowProc		IN WIN32API INTEGER HWND, INTEGER Msg,INTEGER wParam, INTEGER LPARAM&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER FindWindowEx		IN WIN32API INTEGER hWndParent, INTEGER hwndChildAfter, STRING lpszClass, STRING lpszWindow&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER GetClassName		IN WIN32API INTEGER HWND, STRING lpClassName, INTEGER nMaxCount&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER GetDesktopWindow	IN WIN32API&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER GetWindowRect		IN WIN32API INTEGER HWND, STRING @lpRect&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER GetWindowInfo		IN WIN32API INTEGER HWND, STRING @ pwindowinfo&lt;/span&gt;
&lt;span style="color: #008000"&gt;* DECLARE INTEGER GetWindowText		IN WIN32API INTEGER HWND, STRING @szText, INTEGER nLen&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;hr /&gt;



&lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/design-time-references-monitor-designer.html" href="http://myvfpblog.blogspot.com/2009/09/design-time-references-monitor-designer.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/Tb9e6FJYUrI/AAAAAAAAHhI/VHJTjE2UL1Y/NavBack_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Tips &amp;amp; Tricks Home (TOC)" border="0" alt="Tips &amp;amp; Tricks Home (TOC)" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/Tb9e6UxSqsI/AAAAAAAAHhM/QFK7eAu2Ryw/NavHome_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html" href="http://myvfpblog.blogspot.com/2011/05/hierarchical-table-order-part-i.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tb9e6t8gluI/AAAAAAAAHhQ/AJ1j6yCQtT0/NavForward_48_RGBA%5B9%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-7281860236088425141?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/7281860236088425141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=7281860236088425141&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/7281860236088425141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/7281860236088425141'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/04/loadpicture-functionsome-myths-revealed.html' title='The LOADPICTURE() Function – (Some) ALL Myths Revealed!'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_MOmDLu4Rm5Y/TbWxElzvv5I/AAAAAAAAHhA/26-c47w72Gc/s72-c/NavBack_48_RGBA5%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-4876826988200954130</id><published>2011-04-15T01:16:00.000+02:00</published><updated>2011-04-29T21:33:18.895+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FoxQuill.NET'/><title type='text'></title><content type='html'>&lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-tips-tricks-in-this.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Tips&amp;amp;Tricks Home" border="0" alt="Tips&amp;amp;Tricks Home" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsIJN6Ab8hI/AAAAAAAAB8E/VlJw7CJBYB0/Home_32_RGBA%5B9%5D.png?imgmax=800" width="32" height="43" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-toolbox-in-this-section.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Toolbox Home" border="0" alt="Toolbox Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIJOHKX86I/AAAAAAAAB8I/zfJDi12jTTM/Home_48_RGBA%5B9%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Complex Controls Home" border="0" alt="Complex Controls Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsIJOk1KNRI/AAAAAAAAB8M/bM3B2LPiS-Y/Home_64_RGBA%5B9%5D.png?imgmax=800" width="64" height="85" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/neat-solutions-home.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Neat Solutions Home" border="0" alt="Neat Solutions Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsIJPC24QBI/AAAAAAAAB8Q/VXMHIGhWUC4/Home_72_RGBA%5B9%5D.png?imgmax=800" width="72" height="96" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-foxtools.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Foxtools Home" border="0" alt="Foxtools Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsIJPUZAbeI/AAAAAAAAB9g/vWBhj5BbMXE/Home_96_RGBA%5B1%5D.png?imgmax=800" width="96" height="128" /&gt;&lt;/a&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FoxQuill Home" border="0" alt="FoxQuill Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsIJPxXqwYI/AAAAAAAAB8Y/4L4esIeLS4E/Home_128_RGBA%5B5%5D.png?imgmax=800" width="160" height="160" /&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-vfpx-projects-this.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VFPX Projects Home" border="0" alt="VFPX Projects Home" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsIJQC3HAdI/AAAAAAAAB8c/FicX0pSqn1o/Home_96_RGBA%5B4%5D.png?imgmax=800" width="96" height="128" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Miscellaneous Home" border="0" alt="Miscellaneous Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsIJQRLEDmI/AAAAAAAAB8g/-XW9YBd5NKw/Home_72_RGBA%5B4%5D.png?imgmax=800" width="72" height="96" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-windows-api-calling.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Windows API Home" border="0" alt="Windows API Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsIJQ0VhPfI/AAAAAAAAB8k/r6zeroghEC8/Home_64_RGBA%5B4%5D.png?imgmax=800" width="64" height="85" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/latest-news-this-section-of-my-vfp-blog.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="News Home" border="0" alt="News Home" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsIJRAhNl_I/AAAAAAAAB8o/iKowh_6rn28/Home_48_RGBA%5B4%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/basics-home.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Basics Home" border="0" alt="Basics Home" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/SsIJRSG7UkI/AAAAAAAAB8s/q5DyEcx3JE0/Home_32_RGBA%5B4%5D.png?imgmax=800" width="32" height="43" /&gt;&lt;/a&gt;&amp;#160; &lt;hr /&gt;&lt;/div&gt;  &lt;h1 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;a title="http://www.foxquill.de" href="http://www.foxquill.de/" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 12px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FoxQuill wird zu FoxQuill.NET" border="0" alt="FoxQuill 2011" align="left" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaZMEjqKKmI/AAAAAAAAHWQ/DZZSOkVQ_Yc/image%5B198%5D.png?imgmax=800" width="134" height="120" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;span style="color: #a618d9"&gt;FoxQuill another VFP Framework&lt;/span&gt;&lt;/strong&gt;&lt;/h1&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;span style="color: #5e0c78"&gt;&lt;strong&gt;FoxQuill&lt;/strong&gt;&lt;/span&gt; (&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaZMEh0ff_I/AAAAAAAAHWU/tRUHGle8uY4/OffSiteLink%5B2%5D.gif?imgmax=800" width="11" height="7" /&gt;&amp;#160;&lt;a title="Hompage of FoxQuill &amp;amp; FoxQuill.NET Frameworks" href="http://www.foxquill.de" target="_blank"&gt;www.foxquill.de&lt;/a&gt;) is my own homegrown (and very private) framework I am working with. At the moment I’m enhancing and trying to migrate it to the .NET platform. At the same time I am learning C# – &lt;strong&gt;what a mess!&lt;/strong&gt; Sometimes I think I am to old to start all over again with a new programming language. On the other hand, I believe that this new challenge could also be a good chance to create very interesting things…&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Home_24_RGBA" border="0" alt="Home_24_RGBA" align="left" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/Tbrga_kYJfI/AAAAAAAAHa8/3KlEsQ307SA/Home_24_RGBA%5B3%5D.png?imgmax=800" width="28" height="28" /&gt;&amp;#160; &lt;font style="font-weight: bold" color="#9b00d3" size="4"&gt;Table of Content&lt;/font&gt;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&amp;#160;&lt;/div&gt;  &lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/foxquill-becomes-foxquillnet.html" href="http://myvfpblog.blogspot.com/2011/04/foxquill-becomes-foxquillnet.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 6px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="FoxQuill will become FoxQuill.NET" border="0" alt="FoxQuill will become FoxQuill.NET" align="left" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TbsDv6LbpkI/AAAAAAAAHbE/e3cDzR8zNIk/Doc_Full_0%5B4%5D.png?imgmax=800" width="54" height="89" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;font style="font-weight: bold" color="#9b00d3"&gt;FoxQuill will become FoxQuill.NET&lt;/font&gt;&lt;/h3&gt;  &lt;p&gt;Some thoughts and insights dealing with my private VFP-based framework (yep, I named it “FoxQuill”) and its future transition into the .NET world.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;hr /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-4876826988200954130?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/4876826988200954130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=4876826988200954130&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/4876826988200954130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/4876826988200954130'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2009/09/foxquill-more-than-framework-foxquill.html' title=''/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsIJN6Ab8hI/AAAAAAAAB8E/VlJw7CJBYB0/s72-c/Home_32_RGBA%5B9%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-9170610149859848091</id><published>2011-04-12T12:26:00.000+02:00</published><updated>2011-04-30T16:45:26.810+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miscellaneous'/><title type='text'>How To Re-Enable Blogger Comments (From Windows Live Writer)</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8040"&gt;Version: 1.13.01 - last update: Wednesday, April 13, 2011, 11:55:00&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/bruno-my-rr-rhodesian-ridgeback.html" href="http://myvfpblog.blogspot.com/2011/04/bruno-my-rr-rhodesian-ridgeback.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaVzCDSP6fI/AAAAAAAAHds/LJ9jUisaNq4/NavBack_48_RGBA%5B3%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Miscellaneous Home (TOC)" border="0" alt="Miscellaneous Home (TOC)" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsX0eSObFhI/AAAAAAAAHdw/kOSLM8XWr9s/NavHome_48_RGBA%5B1%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2008/05/humour-3_19.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsX0em0JRuI/AAAAAAAAHd0/baGwj0xwKi0/NavForward_48_RGBA1.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;/strong&gt;&amp;#160; &lt;hr /&gt;&lt;/p&gt;    &lt;h1&gt;&lt;font color="#000080"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="error" border="0" alt="error" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaVzDbtw8KI/AAAAAAAAHVo/b7VwS4KKIsI/error%5B3%5D.png?imgmax=800" width="83" height="61" /&gt; WWW &amp;lt;= What Went Wrong :-)&lt;/font&gt;&lt;/h1&gt;  &lt;p&gt;I create &amp;amp; maintain this blog using Microsoft’s &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaRIE0WYinI/AAAAAAAAHR4/TBOHzFiWS5E/OffSiteLink2.gif?imgmax=800" width="11" height="7" /&gt; &lt;a title="http://explore.live.com/windows-live-writer?os=other" href="http://explore.live.com/windows-live-writer?os=other" target="_blank"&gt;Windows Live Writer&lt;/a&gt;. Lately I was checking in some cool new sidebar gadgets for my blog space. During the update of my blogger template I must have changed a setting dealing with the display of comments at the bottom of each page. &lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;&lt;font color="#000080"&gt;How to reproduce&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;If you like to follow me, just do the steps below:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Check into your account &lt;/li&gt;    &lt;li&gt;Click “Design” in the upper right corner of your blogger bar at top of the page (showing … &amp;lt;your login&amp;gt; [New Post] [&lt;u&gt;Design&lt;/u&gt;] [Sign Out] ) &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family: arial"&gt;Select the “Settings” tab and below click the “Comments” link. &lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-family: arial"&gt;All this brings you to the page shown below:&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaRIFM4pyDI/AAAAAAAAHR8/OMG8scp5Xhg/s1600-h/image10.png" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="Disables Comments for New Posts" alt="Disables Comments for New Posts" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaRIF8272tI/AAAAAAAAHSA/4BJbP_ccoDg/image_thumb1.png?imgmax=800" width="472" height="497" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;Img #1.) Be careful with the “Comments Default for Posts” entry!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;The combo box in question allows you to disable the display of the &lt;strong&gt;&lt;u&gt;0 Comments&lt;/u&gt;&lt;/strong&gt; link in the footer section of every new post. Setting this option to “New Posts Do Not Have Comments” will disable the whole commenting feature for every blog entry you will publish in the future!&lt;/span&gt;&lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;&lt;font color="#000080"&gt;Live Writer never knows&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;Sadly, our Live Writer is not aware of the fact, that comments are disabled. Thus, there is no way to correct the missing commenting option with the help of Microsoft’s tool. In addition, Google stores some kind of “comments-disabled” flag value inside of every post you make. Thus, you may re-visit your blogger’s settings page (shown above) and reset your wrong choice to “New Post Have Comments” like shown in the next screenshot:&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="Allow Comments on Posts" alt="Allow Comments on Posts" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaRIGK0BeiI/AAAAAAAAHUE/dL7mnn7U_zk/8%5B8%5D.png?imgmax=800" width="485" height="77" /&gt;&lt;/p&gt;  &lt;p&gt;But, this will not affect any page you posted while your wrong “…No Comments”-selection was active! Only your &lt;strong&gt;next new post&lt;/strong&gt; will show the &lt;strong&gt;&lt;u&gt;0 Comments&lt;/u&gt;&lt;/strong&gt; link again. Okay, you may consult Google’s help pages. There are a lot of FAQ entries dealing with “missing comments links”. Alas, that makes it not easier to find the right answer to solve your homegrown problem :-) Many times missing comments links resulting from some corrupted blogger template. There are plenty of suggestions how to manually fix broken templates. Maybe someone dares to follow them, but not me!&lt;/p&gt;  &lt;h3&gt;&lt;strong&gt;&lt;font color="#000080"&gt;The RTFM Solution&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#000080"&gt;There is a simple native way (only some clicks away!) to let the “Comments” link reappear in your post’s footer.&lt;/font&gt;&lt;/strong&gt; I found it while reading some Google’s online help pages dealing with blogger settings, etc. If you like to follow me, just do the steps below:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Check into your account &lt;/li&gt;    &lt;li&gt;Click “Design” in the upper right corner of your blogger bar at top of the page (showing … &amp;lt;your login&amp;gt; [New Post] [&lt;u&gt;Design&lt;/u&gt;] [Sign Out] ) &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family: arial"&gt;Select the “Posting” tab and below click the “Edit Posts” link. &lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-family: arial"&gt;All this brings you to the page shown below:&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaRIGu95RoI/AAAAAAAAHSI/w1BrGNZqa8g/s1600-h/image34.png" target="_blank"&gt;&lt;img style="display: inline" title="Select Post with Comments disabled" alt="Select Post with Comments disabled" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaRIHNc8rQI/AAAAAAAAHSM/SqMsavH1gz0/image_thumb13.png?imgmax=800" width="483" height="428" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;Img #2.) Select an entry with disabled Comments link!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;Now, go and click “Edit” to switch a post with missing “Comments” link into edit mode. Google starts a web editor session for you like shown below:&lt;/span&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaRIHsinLlI/AAAAAAAAHSQ/p0Rgfhl-JY8/s1600-h/image25.png" target="_blank"&gt;&lt;img style="display: inline" title="Expand Post Options" alt="Expand Post Options" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaRIIETf5II/AAAAAAAAHSU/jTBYTRPRvHg/image_thumb8.png?imgmax=800" width="481" height="326" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;Img #3.) Watch out the “Post Options” link in the bottom left corner!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;There is an easy to oversee switch “&lt;strong&gt;&lt;font color="#800080"&gt;Post Options&lt;/font&gt;&lt;/strong&gt;” in the lower left corner of the online editor. Click that link-button and the editor window expands a region showing you a whole bunch of additional post related options, like shown below:&lt;/span&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaRIIsToGVI/AAAAAAAAHSY/zcwBok_tMhA/s1600-h/image33.png" target="_blank"&gt;&lt;img style="display: inline" title="Reset Reader Comments to &amp;quot;Allow&amp;quot;" alt="Reset Reader Comments to &amp;quot;Allow&amp;quot;" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaRIJOgg7pI/AAAAAAAAHSc/inUEa1rWctg/image_thumb12.png?imgmax=800" width="476" height="467" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;Img #4.) Choose “Allow” to re-enable “Comments”&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;Re-select “Allow” in the “Reader comments” option group and after saving your post shows up with &lt;strong&gt;&lt;u&gt;n Comments&lt;/u&gt;&lt;/strong&gt; link in it’s footer, again – &lt;strong&gt;f&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;inally&lt;/strong&gt; ;-)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;Repeat the last steps for every post with hidden/disabled “Comments” link – et nous voilà arrivés!&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;&lt;font color="#800040"&gt;BTW.: The option used above (the way to change settings on a per-post basis) is well described somewhere on one of the many, many Google online help pages:-) We all know the shortcut “RTFM“, don’t we? ;-)&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;That's all for now,      &lt;br /&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: arial"&gt;CU guys!&lt;/span&gt;&lt;/p&gt;  &lt;hr /&gt;    &lt;p&gt;&lt;strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Previous Entry" border="0" alt="Previous Entry" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaVzCDSP6fI/AAAAAAAAHd4/fywh3_ngm_g/NavBack_48_RGBA2.png?imgmax=800" width="48" height="64" /&gt;&lt;a href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-miscellaneous-diverse.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Miscellaneous Home (TOC)" border="0" alt="Miscellaneous Home (TOC)" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/SsX0eSObFhI/AAAAAAAAHd8/mClqMrpS0_g/NavHome_48_RGBA5.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a href="http://myvfpblog.blogspot.com/2008/05/humour-3_19.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Next Entry" border="0" alt="Next Entry" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsX0em0JRuI/AAAAAAAAHeA/Pk5HlqTw61U/NavForward_48_RGBA3.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-9170610149859848091?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/9170610149859848091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=9170610149859848091&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/9170610149859848091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/9170610149859848091'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2008/02/got-seek-you-v6-installed.html' title='How To Re-Enable Blogger Comments (From Windows Live Writer)'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaVzCDSP6fI/AAAAAAAAHds/LJ9jUisaNq4/s72-c/NavBack_48_RGBA%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-3095915313833981121</id><published>2011-04-12T11:28:00.001+02:00</published><updated>2011-04-13T09:30:17.702+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complex Controls'/><title type='text'>A Native TreeView (Part V)</title><content type='html'>&lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;span style="color: #ff8040"&gt;&lt;strong&gt;Version: 1.01.05 - Last &lt;/strong&gt;&lt;strong&gt;Update: Tuesday the 12th, April 2011 - 11:25:00&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;span style="color: #ff8040"&gt;&lt;/span&gt;&lt;a title="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html" href="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Previous Chapter" border="0" alt="Previous Chapter" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TZuHozk9i8I/AAAAAAAAHMs/pYvsMEGE8Ak/NavBack_48_RGBA%5B6%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Complex Controls Home (TOC)" border="0" alt="Complex Controls Home (TOC)" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TZuHpcMGOTI/AAAAAAAAHMQ/v3u9l_1MZ5o/NavHome_48_RGBA%5B4%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Next Chapter" border="0" alt="Next Chapter" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TZuHpr8bueI/AAAAAAAAHMU/vLPpMHd2v4U/NavForward_48_RGBA%5B5%5D.png?imgmax=800" width="48" height="64" /&gt;     &lt;br /&gt;&lt;/div&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;hr /&gt;&lt;/div&gt; &lt;span style="color: navy"&gt;&lt;/span&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;   &lt;br /&gt;&lt;/div&gt; &lt;span style="color: navy"&gt;   &lt;h4&gt;&lt;strong&gt;FoxPro Rocks! This is all about how to create complex controls using native VFP only!&lt;/strong&gt;&lt;/h4&gt;    &lt;h1 style="text-align: left" dir="ltr" trbidi="on"&gt;Intro&lt;/h1&gt;    &lt;h3 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;strong&gt;&lt;span style="font-size: medium"&gt;After all, the &lt;em&gt;&lt;span style="color: #ff80ff"&gt;TreeShow&lt;/span&gt;&lt;/em&gt; must go on now…&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;    &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;span style="color: black"&gt;&lt;strong&gt;&lt;span style="color: black"&gt;&lt;span style="color: black"&gt;&lt;a href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TZuHqFn71cI/AAAAAAAAHMY/Qnf3f_WbC2g/s1600-h/200px-CC-logo.svg%5B85%5D.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 15px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="200px-CC-logo.svg" border="0" alt="200px-CC-logo.svg" align="left" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TZuHqSc5xbI/AAAAAAAAHMc/1IatOWa90Ps/200px-CC-logo.svg_thumb%5B83%5D.png?imgmax=800" width="21" height="86" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;Last year I decided to publish some VFP demo application without source code you still can find &lt;a href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TZuHqzAe0RI/AAAAAAAAHMg/ecONneblFoI/s1600-h/OffSiteLink%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TZuHrP5gHPI/AAAAAAAAHMk/O_G4o1NEXZ0/OffSiteLink_thumb%5B1%5D.png?imgmax=800" width="11" height="7" /&gt;&lt;/a&gt;&amp;#160;&lt;a title="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html" href="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html" rel="nofollow" target="_blank"&gt;here&lt;/a&gt;.&amp;#160; The only reason for not supplying you with the VFP source code was, I dropped those fully functional sources somewhere (on an old memory stick) and didn’t remember exactly where I dropped that one… As &lt;/span&gt;&lt;span style="color: black"&gt;I started working on a new (improved!) version of my native VFP-TreeView, I only was able to recover the compiled demo app which is using an outdated driver table structure and many more odd things. Well, in between I decided not to create a PRO-version (available only for a fee) but publish my final release under a Creative Commons License.&lt;/span&gt;&lt;span style="color: navy"&gt; &lt;strong&gt;I hope you will enjoy it!&lt;/strong&gt;&lt;/span&gt;       &lt;br /&gt;&lt;/div&gt; &lt;/span&gt;  &lt;h3 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;The long and winding road…&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;During the last years I worked on some more or less challenging projects. One of those was (and still is) my implementation of the (one and only?) &lt;strong&gt;&lt;em&gt;&lt;span style="color: #0000a0"&gt;Native VFP-TreeView&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;. I’m sorry but I have to tell you (again) that there is no “final thing” at the end of this post waiting for you – nope, still no final download is available! Instead, we have to talk about some features and (interesting?) aspects of my final implementation, first. &lt;strong&gt;Believe me, I’m going to show you some really cool stuff in the next chapters. I am sure you will benefit from some tips!&lt;/strong&gt;     &lt;br /&gt;&lt;/div&gt;  &lt;h3 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;Back to school!&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;After I went back to the drawing board I started thinking about how to approach the pending performance optimization issues. As I told you, those days the number one reason to rethink my first approach was the lack of speed when working with large datasets; the bigger the record count of the driving cursor, the slower most of the collapse/expand actions became. Another bottleneck was the complexity of the tree item class. The more features I implemented there, the more time was wasted during refresh/repaint for jumping through endless IF…ELSE…ENDIF and other DO CASE constructs just to find out which part of the object had to be made visible or hidden or re-colored and so on. Finally, I got stuck with a wonderful implementation of a cool looking tree item class (with dozens of features) that ate up too much refresh-cycle time.    &lt;br /&gt;More than ten visible TreeView items rendered my good looking tree useless. At that point in time I knew two things: 1st., It was possible to build a native VFP TreeView and 2nd.: it was abundantly clear that some extraordinary speed optimizations had to be applied to the key parts of the design.     &lt;br /&gt;&lt;/div&gt;  &lt;h3 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;h3 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;h3 style="text-align: left" dir="ltr" trbidi="on"&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;Let’s examine the “roots”!&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;div style="text-align: left" dir="ltr" trbidi="on"&gt;My initial idea to use a VFP GRID class as the basic container vehicle, I didn’t want to discard. Thus, I couldn’t discard using a driving cursor, either. The driving table/cursor was the logical starting point of my speed optimization efforts, then. If you read &lt;a href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TZuHqzAe0RI/AAAAAAAAHMg/ecONneblFoI/s1600-h/OffSiteLink%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="OffSiteLink" border="0" alt="OffSiteLink" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TZuHrP5gHPI/AAAAAAAAHMk/O_G4o1NEXZ0/OffSiteLink_thumb%5B1%5D.png?imgmax=800" width="11" height="7" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html" rel="nofollow" target="_blank"&gt;Part IV-b&lt;/a&gt; of this thread, you should have seen my old driving table structure which was pretty complex. The tree cursor got more and more columns over times, but the first 5 columns of my driving table’s structure listing in Part IV-b dealt with the hierarchical aspects of tree display.     &lt;br /&gt;Well, we all know how to setup and store parent-child relationships of hierarchical related data in a dbf table, don’t we? I’m sure, you recognize the fields of my driving cursor immediately: pNodeID and pParentID hold the primary and foreign key values implementing that parent-child aspect.     &lt;br /&gt;&lt;/div&gt; &lt;a href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaOdlweGIOI/AAAAAAAAHQo/4cb7EuyYmVg/s1600-h/2%5B15%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DYNA TreeView Driving Table" border="0" alt="DYNA TreeView Driving Table" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaOdmtNJRaI/AAAAAAAAHQs/wmW0OkkFAXc/2_thumb%5B10%5D.png?imgmax=800" width="514" height="329" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;br /&gt;The entries shown in the browse window above correspond to the screenshot of my demo TreeView in Part VI-b below.   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaOdnM33T_I/AAAAAAAAHQw/tMhS1rTB7uM/s1600-h/3%5B11%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DYNA TreeView display" border="0" alt="DYNA TreeView display" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaOdoIlXqmI/AAAAAAAAHQ0/HIqD9K_NobY/3_thumb%5B6%5D.png?imgmax=800" width="233" height="210" /&gt;&lt;/a&gt;   &lt;br /&gt;As long as we are using a Microsoft ActiveX TreeView control storing the relationship within two columns (one holding the primary key and the other holding the grouping/parental foreign key) is sufficient. There are several ways to reload the parent-child information of such a cursor back into an ActiveX TreeView: you may want to use a couple of SQL-Select statements within a recursive SCAN loop to select all sets of child entries to fill up your TreeView. Again, there are other ways to refill an OLE-TreeView, it is up to you to decide what approach fits best within your environment!   &lt;br /&gt;&lt;strong&gt;Now(!)&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;Try to create&lt;/em&gt;&lt;/strong&gt; a native VFP index that can be employed with SET ORDER TO to display the node records (shown above in the browse window screenshot) in hierarchical sorted sequence like in the screenshot below (where I SET OREDER TO ‘piorder’)!   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaOdobabnHI/AAAAAAAAHQ4/VkS-BCIJEpI/s1600-h/4%5B15%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Hierarchical sorted items" border="0" alt="Hierarchical sorted items" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaOdom9CH0I/AAAAAAAAHQ8/VF6463tW5R0/4_thumb%5B2%5D.png?imgmax=800" width="511" height="418" /&gt;&lt;/a&gt;   &lt;br /&gt;  &lt;div align="center"&gt;&lt;strong&gt;This should be the resulting browse window after your “very special” - index is active&lt;/strong&gt;&lt;/div&gt; &lt;em&gt;Any ideas? I’m waiting!&lt;/em&gt;   &lt;br /&gt;&lt;em&gt;I’m waiting!&lt;/em&gt;   &lt;br /&gt;&lt;em&gt;I’m still waiting!&lt;/em&gt;   &lt;br /&gt;&lt;em&gt;Again, I’m still waiting!&lt;/em&gt;   &lt;br /&gt;&lt;strong&gt;Right, you are!&lt;/strong&gt; Without having a single sort order column containing sorting expressions in the correct hierarchical sequence there is no easy trick to solve our dilemma! The following source code fragment shows my old implementation to rebuild the Piorder column values of my driver table:   &lt;br /&gt;  &lt;pre&gt;&lt;span style="color: green"&gt;*\\ Rebuild_SortOrder() gets called from .RebuildMetaData() or recursively(!)
*\\&lt;/span&gt;
&lt;span style="color: blue"&gt;LPARAMETERS&lt;/span&gt; tcParentID &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;String&lt;/span&gt;, tiOrderNo &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; @
&lt;span style="color: green"&gt;   *\\      tcParentID :== id of parent node for which all children are processed now&lt;/span&gt;
&lt;span style="color: green"&gt;   *\\      tiOrderNo :== next Piorder value to be set (passed in by reference!)&lt;/span&gt;
&lt;span style="color: blue"&gt;IF&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.lReadOnlyMetadata
&lt;span style="color: blue"&gt;&lt;span style="color: black"&gt;   &lt;/span&gt;RETURN&lt;/span&gt;
&lt;span style="color: blue"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: green"&gt;*[BS]: NOTE&amp;gt;&amp;gt; No parameter checking any more coz we'll have done that&lt;/span&gt;
&lt;span style="color: green"&gt;*\\ already in interface method &amp;quot;this.RebuildMetaData()&amp;quot;!&lt;/span&gt;
&lt;span style="color: green"&gt;*\\&lt;/span&gt;
&lt;span style="color: blue"&gt;LOCAL &lt;/span&gt;lnRecNo &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; ,;
      lnOldRecNo &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; ,;
      liIndent &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: green"&gt;*\\ remember from where we started&lt;/span&gt;
lnOldRecNo = &lt;span style="color: blue"&gt;RECNO&lt;/span&gt;()
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: green"&gt;*\\ Set OrderNo for current record&lt;/span&gt;
&lt;span style="color: blue"&gt;REPLACE&lt;/span&gt; PiOrder &lt;span style="color: blue"&gt;WITH&lt;/span&gt; m.tiOrderNo
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: blue"&gt;IF&lt;/span&gt; &lt;span style="color: blue"&gt;THIS&lt;/span&gt;.lSort &lt;span style="color: green"&gt;&amp;amp;&amp;amp; sub-sort children on PCCAPTION string&lt;/span&gt;
&lt;span style="color: blue"&gt;   SET&lt;/span&gt; &lt;span style="color: blue"&gt;ORDER&lt;/span&gt; &lt;span style="color: blue"&gt;TO&lt;/span&gt; PCCAPTION
&lt;span style="color: blue"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: green"&gt;*\\ process all children on the same level (siblings)&lt;/span&gt;
&lt;span style="color: blue"&gt;SCAN&lt;/span&gt; &lt;span style="color: blue"&gt;ALL&lt;/span&gt; &lt;span style="color: blue"&gt;FOR&lt;/span&gt; Pparentid == m.tcParentID
&lt;span style="color: green"&gt;   *\\ increment sort order value&lt;/span&gt;
   tiOrderNo = m.tiOrderNo + 1
&lt;span style="color: blue"&gt;   REPLACE&lt;/span&gt; Piorder &lt;span style="color: blue"&gt;WITH&lt;/span&gt; m.tiOrderNo
&lt;span style="color: green"&gt;   *//&lt;/span&gt;
&lt;span style="color: green"&gt;   *\\ remember record number&lt;/span&gt;
   lnRecNo = &lt;span style="color: blue"&gt;RECNO&lt;/span&gt;()
&lt;span style="color: blue"&gt;   IF&lt;/span&gt; Pichildcnt &amp;gt; 0
&lt;span style="color: green"&gt;      *\\ drill down recursively&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: blue"&gt;THIS&lt;/span&gt;.Rebuild_SortOrder(Pnodeid, @m.tiOrderNo)
&lt;span style="color: green"&gt;      *//&lt;/span&gt;
&lt;span style="color: blue"&gt;   ENDIF&lt;/span&gt;
&lt;span style="color: blue"&gt;   GOTO&lt;/span&gt; &lt;span style="color: blue"&gt;RECORD&lt;/span&gt; (m.lnRecNo)
&lt;span style="color: green"&gt;   *//&lt;/span&gt;
&lt;span style="color: blue"&gt;ENDSCAN&lt;/span&gt;
&lt;span style="color: blue"&gt;IF&lt;/span&gt; &lt;span style="color: blue"&gt;THIS&lt;/span&gt;.lSort
&lt;span style="color: blue"&gt;&lt;span style="color: black"&gt;   &lt;/span&gt;SET&lt;/span&gt; &lt;span style="color: blue"&gt;ORDER&lt;/span&gt; &lt;span style="color: blue"&gt;TO&lt;/span&gt;
&lt;span style="color: blue"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: blue"&gt;GOTO&lt;/span&gt; &lt;span style="color: blue"&gt;RECORD&lt;/span&gt; (m.lnOldRecNo)
&lt;span style="color: blue"&gt;RETURN&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Those days I did not change the cursor structure, but tried to solve the hierarchical-sorting problem using a more or less pragmatic approach. Sure you already can see the weakness of my solution: 
  &lt;br /&gt;Adding new items to the TreeView (into the cursor) results in a, at least partial, rewrite of the Piorder column. The closer to the root element an item is inserted, the more Piorder value REPLACEments have to be done. Typical “CRUD” ( Create, Replace, Update, Delete) operations can get really sluggish when applied to large TreeViews (with a lot of nodes &amp;gt; 10.000). On the other hand, my Rebuild_SortOrder() method is the perfect place to implement any additional sub-sorting (optional, I’m sorting all sibling child-nodes based on their caption).&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;All for One, One for All&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
If we, at least, want to dynamically retrieved each node caption from our driving cursor, then our three musketeers (Pnodeid, Pparentid and Piorder) finally meet D’Artagnan (Pccaption). Thus, my first approach started with a “four column minimum” driving table. Many more supporting columns were added to (1)speed up the TreeView refresh. Other column were added to (2)enhance flexibility at runtime. Columns such as Piindent and Pichildcnt belong to the first group; if we always instantly know how many levels deep a given node has to be “indented” before it can be displayed, this can be a big timesaver compared to always re-compute the indentation level for all tree nodes. Same is true for knowing about the number of children a tree node has. If we know the node’s child count during refresh in advance, this speeds up things a lot, especially, if we know that a given node doesn’t have any children (Pichildcnt == 0). 

&lt;br /&gt;In contrast to&amp;#160; Microsoft’s ActiveX TreeView control we cannot store additional&amp;#160; information inside each node object itself, because each VFP node object is a single class instance that is shared inside a grid column between all rows (roughly speaking:-). To get closer, let’s eye the checkbox implementation. If we have our TreeView displaying checkboxes before each of it’s nodes, we can query the checked-state of each node object. This true/false value is stored in a property of each node object of an ActiveX-TreeView directly. An ActiveX-TreeView with, let’s say, 1000 nodes has 1000 node objects each capable of storing the checked/unchecked information on its own. 

&lt;br /&gt;In contrast, our native VFP TreeView has only one real node class instance. The other 1000 nodes of our TreeView grid are virtual class instances only. They only get painted during refresh sharing the one and only real node object as some kind of punching tool for that. Since all node objects are more or less virtual, they must hold their “property” values stored in the fields of the corresponding (1000) rows of the driving cursor to make them persistent. That’s exactly what a VFP grid originally was designed for: display data stored in a cursor (an not property values of object collections :-) 

&lt;br /&gt;The screenshot below shows some of the additional columns that were added later in the game. BTW: the Pnmark column just stores the checkbox values just discussed. As my native VFP TreeView can have OptionGroups (the famous radio button groups) the Pnmark column accepts values greater then 2 (to be able to hold radio button groups of any member-count). 

&lt;br /&gt;

&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaOdpIqZctI/AAAAAAAAHRA/vaDzxUboOaY/s1600-h/6%5B8%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Extended node properties" border="0" alt="Extended node properties" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaOdpmF2IJI/AAAAAAAAHRE/7aU5P0JflPo/6_thumb%5B1%5D.png?imgmax=800" width="717" height="370" /&gt;&lt;/a&gt; 

&lt;br /&gt;Finally I’m going to explain another column “Pllastitem” you can see in the above screenshot. This flag (true/false) is used to simplify the implementation of the tree-lines algorithm a little bit. Below, you see a part of the screenshot my TreeView-Editor TreeView. The so called “Last items” are marked with red circles. The grid rows containing those definitions (see above) show the flag value 1 in their Pllastitem field. 

&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaOdpyzayFI/AAAAAAAAHRI/R3LupMzPsWw/s1600-h/image%5B7%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="TreeView&amp;#39;s &amp;quot;Last items&amp;quot;" border="0" alt="TreeView&amp;#39;s &amp;quot;Last items&amp;quot;" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaOdqfvfmoI/AAAAAAAAHRM/BBrsfTwR70k/image_thumb%5B1%5D.png?imgmax=800" width="201" height="180" /&gt;&lt;/a&gt; 

&lt;br /&gt;A “last item“ is the last node on it’s indentation level. Either, the following node (the one with Piorder+1) is a child node (then that node’s Piindent value is higher), or it is a sibling of the “last item’s node” parent node (then that node’s Piindent value is lower). There are two other extremes: either there is no &lt;em&gt;next&lt;/em&gt; node, then our “last item” node is the last node of the whole TreeView (with the highest Piorder value), or it is the first node in the TreeView, a so called root node (with the lowest Piorder value). If the node in question is a real “last item” node, then the vertical tree line of the indentation level ends on that grid row and must only be drawn to the mid of the row. Otherwise, for all other items, the grid line on the level has to be continued down to the next row. Watch the red circled spots to get the clue. Well, how would you implement fast refreshing vertical and horizontal tree lines up to over 30 levels of indentation? Either you drop all these lines like Vista explorer does (see below :-) 

&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TaOdrfDXAPI/AAAAAAAAHRQ/054aZnp_uro/s1600-h/7%5B7%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Vista explorer without tree lines" border="0" alt="Vista explorer without tree lines" src="http://lh6.ggpht.com/_MOmDLu4Rm5Y/TaOdsBl-3rI/AAAAAAAAHRU/YJibjCWk0Ls/7_thumb%5B1%5D.png?imgmax=800" width="221" height="372" /&gt;&lt;/a&gt; 

&lt;br /&gt;… or you have to store the needed information (is the current node the last on it’s own/current indentation level) in a separate column of your driving table. Next you have to figure out &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;how&lt;/em&gt; to update that information. I leave it to you to check my implementation shown below. 

&lt;br /&gt;

&lt;pre&gt;&lt;span style="color: green"&gt;*\\ Rebuild_LastNodeFlag()&lt;/span&gt;
&lt;span style="color: green"&gt;*\\&lt;/span&gt;
&lt;span style="color: green"&gt;*\\ Note: any ORDER that was SET gets released on exit!&lt;/span&gt;
&lt;span style="color: green"&gt;*\\&lt;/span&gt;
&lt;span style="color: blue"&gt;IF&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.lReadOnlyMetadata
&lt;span style="color: blue"&gt;   RETURN&lt;/span&gt;
&lt;span style="color: blue"&gt;ENDIF&lt;/span&gt;
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: blue"&gt;LOCAL &lt;/span&gt;lcParent &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: blue"&gt;String&lt;/span&gt; ,;
      liIndent &lt;span style="color: blue"&gt;As&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt; ,;
      lnRecNo  &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: blue"&gt;Integer&lt;/span&gt;

&lt;span style="color: green"&gt;*\\ Important: BLANK ALL PlLastItem metadata column entries first!&lt;/span&gt;
&lt;span style="color: green"&gt;*\\          BITTEST(pbit_state,4) := exclude root node(s)&lt;/span&gt;
&lt;span style="color: blue"&gt;BLANK&lt;/span&gt; &lt;span style="color: blue"&gt;FIELDS&lt;/span&gt; Pllastitem &lt;span style="color: blue"&gt;ALL&lt;/span&gt; &lt;span style="color: blue"&gt;FOR&lt;/span&gt; NOT &lt;span style="color: blue"&gt;BITTEST&lt;/span&gt;(pbit_state,4)
&lt;span style="color: green"&gt;*//&lt;/span&gt;
&lt;span style="color: green"&gt;*\\ This gets a little bit tricky now:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;br /&gt;&lt;br /&gt;SET&lt;/span&gt; &lt;span style="color: blue"&gt;ORDER&lt;/span&gt; &lt;span style="color: blue"&gt;TO&lt;/span&gt; PIORDER &lt;span style="color: blue"&gt;DESCENDING&lt;/span&gt; &lt;span style="color: green"&gt;&amp;amp;&amp;amp; TreeView definition now upside-down&lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;GO&lt;/span&gt; &lt;span style="color: blue"&gt;TOP &lt;span style="color: green"&gt;&amp;amp;&amp;amp; we are on the last TreeView node now&lt;/span&gt; &lt;/span&gt;&lt;span style="color: green"&gt;*\\ Scan from bottom to top!&lt;br /&gt;&lt;/span&gt;&lt;span style="color: green"&gt;*\\ ISBLANK() serves as a &amp;quot;virtual&amp;quot; flag field value: “not visited”&lt;/span&gt;
&lt;span style="color: blue"&gt;SCAN&lt;/span&gt; &lt;span style="color: blue"&gt;ALL&lt;/span&gt; &lt;span style="color: blue"&gt;FOR&lt;/span&gt; ISBLANK(Pllastitem)
&lt;span style="color: blue"&gt;&lt;/span&gt;   lnRecNo = &lt;span style="color: blue"&gt;RECNO&lt;/span&gt;()
&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;   lcParent = Pparentid
   liIndent = Piindent
   &lt;span style="color: green"&gt;*\\ Two simple rules apply here: &lt;/span&gt;&lt;span style="color: green"&gt;   &lt;br /&gt;   *\\ 1st: The last node (the one with the highest Piorder value) of each level of indentation must 
   *\\      be flagged TRUE in Pllastitem field!
   *\\ 2nd: Each trailing sibling node (all nodes with the same Piindent value and the same Pparentid 
   *\\      value that have a Piorder value less than the current node) can NOT be the &amp;quot;last-node&amp;quot;&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: green"&gt;*\\ Thus:&lt;/span&gt;
&lt;span style="color: green"&gt;   *\\    Running from bottom to top traversing our metadata cursor processing only BLANKed fields&lt;/span&gt;
   &lt;span style="color: green"&gt;*\\    the first node record we'll find has to be the &amp;quot;last-node&amp;quot; of his 
   *\\    &lt;/span&gt;&lt;span style="color: green"&gt;indentation level/(child)group.&lt;/span&gt;
&lt;span style="color: blue"&gt;   REPLACE&lt;/span&gt; Pllastitem &lt;span style="color: blue"&gt;WITH&lt;/span&gt; .T.
&lt;span style="color: green"&gt;   *\\ Now skip from the bottom of the TreeView cursor &amp;quot;up&amp;quot; one line due to DESCENDING ordering&lt;/span&gt;
&lt;span style="color: blue"&gt;   SKIP&lt;/span&gt;
&lt;span style="color: green"&gt;   *\\ from there walk up the TreeView definition &lt;/span&gt;&lt;span style="color: green"&gt;and replace all sibling nodes’ Pllastitem 
   *\\ field with .F. (coz they all belong to the same group of siblings of our just flagged 
   *\\ “last node” in the code above).&lt;/span&gt;&lt;span style="color: green"&gt; Writing .T. or .F. to the cursor clears the BLANK state.
   *\\ This will exclude the group of sibling nodes just processed from the next SCAN loop&lt;/span&gt;
&lt;span style="color: blue"&gt;   REPLACE&lt;/span&gt; &lt;span style="color: blue"&gt;REST&lt;/span&gt; Pllastitem &lt;span style="color: blue"&gt;WITH&lt;/span&gt; .F. &lt;span style="color: blue"&gt;FOR&lt;/span&gt; Pparentid == m.lcParent AND Piindent = m.liIndent
&lt;span style="color: green"&gt;   *\\ finally reposition record pointer (set back to initial position &amp;gt;&amp;gt; last TreeView node)&lt;/span&gt;
&lt;span style="color: blue"&gt;   GOTO&lt;/span&gt; &lt;span style="color: blue"&gt;RECORD&lt;/span&gt; (m.lnRecNo)
&lt;span style="color: green"&gt;   *// That's it. The SCAN now again goes &amp;quot;up&amp;quot; the treedef cursor until it finds another &lt;/span&gt;
&lt;span style="color: green"&gt;   *// BLANK record (group). Otherwise we're done.&lt;/span&gt;
&lt;span style="color: blue"&gt;ENDSCAN&lt;/span&gt;
&lt;span style="color: green"&gt;*\\&lt;/span&gt;
&lt;span style="color: blue"&gt;SET&lt;/span&gt; &lt;span style="color: blue"&gt;ORDER&lt;/span&gt; &lt;span style="color: blue"&gt;TO&lt;/span&gt;&lt;/pre&gt;

&lt;h3&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;Wherever there is light, there are shadows&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;After all those days and nights I’ve tried to create an (almost) perfect native VFP TreeView, I can say, that both types (the ActiveX AND the native VFP one) have their pros &amp;amp; cons! I don’t want to repeat all OLE-control related facts I already talked about in the past in detail. Today I want to concentrate on the downsides a VFP Grid-based solution has. To make a long story short: 
  &lt;br /&gt;&lt;strong&gt;Displaying &amp;amp; manipulating hierarchical ordered records (based on a one-to-many parent-child relationship) with good performance using a VFP GRID definitely is no straight forward task!&lt;/strong&gt; Below you see a screenshot of VFP’s document view window with my so called ‘DynaGridController’ class opened in VFP’s class designer. The dynaGridController is the workhorse class “behind the scenes“ that implements (and encapsulate) all basic TreeView engine behavior. 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TaOdscXqNJI/AAAAAAAAHRg/7PSpyqqoaF8/s1600-h/5%5B21%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="DynaGridController methods" border="0" alt="DynaGridController methods" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TaOdtLPlNNI/AAAAAAAAHRk/b1HOsQzTl58/5_thumb%5B12%5D.png?imgmax=800" width="414" height="1051" /&gt;&lt;/a&gt; 

  &lt;br /&gt;A lot of functionality only is necessary to collapse/expand tree nodes, to indent items correctly, to navigate the TreeView using keystrokes and other stuff. I am sure, the implementation of most of all these ‘odd things’ was much easier for Microsoft while creating their ActiveX version! &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;&lt;span style="color: navy"&gt;What comes next&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Next time I will present you my own “hierarchical indexing” technique. You can utilize a slightly varied version of it when working with SQL Server 2008. Yep, they got it there, too! But you can only see there how to use it. I will show you how to implement it! The tricky and (copyright) protected part is, that you do not have to use multiple fields to create a TreeView like hierarchical sequence!&amp;#160; &lt;em&gt;&lt;strong&gt;Be prepared to learn something new ;-)&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color: #ff8000; font-size: small"&gt;&amp;lt;To be continued…&amp;gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt; 

  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;hr /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html" href="http://myvfpblog.blogspot.com/2008/02/native-treeview-part-iv-b.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Previous Chapter" border="0" alt="Previous Chapter" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/TZuHozk9i8I/AAAAAAAAHMs/pYvsMEGE8Ak/NavBack_48_RGBA%5B6%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Complex Controls Home (TOC)" border="0" alt="Complex Controls Home (TOC)" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TZuHpcMGOTI/AAAAAAAAHMQ/v3u9l_1MZ5o/NavHome_48_RGBA%5B4%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Next Chapter" border="0" alt="Next Chapter" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TZuHpr8bueI/AAAAAAAAHMU/vLPpMHd2v4U/NavForward_48_RGBA%5B5%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26167158-3095915313833981121?l=myvfpblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myvfpblog.blogspot.com/feeds/3095915313833981121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26167158&amp;postID=3095915313833981121&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/3095915313833981121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26167158/posts/default/3095915313833981121'/><link rel='alternate' type='text/html' href='http://myvfpblog.blogspot.com/2011/04/native-treeview-part-v.html' title='A Native TreeView (Part V)'/><author><name>Burkhard</name><uri>http://www.blogger.com/profile/11631168041975170500</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp3.blogger.com/_MOmDLu4Rm5Y/RybmrJ-z5tI/AAAAAAAAAAM/wqu-JWqzRqE/s200/bst.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_MOmDLu4Rm5Y/TZuHozk9i8I/AAAAAAAAHMs/pYvsMEGE8Ak/s72-c/NavBack_48_RGBA%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26167158.post-5809598387180603253</id><published>2011-04-05T23:32:00.000+02:00</published><updated>2011-05-03T10:52:34.942+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complex Controls'/><title type='text'>A Native TreeView (Part IV-b)</title><content type='html'>&lt;p&gt;&lt;font color="#ff8040"&gt;&lt;strong&gt;Version: 2.00.00 - Last &lt;/strong&gt;&lt;strong&gt;Update: Sunday the 01th, May 2011 - 10:25:00 &lt;font color="#ff0000" size="3"&gt;(I added a more obvious download link:-)&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://myvfpblog.blogspot.com/2007/11/native-treeview-part-iv.html" href="http://myvfpblog.blogspot.com/2007/11/native-treeview-part-iv.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Previous Chapter" border="0" alt="Previous Chapter" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/Tb_CSJfxnpI/AAAAAAAAHhc/hxRwXywfCxU/NavBack_48_RGBA2.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html" href="http://myvfpblog.blogspot.com/2009/09/visual-foxpro-complex-controls-no.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Complex Controls Home (TOC)" border="0" alt="Complex Controls Home (TOC)" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/SsHLpbVm-HI/AAAAAAAAHhg/R_sS47idNpk/NavHome_48_RGBA1.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt;&lt;a title="http://myvfpblog.blogspot.com/2011/04/native-treeview-part-v.html" href="http://myvfpblog.blogspot.com/2011/04/native-treeview-part-v.html"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Next Chapter" border="0" alt="Next Chapter" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TZuKlan-sBI/AAAAAAAAHOw/0iwb3e4lCAs/NavForward_48_RGBA%5B10%5D.png?imgmax=800" width="48" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;hr /&gt;  &lt;h3&gt;&lt;strong&gt;&lt;font color="#000080"&gt;FoxPro Rocks! This is all about how to create complex controls using native VFP only!&lt;/font&gt;&lt;/strong&gt;&lt;/h3&gt;  &lt;h1&gt;&lt;font color="#000080"&gt;Intro&lt;/font&gt;&lt;/h1&gt;  &lt;p&gt;&lt;a title="RightClickMenu Beta 0.8" href="http://resources.foxquill.de/RightClickMenu_B08.zip" rel="nofollow"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Start download of RightClickMenu_B08.zip here!" border="0" alt="Start download of RightClickMenu_B08.zip here!" align="left" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsHLqHoCBkI/AAAAAAAAHhk/r676wRNQ0FA/Download_0011.png?imgmax=800" width="57" height="76" rightclickmenu="rightclickmenu" beta="beta" 0.8??="0.8??" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;Wow, finally! I found the time to finish part IV-b of my &amp;quot;Native TreeView&amp;quot; series - gosh... &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;I also added a link to the latest downloadable ZIP file containing all beta version sources and resources &amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style="font-family: arial"&gt;A new (BETA) version of the right-click menu is available (I spent some time on debugging an enhancing it)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;&lt;strong&gt;&lt;font color="#9b00d3"&gt;&amp;lt;&amp;lt; Download from there the &lt;em&gt;right-click menu&lt;/em&gt; thing&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="center"&gt;&lt;font color="#ff0080" size="4"&gt;&lt;strong&gt;Yep! Here it comes: a first (downloadable!) &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;font color="#ff0080" size="4"&gt;&lt;strong&gt;impression of the all-native VFP TreeView thing :-) &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font color="#ff0080" size="5"&gt;Just click image below!&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;font color="#ff0080" size="4"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="http://resources.foxquill.de/gridtree_alpha_01.zip" href="http://resources.foxquill.de/gridtree_alpha_01.zip" rel="nofollow" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Click to download gridtree_alpha_01.zip" border="0" alt="Click to download gridtree_alpha_01.zip" src="http://lh3.ggpht.com/_MOmDLu4Rm5Y/TI-z0d-ufKI/AAAAAAAAHho/lpG7dTX64gI/1%5B2%5D.png?imgmax=800" width="678" height="471" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;What you get within the &lt;em&gt;gridtree_alpha_01.zip&lt;/em&gt; file are some icons that are/can be used to decorate the nodes, the driving table files &lt;em&gt;treeviews.dbf/fpt/cdx&lt;/em&gt; and the demo (a VFP 9.0 executable) Sorry, I dropped the sources for that old demo a long time ago – but you’re welcome to recreate them if you have a de-compiler (like ReFox).&lt;/p&gt;  &lt;p&gt;The driving table’s structure looks like:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="867"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="197"&gt;         &lt;h6&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Column Name&lt;/strong&gt;&lt;/font&gt;&lt;/h6&gt;       &lt;/td&gt;        &lt;td valign="top" width="668"&gt;         &lt;h6&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/font&gt;&lt;/h6&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pNodeid&lt;/td&gt;        &lt;td valign="top" width="668"&gt;primary key&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pParentid&lt;/td&gt;        &lt;td valign="top" width="668"&gt;parent key&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCcaption&lt;/td&gt;        &lt;td valign="top" width="668"&gt;node caption&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pIorder&lt;/td&gt;        &lt;td valign="top" width="668"&gt;sort order (to achieve hierarchical sequence)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pIindent&lt;/td&gt;        &lt;td valign="top" width="668"&gt;indentation level&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pIchildcnt&lt;/td&gt;        &lt;td valign="top" width="668"&gt;number of child nodes on next level of indentation&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pLvisible&lt;/td&gt;        &lt;td valign="top" width="668"&gt;internal collapsed/expanded marker&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pLexpanded&lt;/td&gt;        &lt;td valign="top" width="668"&gt;controls +/- symbols&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pLlastitem&lt;/td&gt;        &lt;td valign="top" width="668"&gt;&amp;lt;.T.&amp;gt; if the current node is the last one (child node) in a branch&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pNmark&lt;/td&gt;        &lt;td valign="top" width="668"&gt;&amp;lt;1&amp;gt; if node is marked (if option group this is the #pointer# to the selected option node)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pBit_Objs&lt;/td&gt;        &lt;td valign="top" width="668"&gt;bit field: node layout (not implemented yet)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pBit_Visib&lt;/td&gt;        &lt;td valign="top" width="668"&gt;bit field: visible node items &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pBit_State&lt;/td&gt;        &lt;td valign="top" width="668"&gt;bit field: node items states&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pBit_Lines&lt;/td&gt;        &lt;td valign="top" width="668"&gt;bit field: tree lines states&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pBit_Back&lt;/td&gt;        &lt;td valign="top" width="668"&gt;bit field: ??&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCimg_Expd&lt;/td&gt;        &lt;td valign="top" width="668"&gt;expanded node image&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCimg_Coll&lt;/td&gt;        &lt;td valign="top" width="668"&gt;?? check it out yourself ;-)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCicon_Def&lt;/td&gt;        &lt;td valign="top" width="668"&gt;default node image&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCicon_Sel&lt;/td&gt;        &lt;td valign="top" width="668"&gt;selected node image&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCicon_Foc&lt;/td&gt;        &lt;td valign="top" width="668"&gt;focused node image&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCicon_Grp&lt;/td&gt;        &lt;td valign="top" width="668"&gt;grouped node(s) image&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCicon_Dis&lt;/td&gt;        &lt;td valign="top" width="668"&gt;disabled node image&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pIcaptfore&lt;/td&gt;        &lt;td valign="top" width="668"&gt;caption fore color&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pIcaptback&lt;/td&gt;        &lt;td valign="top" width="668"&gt;caption back color&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pIcaptbold&lt;/td&gt;        &lt;td valign="top" width="668"&gt;caption bold flag&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pCtext&lt;/td&gt;        &lt;td valign="top" width="668"&gt;sub-caption text&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pItextfore&lt;/td&gt;        &lt;td valign="top" width="668"&gt;sub-caption fore color&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pItextback&lt;/td&gt;        &lt;td valign="top" width="668"&gt;sub-caption back color&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pLtextbold&lt;/td&gt;        &lt;td valign="top" width="668"&gt;sub-caption bold flag&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pMhelp&lt;/td&gt;        &lt;td valign="top" width="668"&gt;help text (not implemented)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="197"&gt;pMerror&lt;/td&gt;        &lt;td valign="top" width="668"&gt;error text (not implemented)&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Some of these settings are not fully implemented in this alpha version. Thus, don’t get confused if not all features are working. You may try to right click on the tree nodes to get some additional (re-)actions :-) Please keep in mind that my latest version doesn’t use a &lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="VFP TreeView grid with " border="0" alt="VFP TreeView grid with " align="right" src="http://lh5.ggpht.com/_MOmDLu4Rm5Y/TI-z06NqEkI/AAAAAAAAHFM/nAVI5s30GPE/2%5B22%5D.png?imgmax=800" width="128" height="173" :-)?=":-)?" row-height="row-height" trashed?="trashed?" /&gt;driving cursor complex like the given one! This solution was one of the first to test if it is possible to create a VFP-native TreeView, at all! To prove that I’m using nothing but a regular VFP GRID internally, try to locate the grid’s row-height resizing area (in the upper left corner of the grid area) and then resize the grid’s row height &amp;gt;&amp;gt;&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a title="gridtree_alpha_01.zip" href="http://resources.foxquill.de/gridtree_alpha_01.zip" rel="nofollow" target="_blank"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Start download of gridtree_alpha_01.zip here!" border="0" alt="Start download of gridtree_alpha_01.zip here!" align="left" src="http://lh4.ggpht.com/_MOmDLu4Rm5Y/SsHLqHoCBkI/AAAAAAAAHhs/mmDQfQDERgs/Download_0017.png?imgmax=800" width="57" height="76" rightclickmenu="rightclickmenu" beta="beta" 0.8??="0.8??" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: arial"&gt;&lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;&amp;lt;&amp;lt; Download from there the &lt;em&gt;native VFP TreeView&lt;/em&gt; thing!&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For those of you who want even more background information – here is the listing of a little helper routine I used during initial development to recreate the diverse indices of the driving table. As you can see there are many of them to speed things up (for large tables) using VFP’s rushmore technology. You may read my short remarks in the code fragment to get an idea for what the indices/fields are used, then.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Deleting all CDX tags&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;DELETE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ Transferring the flag bits from pBit_Visib and pBit_State to pBit_Objs&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_IS_ENABLED&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_IS_ENABLED&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 0) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_State,0)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_IS_FOCUSED (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_IS_FOCUSED&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 1)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_IS_MARKED&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_IS_MARKED&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 2) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_State,1)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_IS_ROOTNODE&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_IS_ROOTNODE&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 3) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_State,4)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_IS_OPTIONGROUP&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_IS_OPTIONGROUP&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 4) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_State,2)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_ROOTLINES (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_ROOTLINES &lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 5)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_LINES&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_LINES&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 6) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,0)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_EXPANDER&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_EXPANDER&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 7) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,1)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_ICON&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_ICON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 8) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,2)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_ICON (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_ICON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 9)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_CHECKBOX&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_CHECKBOX&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 10) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,3)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_OPTIONBUTTON&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_OPTIONBUTTON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 11) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,4)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_CAPTION&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_CAPTION&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 12) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,5)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_CAPTION (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_CAPTION&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 13)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_SUBTEXT&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_SUBTEXT&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 14) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,6)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_SUBTEXT (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_SUBTEXT&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 15)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_OVERLAY&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_OVERLAY&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 16) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,7)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_OVERLAY (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_OVERLAY&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 17)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_HELPICON&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_HELPICON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 18) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,8)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_HELPICON (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_HELPICON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 19)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_ERRORICON&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_ERRORICON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 20) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,9)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_ERRORICON (nur löschen)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_ERRORICON&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 21)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_BACKGROUND&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_BACKGROUND&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITSET&lt;/span&gt;(pbit_objs, 22) &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITTEST&lt;/span&gt;(pBit_Visib,10)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_BACKGROUND (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_BACKGROUND&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 23)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_EXTENSION (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_EXTENSION&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 24)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_EXTENSION (nur löschen - only deleting)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_EXTENSION&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 25)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_USER (nur löschen)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_USER&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 26)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ NODE_HAS_DYNAMIC_USER (nur löschen)&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Processing : NODE_HAS_DYNAMIC_USER&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;REPLACE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt; pbit_objs &lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BITCLEAR&lt;/span&gt;(pbit_objs, 27)
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ (re)creating indices&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Deleting all CDX tags&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;DELETE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ALL&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Flushing dbf to disk&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;FLUSH&lt;/span&gt; &lt;span style="color: #0000ff"&gt;force&lt;/span&gt;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #008000"&gt;*\\ master indices&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Indexing on : PNODEID&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; PNODEID	&lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;PNODEID&lt;/span&gt;&amp;quot;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Indexing on : PPARENTID&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; PPARENTID	&lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;PPARENTID&lt;/span&gt;&amp;quot;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Indexing on : PCCAPTION&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; PCCAPTION	&lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;PCCAPTION&lt;/span&gt;&amp;quot;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Indexing on : PIORDER&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; PIORDER	&lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;PIORDER&lt;/span&gt;&amp;quot;
&lt;span style="color: #008000"&gt;*//&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;WAIT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;WINDOW&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NOWAIT&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;Indexing on : PIORDER&lt;/span&gt;&amp;quot;
&lt;span style="color: #0000ff"&gt;INDEX&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; PIORDER	&lt;span style="color: #0000ff"&gt;TAG&lt;/span&gt; &amp;quot;&lt;span style="background-color: #ffff00; color: red"&gt;PIORDERVIS&lt;/span&gt;&amp;quot; &lt;span style="color: #0000ff"&gt;FOR&lt;/span&gt; PLVISIBLE
&lt;spa
