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
IF TYPE("_SCREEN.Activeform")="U"
** Now you KNOW there's no form there.
ELSE
ENDIF
but then you still have to do a
IF NOT ISNULL(_SCREEN.Activeform)
ENDIF
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.
IF TYPE("_SCREEN.Activeform")<>"U"
** do something with it - _SCREEN.Activeform
ELSE
** don't do anything otherwise you'll error out.
ENDIF
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.
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
IF TYPE("_SCREEN.Activeform")="U"
** Now you KNOW there's no form there.
ELSE
ENDIF
but then you still have to do a
IF NOT ISNULL(_SCREEN.Activeform)
ENDIF
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.
IF TYPE("_SCREEN.Activeform")<>"U"
** do something with it - _SCREEN.Activeform
ELSE
** don't do anything otherwise you'll error out.
ENDIF
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.
Comments
IF TYPE("_SCREEN.Activeform.Name") = "C"
*- Do something with it
ENDIF
The typecheck for the property digs into the object if it exists. The type-function internal error catch will catch the error (but sets the MESSAGE() returned value. what's up with that, anyhow?)
No need for the ISNULL() check.
Sietse Wijnker