Q193241: HOWTO: Synchronize Data Displayed on Two Different Forms
Article: Q193241
Product(s): Microsoft FoxPro
Version(s): MACINTOSH:3.0b; WINDOWS:3.0,3.0b,5.0,5.0a,6.0
Operating System(s):
Keyword(s):
Last Modified: 06-AUG-1999
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual FoxPro for Macintosh, version 3.0b
- Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0, 5.0a, 6.0
-------------------------------------------------------------------------------
SUMMARY
=======
In some circumstances, it is necessary to create two or more forms that are
independent of each other while keeping the data displayed in the forms
synchronized. This article demonstrates how to synchronize the data displayed on
two independent forms.
MORE INFORMATION
================
In order to synchronize the data display between two or more independent forms,
it is necessary to call the refresh method of the form(s) that contain the data
that needs to be refreshed. The methods available for refreshing a form after
moving a record pointer are to some extent dependent on how the form is being
instantiated.
The following example illustrates use of the Refresh method between two forms:
1. Create a form named TEST1 and change the Caption property to "Employee Form."
2. Add the EMPLOYEE table from the \\SAMPLES\DATA directory to the form's
DataEnvironment and set the ORDER to EMP_ID.
3. Drag the following fields from the EMPLOYEE table to the form:
EMPLOYEE.EMP_ID
EMPLOYEE.LAST_NAME
EMPLOYEE.FIRST_NAME
EMPLOYEE.TITLE
4. Add the following code to the form's Init event:
DO FORM TEST2
5. Create a form named TEST2 and change the Caption property to "Search Form."
Add the EMPLOYEE table from the \\SAMPLES\DATA directory to the form's
DataEnvironment and set the ORDER to EMP_ID. In the form's DataEnvironment
and set the following values:
AutoCloseTables=.F.
AutoOpenTables=.F.
6. Add a list box control that has the following values to the form:
RowSourceType=6 - Fields
RowSource=EMPLOYEE.EMP_ID
7. Add the following code to the Click event of the list box control:
IF !EMPTY(THIS.VALUE)
IF SEEK(RTRIM(THIS.VALUE))
* Note that TEST1 is the name of the .SCX file created earlier
test1.REFRESH
ENDIF
ENDIF
8. Save the form.
9. From the command line type "DO FORM TEST1" and use the form captioned "Search
Form" to move the record pointer. After you click a value in the list box,
the data in the "Employee Form" refreshes.
If the form is being instantiated from a class definition, refreshing the form
becomes somewhat more problematic. In this case, the FORMS collection must be
used to refresh the target form(s).
The following code illustrates use of the FORMS collection to refresh another
form:
1. Create a program file called Demo.prg that contains the following code:
* Begin Code
PUBLIC ox
ox=CREATEOBJECT('SYNCHED1')
ox.SHOW
DEFINE CLASS synched1 AS FORM
TOP = 50
LEFT = 162
HEIGHT = 160
WIDTH = 310
DOCREATE = .T.
CAPTION = "Employee Form"
NAME = "Form1"
AUTOCENTER=.T.
ADD OBJECT lblemp_id AS LABEL WITH ;
AUTOSIZE = .T., ;
BACKSTYLE = 0, ;
CAPTION = "Employee ID", ;
LEFT = 11, ;
TOP = 0, ;
TABINDEX = 3, ;
NAME = "lblEmp_id"
ADD OBJECT lbllast_name AS LABEL WITH ;
AUTOSIZE = .T., ;
BACKSTYLE = 0, ;
CAPTION = "Last Name", ;
LEFT = 11, ;
TOP = 36, ;
TABINDEX = 5, ;
NAME = "lblLast_name"
ADD OBJECT lblfirst_name AS LABEL WITH ;
AUTOSIZE = .T., ;
BACKSTYLE = 0, ;
CAPTION = "First Name", ;
LEFT = 11, ;
TOP = 72, ;
TABINDEX = 7, ;
NAME = "lblFirst_name"
ADD OBJECT lbltitle AS LABEL WITH ;
AUTOSIZE = .T., ;
BACKSTYLE = 0, ;
CAPTION = "Title", ;
LEFT = 11, ;
TOP = 108, ;
TABINDEX = 9, ;
NAME = "lblTitle"
ADD OBJECT txtemp_id AS TEXTBOX WITH ;
CONTROLSOURCE = "employee.emp_id", ;
HEIGHT = 23, ;
LEFT = 84, ;
MAXLENGTH = 6, ;
TABINDEX = 4, ;
TOP = 0, ;
WIDTH = 53, ;
NAME = "txtEmp_id"
ADD OBJECT txtlast_name AS TEXTBOX WITH ;
CONTROLSOURCE = "employee.last_name", ;
HEIGHT = 23, ;
LEFT = 84, ;
MAXLENGTH = 20, ;
TABINDEX = 6, ;
TOP = 36, ;
WIDTH = 149, ;
NAME = "txtLast_name"
ADD OBJECT txtfirst_name AS TEXTBOX WITH ;
CONTROLSOURCE = "employee.first_name", ;
HEIGHT = 23, ;
LEFT = 84, ;
MAXLENGTH = 10, ;
TABINDEX = 8, ;
TOP = 72, ;
WIDTH = 80, ;
NAME = "txtFirst_name"
ADD OBJECT txttitle AS TEXTBOX WITH ;
CONTROLSOURCE = "employee.title", ;
HEIGHT = 23, ;
LEFT = 84, ;
MAXLENGTH = 30, ;
TABINDEX = 10, ;
TOP = 108, ;
WIDTH = 218, ;
NAME = "txtTitle"
PROCEDURE LOAD
PUBLIC varval
IF ATC("Visual FoxPro 06.",VERSION())>0
USE Home(2)+"Employee.dbf"
Else
USE home()+"\samples\data\employee"
ENDIF
SET ORDER TO TAG emp_id
GO TOP
STORE SPACE(LEN(employee.emp_id)) TO m.varval
ENDPROC
PROCEDURE DESTROY
FOR i=1 TO _SCREEN.FORMCOUNT
* Look for the Search Form in the FORMS collection.
IF _SCREEN.FORMS(i).CAPTION="Search Form"
* If the Search Form exists, release it
_SCREEN.FORMS(i).RELEASE
ENDIF
ENDFOR
* Close the table.
SELECT employee
USE
ENDPROC
PROCEDURE INIT
* Launch the Search Form.
PUBLIC search
search=CREATEOBJECT('SYNCHED2')
search.SHOW
ENDPROC
ENDDEFINE
DEFINE CLASS synched2 AS FORM
TOP = 0
LEFT = 0
HEIGHT = 118
WIDTH = 205
DOCREATE = .T.
CAPTION = "Search Form"
NAME = "Form2"
ADD OBJECT list1 AS LISTBOX WITH ;
ROWSOURCETYPE = 0, ;
HEIGHT = 96, ;
LEFT = 24, ;
TOP = 12, ;
WIDTH = 145, ;
NAME = "List1"
PROCEDURE INIT
THIS.list1.ROWSOURCETYPE=1
IF USED('EMPLOYEE')
SELECT employee
currec=RECNO()
GO TOP
SCAN
* Load the list box with data from the table.
THIS.list1.ADDLISTITEM(employee.emp_id)
ENDSCAN
GOTO currec
ENDIF
ENDPROC
PROCEDURE list1.CLICK
IF !EMPTY(THIS.VALUE)
SELECT employee
IF SEEK(RTRIM(THIS.VALUE))
* Move the record pointer
FOR i=1 TO _SCREEN.FORMCOUNT
* Look for the Employee Form in the FORMS collection.
IF _SCREEN.FORMS(i).CAPTION="Employee Form"
* If the Employee Form exists, Refresh it
_SCREEN.FORMS(i).REFRESH
ENDIF
ENDFOR
ENDIF
ENDIF
ENDPROC
PROCEDURE DESTROY
FOR i=1 TO _SCREEN.FORMCOUNT
* Look for the Employee Form in the FORMS collection.
IF _SCREEN.FORMS(i).CAPTION="Employee Form"
* If the Employee Form exists, release it
_SCREEN.FORMS(i).RELEASE
ENDIF
ENDFOR
ENDPROC
ENDDEFINE
* End Code.
2. From the command line type "DO DEMO" and use the form captioned "Search Form"
to move the record pointer. After clicking a value in the list box, the data
in the Employee Form refreshes.
REFERENCES
==========
(c) Microsoft Corporation 1998. All Rights Reserved. Contributions by John
Desch, Microsoft Corporation
Additional query words: kbVFp300 kbVFp500 kbVFp600 kbVFp500a kbContainer kbCtrl
======================================================================
Keywords :
Technology : kbHWMAC kbOSMAC kbVFPsearch kbAudDeveloper kbVFP300bMac kbVFP300 kbVFP300b kbVFP500 kbVFP600 kbVFP500a
Version : MACINTOSH:3.0b; WINDOWS:3.0,3.0b,5.0,5.0a,6.0
Issue type : kbhowto
=============================================================================
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.
Copyright Microsoft Corporation 1986-2002.