PRB: SAY Field Refresh Option Causes Hidden Window to Reappear

Last reviewed: December 18, 1997
Article ID: Q112484
2.50b     | 2.00 2.50 2.50a 2.50b | 2.50 2.50a 2.50b
MACINTOSH | MS-DOS                | WINDOWS
kbprg kbprb kbui kbdisplay

The information in this article applies to:

  • Microsoft FoxPro for Macintosh, version 2.5b
  • Microsoft FoxPro for MS-DOS, versions 2.0, 2.5, 2.5a, and 2.5b
  • Microsoft FoxPro for Windows, versions 2.5, 2.5a, and 2.5b

SYMPTOMS

When you are running a screen set with multiple windows in which one has been hidden, the hidden window reappears even when a SHOW WINDOW command has not been executed.

CAUSE

In addition to other screen objects, the hidden window contains at least one SAY/output object, and the Refresh Output Field check box is selected. A SHOW GETS command that does not include a WINDOW clause is placed in a user-defined code snippet to update objects on the screen.

To understand why this behavior occurs requires looking at the generated screen code. When the FoxPro screen code generator (GENSCRN.PRG) creates the screen program (.SPR) from a screen with a SAY/output field, the Refresh property of which has been checked, it generates code in the SHOW snippet which looks like the following:

   IF SYS(2016) = "SCR1" OR SYS(2016) = "*"
      ACTIVATE WINDOW scr1 SAME
      @ 1.000,2.800 SAY company ;
         SIZE 1.000,80.800, 0.000 ;
         FONT "MS Sans Serif", 8
   ENDIF

As documented in the "Language Reference" and the online Help system, SYS(2016) returns the name of the window to be refreshed by the last SHOW GETS command executed. If SHOW GETS is called without the optional WINDOW clause, SYS(2016) will return an asterisk (*). It is the ACTIVATE WINDOW command in the IF ... ENDIF block above that causes the hidden window to be redisplayed.

The following command will update the objects on the current window only:

   SHOW GETS WINDOW (WOUTPUT())

RESOLUTION

See "Workarounds" in the "Steps to Reproduce Behavior" section below.

STATUS

This behavior is by design.

MORE INFORMATION

WARNING: ANY USE OF THE CODE PROVIDED IN THIS ARTICLE IS AT YOUR OWN RISK. Microsoft provides this code "as is" without warranty of any kind, either expressed or implied, including but not limited to the implied warranties of merchantability and/or fitness for a particular purpose.

Steps to Reproduce Behavior

The following procedure illustrates the behavior described. The steps describe dialog boxes and objects found in FoxPro for Windows and FoxPro for Macintosh. Minor differences exist in the FoxPro for MS-DOS environment.

  1. Open the CUSTOMER table (CUSTOMER.DBF) in the TUTORIAL subdirectory beneath the FoxPro main directory.

  2. Create a screen, and save it as SCR1.SCX.

  3. In SCR1, choose Screen Layout from the Screen menu and type "SCR1" (without the quotation marks) as the window name and "SCR 1" (without the quotation marks) as the window title.

  4. Create an output field, select the Refresh Output Field check box, and specify the COMPANY field as the field to output.

  5. Create a push button with the prompts "OK" and "NEXT SCREEN" and an "M.OK" variable. In the VALID code snippet, enter the following code:

    DO CASE

              CASE m.ok=1
                 CLEAR READ
              CASE m.ok=2
                 HIDE WINDOW scr1
                 SHOW WINDOW scr2
                 _CUROBJ=OBJNUM(m.choice)
            ENDCASE
    
    

  6. Create a second screen, and save it as SCR2.SCX.

  7. In SCR2, choose Screen Layout from the Screen menu and type "SCR2" (without the quotation marks) as the window name and "SCR 2" (without the quotation marks) as the window title.

  8. Create an output field, select the Refresh Output Field check box, and specify the CONTACT field as the field to output.

  9. Create a push button set with the prompts "OK" and "Update" and an "M.CHOICE" variable. In the VALID code snippet of the push button set, enter the following code:

    DO CASE

              CASE m.choice=1
                 CLEAR READ
              CASE m.choice=2
                 SKIP
                 SHOW GETS && WINDOW (WONTOP())
           ENDCASE
    
    

  10. In the ON SCREEN ENTRY (When) code snippet, enter the following line of code:

    HIDE WINDOW SCR2

  11. Save both SCR1.SCX and SCR2.SCX, bring SCR1.SCX to the foreground, and generate the two screens together. SCR1 should be listed first in the screen set list box.

  12. Run the screen program SCR1.SPR. Disregard the momentary appearance of SCR2. This is a side-effect of combining two independent screens together in a single READ and is discussed below. When SCR1 is waiting to receive input, choose the Next Screen push button. SCR1 disappears and SCR2 appears. Clicking Update causes SCR1 to reappear.

Workarounds

To correct the screen set created above, eliminate the comments (&&) in step 9, save SCR2.SCX, and regenerate the screen set, making sure that SCR1 is listed first in the screen set list box of the Generate Screen dialog box.

There are a variety of ways to combine a screen set. If the limit on the number of READs is a concern, see the following article in the Microsoft Knowledge Base:

   ARTICLE-ID: Q106697
   TITLE     : How to Prevent "Too Many READs in Effect" Error Message

It describes a method of switching between screens without incrementing the READ level much like the sample application EX1 included with Microsoft FoxPro.

If speed of execution between screens is a concern, SAY fields cannot be used. Instead, use GET objects. In the WHEN clause of each GET, return the value .F., so that the user cannot enter the field.

A fundamental problem exists with the method described for tying two independent screens together in a single READ, commonly referred to as a "screen set." Without modifying the .SPR directly, there is no way to avoid the momentary display of the hidden window before it is hidden again by the HIDE WINDOW command the user places in the ON SCREEN ENTRY code snippet. The screen generator doesn't provide an option to prevent the display of one or more windows combined in a screen set. While the flicker may be momentarily distracting on slower computers, the speed gained in having more than one screen in memory simultaneously may provide justification. Another benefit is that only a single READ level is consumed by all screens involved.


Additional reference words: FoxDos FoxWin FoxMac 2.00 2.50 2.50a 2.50b
release
KBCategory: kbprg kbprb kbui kbdisplay
KBSubcategory: FxtoolSbuilder
Keywords : FxtoolSbuilder kbdisplay kbprb kbprg kbui
Version : 2.50b | 2.00 2.50 2.50a 2.50
Platform : MACINTOSH MS-DOS WINDOWS


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: December 18, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.