Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
What's wrong with this variable?
Message
General information
Forum:
Visual FoxPro
Category:
Troubleshooting
Miscellaneous
Thread ID:
00818431
Message ID:
00818512
Views:
14
Good idea to do it in the loop. Should have thought of that myself.


>I checked some of my routines and the object that was iterated during the FOR EACH..ENDFOR is usable after exiting the loop even if it was a collection such as this.controls. Don't know why it wouldn't be availble everytime.
>
>BTW,
>
>If you did it this way then the whole discussion might be moot <bg>.
>
>
>myform.method()
>  LOCAL lo, lc
>  lc = WPARENT( THIS.NAME )
>  FOR EACH lo IN _VFP.FORMS
>    IF UPPER( lo.NAME ) == UPPER( lc ) AND lo.baseclass='Form'
>      IF lo.WINDOWSTATE = 1
>          lo.WINDOWSTATE = 0
>         lo.REFRESH()
>       ENDIF
>      EXIT
>    ENDIF
>  ENDFOR
>
>
>
>>Hi Tom,
>>I think you hit it. When working on a collection instead of an array it works different. Have to remember that.
>>In my example, I was finding a match. I would trace it and see where it hit the "exit" command. It ALMOST makes sense that an object could go out of scope when leaving a for next loop but not a variable. Almost but not quite, but I'll live with it.
>>
>>
>>>Bill,
>>>
>>>Maybe its because the top example is done on a collection instead of on the array like in your second example.
>>>
>>>I am not sure in the first example if you are actually achievieng the exit from the FOR..ENDFOR because of a match or is it just dropping through when its done with no match.
>>>
>>>If it is dropping through, then it would make sense that lo would not be an object any longer because the FOR..Endfor has terminated.
>>>
>>>We have always assigned our matching object to a memory variable or a property when exiting the loop upon a sucessful match.
>>>
>>>Don't have to do it that way, but I know it works.
>>>
>>>HTH
>>>
>>>>Ok, I can deal with that. Don't understand it, but I can deal with it.
>>>>But how about explaining these 2 examples:
>>>>
>>>>myform.method()
>>>>  LOCAL lo, lc, loParent
>>>>  lo = 'some text'                            && locals window shows lo = 'some text'
>>>>  lc = WPARENT( THIS.NAME )
>>>>  FOR EACH lo IN _VFP.FORMS
>>>>    IF UPPER( lo.NAME ) == UPPER( lc )
>>>>      loParent = lo
>>>>      EXIT                                    && locals window shows lo = object
>>>>    ENDIF
>>>>  ENDFOR
>>>>  IF TYPE( 'loParent.NAME' ) = 'C' ;          && locals window shows lo = .F. !!!!!!!!!!!!
>>>>      AND loParent.WINDOWSTATE = 1
>>>>    loParent.WINDOWSTATE = 0
>>>>    loParent.REFRESH()
>>>>  ENDIF
>>>>
>>>>Obviously VFP is working with the local variable that I set to 'some text', it was changed from character to .F.
>>>>I'm guessing that means that a for each loop confiscates a variable from the method for it's own use, but doesn't restore the value back when it's done, instead it just sets it's value to .f.
>>>>
>>>>LOCAL lc, la( 5 )
>>>>la( 1 ) = 'A'
>>>>la( 2 ) = 'B'
>>>>la( 3 ) = 'C'
>>>>la( 4 ) = 'D'
>>>>la( 5 ) = 'E'
>>>>FOR EACH lc IN la
>>>>  IF lc = la( 3 )
>>>>    EXIT
>>>>  endif
>>>>ENDFOR
>>>>? lc                   && prints 'C' not .F.      and locals window shows lc = 'C'
>>>>
>>>>So I guess a for each loop only confiscates variables and sets them to false if I'm cycling through objects. Cycling through characters leaves it just the way I would expect.
>>>>
>>>>Is there any logic to that? or is it just a "feature" I have to live with?
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>>Your FOR EACH...ENDFOR creates and uses its own copy of the lo var, not the one from your Local declaration.
>>>>>
>>>>>You have to transfer the object reference to a an actual memory variable like you have done in your second example and that is why it works.
>>>>>
>>>>>Thats also why the lo variable continures to show a .f. in the locals window.
>>>>>
>>>>>HTH,
>>>>>
>>>>>
>>>>>>I lost something here.
>>>>>>Why is it out of scope? The locals window still shows that it exists, just the wrong type(). I assume that means that it's still in scope.
>>>>>>
>>>>>>>You have gone out of scope in the FOR...ENDFOR in the first example without making a memory variable reference to the lo object being evaluated.
>>>>>>>
>>>>>>>
>>>>>>>>I'm using VFP 7.0
>>>>>>>>
>>>>>>>>This doesn't work
>>>>>>>>
>>>>>>>>myForm.method()
>>>>>>>>  LOCAL lo, lc
>>>>>>>>  lc = WPARENT( THIS.NAME )
>>>>>>>>  FOR EACH lo IN _VFP.FORMS
>>>>>>>>    IF lo.NAME == lc
>>>>>>>>      EXIT                             && Locals window shows lo as object here
>>>>>>>>    ENDIF
>>>>>>>>  ENDFOR
>>>>>>>>  IF TYPE( 'lo.NAME' ) = 'C' ;         && Locals window shows lo as .F. here
>>>>>>>>      AND lo.WINDOWSTATE = 1
>>>>>>>>    lo.WINDOWSTATE = 0
>>>>>>>>  ENDIF
>>>>>>>>
>>>>>>>>but this does
>>>>>>>>
>>>>>>>>myForm.method()
>>>>>>>>  LOCAL lo, lc, loParent
>>>>>>>>  lc = WPARENT( THIS.NAME )
>>>>>>>>  FOR EACH lo IN _VFP.FORMS
>>>>>>>>    IF lo.NAME == lc
>>>>>>>>      loParent = lo
>>>>>>>>      EXIT                             && Locals window shows lo as object here
>>>>>>>>    ENDIF
>>>>>>>>  ENDFOR
>>>>>>>>  IF TYPE( 'loParent.NAME' ) = 'C' ;   && Locals window shows lo as .F. here
>>>>>>>>      AND loParent.WINDOWSTATE = 1
>>>>>>>>    loParent.WINDOWSTATE = 0
>>>>>>>>  ENDIF
>>>>>>>>
Bill Morris
Previous
Reply
Map
View

Click here to load this message in the networking platform