![]() |
![]() |
How to transmit values between the various forms? |
I am afraid that much possibilities exist :-) However, likely that all they can be divided into the following groups:
I can not kept myself once again do not reduce an example by Mike Korneev as second and third cases above, and from third possibilities Mike has kept only modal of the form! :-)
*********** any.prg
local lc_Tmp
lc_Tmp='1234'
createobj('ff',@lc_Tmp)
?lc_Tmp
define class ff as form
autocenter=.t.
width=200
height=100
add object txt as textbox with top=20, left=50, width=100
add object cmd as commandbutton with top=60, left=50, height=25, width=100
func cmd.click
thisform.hide
endfunc
func init(rc_Val)
this.txt.value=rc_Val
this.show(1)
rc_Val=this.txt.Value
return .f.
endfunc
enddef
********** end of any.prg
Pay attention: the method Hide() allows to continue fulfilment of commands following later than show(1) and still the alive pointer This, while the returns value over Init(rc_Val) event may be just under by reference.
To anyhow demonstrate the first group possibilities I can show the following example:
*//////////////////////////// any.prg for VFP 6.0
RELEASE goFrmManager
PUBLIC goFrmManager
goFrmManager = CREATEOBJECT('frmmanager')
IF VARTYPE(goFrmManager) # 'O'
RELEASE goFrmManager
RETURN .F.
ENDIF
RELEASE Form1
PUBLIC Form1
Form1 = CREATEOBJECT('form1')
IF VARTYPE(Form1) # 'O'
RELEASE Form1
RETURN .F.
ENDIF
Form1.Show()
goFrmManager.Show()
**************************************************
*-- Form: frmmanager (d:\myapp\vfp\formsetgetvalue\frmmanager.scx)
*-- ParentClass: form
*-- BaseClass: form
*-- Time Stamp: 06/16/01 06:18:06 PM
*
DEFINE CLASS frmmanager AS form
Height = 129
Width = 348
DoCreate = .T.
AutoCenter = .T.
BorderStyle = 2
Caption = "Manager forms properties"
MaxButton = .F.
MinButton = .F.
Name = "frmManager"
ADD OBJECT lblnameform AS label WITH ;
Caption = "Name:", ;
Height = 16, ;
Left = 14, ;
Top = 4, ;
Width = 41, ;
TabIndex = 1, ;
Name = "lblNameForm"
ADD OBJECT txtnameform AS textbox WITH ;
Value = "Form1", ;
Height = 25, ;
Left = 60, ;
TabIndex = 2, ;
Top = 0, ;
Width = 133, ;
Name = "txtNameForm"
ADD OBJECT cmdcheckactive AS commandbutton WITH ;
Top = 0, ;
Left = 204, ;
Height = 25, ;
Width = 133, ;
Caption = "Is as Acive", ;
TabIndex = 3, ;
Name = "cmdCheckActive"
ADD OBJECT lblpropery AS label WITH ;
Caption = "Property:", ;
Height = 16, ;
Left = 2, ;
Top = 34, ;
Width = 54, ;
TabIndex = 4, ;
Name = "lblPropery"
ADD OBJECT txtproperty AS textbox WITH ;
Value = "text1.value", ;
Height = 25, ;
Left = 60, ;
TabIndex = 5, ;
Top = 30, ;
Width = 131, ;
Name = "txtProperty"
ADD OBJECT lblvalue AS label WITH ;
Caption = "Value:", ;
Height = 18, ;
Left = 17, ;
Top = 62, ;
Width = 40, ;
TabIndex = 7, ;
Name = "lblValue"
ADD OBJECT txtvalue AS textbox WITH ;
Height = 25, ;
Left = 60, ;
TabIndex = 8, ;
Top = 60, ;
Width = 133, ;
Name = "txtValue"
ADD OBJECT cmdget AS commandbutton WITH ;
Top = 60, ;
Left = 204, ;
Height = 25, ;
Width = 61, ;
Caption = "Get", ;
TabIndex = 9, ;
Name = "cmdGet"
ADD OBJECT cmdreset AS commandbutton WITH ;
Top = 60, ;
Left = 276, ;
Height = 25, ;
Width = 61, ;
Caption = "ReSet", ;
TabIndex = 10, ;
Name = "cmdReset"
ADD OBJECT cmdexit AS commandbutton WITH ;
Top = 96, ;
Left = 114, ;
Height = 25, ;
Width = 120, ;
Caption = "Cancel", ;
TabIndex = 11, ;
Name = "cmdExit"
ADD OBJECT txtresult AS textbox WITH ;
Height = 25, ;
Left = 204, ;
ReadOnly = .T., ;
TabIndex = 6, ;
Top = 29, ;
Width = 133, ;
Name = "txtResult"
PROCEDURE getform
LPARAMETERS tcNameForm
IF VARTYPE(tcNameForm) # 'C' OR EMPTY(tcNameForm)
RETURN NULL
ENDIF
LOCAL loFrm, lnCntFrm, lcNameForm
lcNameForm = UPPER(ALLTRIM(tcNameForm))
FOR lnCntFrm = 1 TO _SCREEN.FormCount
IF lcNameForm == UPPER(ALLTRIM(_SCREEN.Forms(lnCntFrm).Name))
RETURN _SCREEN.Forms(lnCntFrm)
ENDIF
ENDFOR
RETURN NULL
ENDPROC
PROCEDURE eval
LPARAMETERS toFrm, tcType
*
*-- It's very primitive calculator, and usual do not write so...
*-- However, it's sufficient for our purposes
LOCAL loFrm, lcObj, loObj, lcRetVal
lcRetVal = ''
WITH ThisForm
IF VARTYPE(toFrm) # 'O'
.txtResult.Value = 'Not found'
RETURN lcRetVal
ENDIF
*
*-- Get expression to evaluate
lcObj = 'toFrm.'+ALLTRIM(.txtProperty.Value)
LOCAL lnPos, lcSubObj
*
*-- Check: is object?
lnPos = RATC('.', lcObj)
IF lnPos > 0
lcSubObj = LEFTC(lcObj, lnPos-1)
IF TYPE(lcSubObj) = 'O'
*
*-- In case error this value will changed...
*-- in ThisForm.Error() event
.txtResult.Value = 'Ok!'
DO CASE
CASE tcType = 'get'
*
*-- Try evaluate
lcRetVal = EVALUATE(lcObj)
CASE tcType = 'set'
*
*-- Prep command & try evaluate
lcRetVal = lcObj+' = "'+ALLTRIM(.txtValue.Value)+'"'
&lcRetVal
OTHERWISE
lcRetVal = ''
ENDCASE
*
*-- Check result
IF !EMPTY(lcRetVal)
IF .txtResult.Value = 'Ok!'
RETURN lcRetVal
ELSE
RETURN ''
ENDIF
ENDIF
ENDIF
ENDIF
.txtResult.Value = 'Not Object'
ENDWITH
RETURN ''
ENDPROC
PROCEDURE Error
LPARAMETERS nError, cMethod, nLine
LOCAL ARRAY laErr[1]
LOCAL lcMsg
=AERROR(laErr)
lcMsg = 'Error: '+LTRIM(STR(laErr[1]))+CHR(13);
+'Description: '+laErr[2]+CHR(13);
+'Method: '+cMethod+CHR(13);
+'Line: '+LTRIM(STR(nLine))
*
*-- Now set error indication (see comments in ThisForm.eval())
ThisForm.txtResult.Value = 'Error as Object'
ACTIVATE SCREEN
??CHR(7)
MessageBox(lcMsg, 16, ThisForm.Caption)
ENDPROC
PROCEDURE cmdcheckactive.Click
LOCAL loFrm
WITH ThisForm
.txtResult.Value = ;
IIF(VARTYPE(.GetForm(.txtNameForm.Value)) = 'O';
,'Ok!', 'Not found')
ENDWITH
ENDPROC
PROCEDURE cmdget.Click
LOCAL lcValue
WITH ThisForm
lcValue = .Eval(.GetForm(.txtNameForm.Value), 'get')
IF !EMPTY(lcValue)
*
*-- Is result: set returns value
.txtValue.Value = lcValue
ENDIF
ENDWITH
ENDPROC
PROCEDURE cmdreset.Click
LOCAL lcValue
WITH ThisForm
.Eval(.GetForm(.txtNameForm.Value), 'set')
ENDWITH
ENDPROC
PROCEDURE cmdexit.Click
ThisForm.Release()
ENDPROC
ENDDEFINE
*
*-- EndDefine: frmmanager
**************************************************
**************************************************
*-- Form: form1 (d:\myapp\vfp\formsetgetvalue\form1.scx)
*-- ParentClass: form
*-- BaseClass: form
*-- Time Stamp: 06/11/01 10:46:03 PM
*
DEFINE CLASS form1 AS form
Top = 0
Left = 0
Height = 80
Width = 234
DoCreate = .T.
BorderStyle = 2
Caption = "Form1"
MaxButton = .F.
MinButton = .F.
Name = "Form1"
ADD OBJECT text1 AS textbox WITH ;
Value = "Test", ;
Height = 25, ;
Left = 24, ;
Top = 12, ;
Width = 157, ;
Name = "Text1"
ADD OBJECT cmdexit AS commandbutton WITH ;
Top = 48, ;
Left = 144, ;
Height = 25, ;
Width = 73, ;
Caption = "Cancel", ;
Name = "cmdExit"
PROCEDURE cmdexit.Click
ThisForm.Release()
ENDPROC
ENDDEFINE
*
*-- EndDefine: form1
**************************************************
*//////////////////////////// end of any.prg
Certainly, my example considerably loses, as a value of code, and requires considerably smaller amount of convolutions of the brain, which need to be brain work to understand: how it works :-). However, start an example... in the form "Manager forms properties" click on a button "Is as Acive"... further on a button "Get"... at last, by changing value in a text field Value, press a button ReSet... As I hope, it works! :-) Further you can indulge in pleasure... Will not break yet! :-))
