This may seem fairly obvious but it's something that may catch up many FoxPro developers in screen design, as it just did me
Setting AutoSize to True is a great way to identify how wide a label needs to be to show its entire content. However, you may be tempted to set the AutoSize before showing the label so your screen doesn't appear to resize dynamically.
The catch here is that if the object isn't visible, AutoSize will not change.
Want to try it out?
_SCREEN.AddObject("lox","label")
lo = _SCREEN.lox
? lo.Width && Returns 100
lo.Caption = "Hello"
lo.AutoSize = .T.
? lo.Width && Still Returns 100
lo.Visible = .T.
? lo.Width && Now Returns 29
This isn't really a bug - after all, AutoSize should only ever decide what width to use once it knows it's being seen, but it can trip you up if you are trying to layout objects on a screen before making them visible.
The solution? Use LockScreen before doing any of the work. That way, AutoSize will still work properly but the user won't see you doing anything funky until you're completely done. LockScreen preserves the screen until you unlock it.
Using the same example:
_SCREEN.LockScreen = .T.
lo.Caption = "Hello my name is George"
MESSAGEBOX(lo.Width) && Shows 140 but won't show the new label
_SCREEN.LockScreen = .F.
Now you can see it working.
Setting AutoSize to True is a great way to identify how wide a label needs to be to show its entire content. However, you may be tempted to set the AutoSize before showing the label so your screen doesn't appear to resize dynamically.
The catch here is that if the object isn't visible, AutoSize will not change.
Want to try it out?
_SCREEN.AddObject("lox","label")
lo = _SCREEN.lox
? lo.Width && Returns 100
lo.Caption = "Hello"
lo.AutoSize = .T.
? lo.Width && Still Returns 100
lo.Visible = .T.
? lo.Width && Now Returns 29
This isn't really a bug - after all, AutoSize should only ever decide what width to use once it knows it's being seen, but it can trip you up if you are trying to layout objects on a screen before making them visible.
The solution? Use LockScreen before doing any of the work. That way, AutoSize will still work properly but the user won't see you doing anything funky until you're completely done. LockScreen preserves the screen until you unlock it.
Using the same example:
_SCREEN.LockScreen = .T.
lo.Caption = "Hello my name is George"
MESSAGEBOX(lo.Width) && Shows 140 but won't show the new label
_SCREEN.LockScreen = .F.
Now you can see it working.
Comments