While it's a great product, there are just times that FoxPro really drives me nuts.
A great example? _SCREEN.Activeform.
I know people have ranted about this for years so now it's my turn.
_SCREEN.Activeform returns a pointer to the current form object. But what if there's no current form?
Does it return NULL? An empty string?
No. It errors out.
Does anyone know what the reasoning was here?
Now, you can verify it by doing
** Now you KNOW there's no form there.
but then you still have to do a
IF NOT ISNULL(_SCREEN.Activeform)
Note that you can't use VARTYPE() because Activeform isn't a variable. (example : VARTYPE(_SCREEN.activeform)) - which is a shame because VARTYPE is the faster of the two.
In that blog post, if you read the comments, you'll hear things like "use PEMSTATUS" instead of Type for objects but the problem here is that ActiveForm IS a valid property for _SCREEN (unless you actually want to refer to it).
I thought I could be clever and maybe look at _SCREEN.FormCount but guess what? If a form is defined but hidden, the ActiveForm is still not there but FormCount is 1.
So the end result is you HAVE to use the slower, uglier type approach to get out of these annoying checks for _SCREEN.Activeform.
** do something with it - _SCREEN.Activeform
** don't do anything otherwise you'll error out.
Now will users notice the performance penalty? That's a tough call - but I do know that it adds three unnecessary lines of code which adds to the Refactorability of a program.