Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Disabling selected objects for later restore
Message
From
06/09/2006 13:40:16
Dorin Vasilescu
ALL Trans Romania
Arad, Romania
 
General information
Forum:
Visual FoxPro
Category:
Forms & Form designer
Miscellaneous
Thread ID:
01151156
Message ID:
01151431
Views:
33
>Hello All,
>
>Is there a straight forward way of showing all objects (mainly the buttons) on a parent (modal) form disabled whilst another (modal) form is called (DO FORM ...) so that after the called form is released, the calling form can be restored to the state it was before the call.
>
>The main problem I have is if the called form is smaller in size then the user can see the underlying form (which is disabled) BUT the buttons appear to be enabled.
>
>The requirement is for the users to know the buttons on the underlying form are not available to click.
>
>Regards...Rex

Hi
Check the ctrlAdjuster class in prg below.
It can be used to iterate through all controls inside form or container controls and change properties as needed
Currently, it handles "add", "edit", "view", but it can be easily extended. to handle other cases ( "inactive", in your case)
You can change more than one properties ( "ReadOnly=.t.|Enabled=.t.|Caption='Caption'" ) The parseChar is |
PUBLIC oFrm
oFrm = CREATEOBJECT('form1')
oFrm.show()



**************************
DEFINE CLASS form1 AS form


	Top = 0
	Left = 0
	Height = 666
	Width = 765
	DoCreate = .T.
	Caption = "Form1"
	Name = "Form1"
	AutoCenter=.t.


	ADD OBJECT cmd1 AS cmd WITH ;
		Top = 600, ;
		Left = 12, ;
		onaddstates = "Enabled=.T.", ;
		oneditstates = "Enabled=.T.", ;
		onviewstates = "Enabled=.F.", ;
		Name = "Cmd1"


	ADD OBJECT cmd2 AS cmd WITH ;
		Top = 600, ;
		Left = 108, ;
		onaddstates = "Enabled=.T.", ;
		oneditstates = "Enabled=.T.", ;
		onviewstates = "Enabled=.F.", ;
		Name = "Cmd2"


	ADD OBJECT cmd3 AS cmd WITH ;
		Top = 600, ;
		Left = 204, ;
		onaddstates = "Enabled=.T.", ;
		oneditstates = "Enabled=.T.", ;
		onviewstates = "Enabled=.F.", ;
		Name = "Cmd3"


	ADD OBJECT cmd4 AS cmd WITH ;
		Top = 600, ;
		Left = 300, ;
		onaddstates = "Enabled=.T.", ;
		oneditstates = "Enabled=.T.", ;
		onviewstates = "Enabled=.F.", ;
		Name = "Cmd4"


	ADD OBJECT cmd5 AS cmd WITH ;
		Top = 600, ;
		Left = 396, ;
		onaddstates = "Enabled=.T.", ;
		oneditstates = "Enabled=.T.", ;
		onviewstates = "Enabled=.F.", ;
		Name = "Cmd5"


	ADD OBJECT ctrladjuster AS ctrladjuster WITH ;
		Top = 600, ;
		Left = 708, ;
		Name = "Ctrladjuster"


	ADD OBJECT cmd6 AS cmd WITH ;
		Top = 600, ;
		Left = 576, ;
		Height = 27, ;
		Width = 108, ;
		Caption = "Launch modal", ;
		onaddstates = "Enabled=.t.", ;
		oneditstates = "Enabled=.t.", ;
		onviewstates = "Enabled=.f.", ;
		Name = "Cmd6"


	PROCEDURE Activate
		this.ctrladjuster.ctrlIterator(thisform,'modify','edit')
	ENDPROC


	PROCEDURE cmd6.Click
		thisform.ctrladjuster.ctrlIterator(thisform,'modify','view')
		oForm=CREATEOBJECT('form')
		oForm.Autocenter = .t.
		oForm.Show(1)
		 
	ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************



**************************************************
*-- Class:        ctrladjuster 
*-- ParentClass:  custom
*-- BaseClass:    custom
*-- Time Stamp:   09/05/06 11:46:03 PM
*
DEFINE CLASS ctrladjuster AS custom


	Height = 27
	Width = 125
	*-- XML Metadata for customizable properties
	_memberdata = [<VFPData><memberdata name="ctrliterator" type="method" display="ctrlIterator"/></VFPData>]
	*-- refresh control after properties are modified
	refreshcontrol = .F.
	Name = "ctrladjuster"


	*-- parse onEditstates, onAddStates and onViewStates and creates collections with properties values
	PROCEDURE parse
		LPARAMETERS oObj

		LOCAL ARRAY aStates[1]
		LOCAL iCount, i, cProperty, vValue, lWasError

		IF PEMSTATUS(oObj,'onViewStates',5)
			IF NOT EMPTY(oObj.onViewStates)
				iCount = ALINES(aStates,oObj.onViewStates,1+4+8,'|')
				IF iCount > 0
					ADDPROPERTY(oObj,'oViewStatesList',NEWOBJECT('collection'))
				ENDIF 
				FOR i = 1 TO iCount
					lWasError = .f.
					IF '=' $ aStates[i]
						TRY 
							cProperty = LEFT(aStates[i],ATC('=',aStates[i],1)-1)
							vValue = SUBSTR(aStates[i],ATC('=',aStates[i],1)+1)
						CATCH
							lWasError = .t.
						ENDTRY 
						IF NOT lWasError
							TRY 
								oObj.oViewStatesList.Add( EVALUATE(vValue), cProperty )
							CATCH 
							ENDTRY 
						ENDIF 
					ENDIF 
				NEXT 
				ADDPROPERTY(oObj,'onViewStatesParsed',.t.)
			ENDIF 
		ENDIF

		IF PEMSTATUS(oObj,'onAddStates',5)
			IF NOT EMPTY(oObj.onAddStates)
				iCount = ALINES(aStates,oObj.onAddStates,1+4+8,'|')
				IF iCount > 0
					ADDPROPERTY(oObj,'oAddStatesList',NEWOBJECT('collection'))
				ENDIF 
				FOR i = 1 TO iCount
					lWasError = .f.
					IF '=' $ aStates[i]
						TRY 
							cProperty = LEFT(aStates[i],ATC('=',aStates[i],1)-1)
							vValue = SUBSTR(aStates[i],ATC('=',aStates[i],1)+1)
						CATCH
							lWasError = .t.
							SUSPEND 
						ENDTRY 
						IF NOT lWasError
							TRY 
								oObj.oAddStatesList.Add( EVALUATE(vValue), cProperty )
							CATCH 
								SUSPEND 
							ENDTRY 
						ENDIF 
					ENDIF 
				NEXT 
				ADDPROPERTY(oObj,'onAddStatesParsed',.t.)
			ENDIF 
		ENDIF

		IF PEMSTATUS(oObj,'onEditStates',5)
			IF NOT EMPTY(oObj.onEditStates)
				iCount = ALINES(aStates,oObj.onEditStates,1+4+8,'|')
				IF iCount > 0
					ADDPROPERTY(oObj,'oEditStatesList',NEWOBJECT('collection'))
				ENDIF 
				FOR i = 1 TO iCount
					lWasError = .f.
					IF '=' $ aStates[i]
						TRY 
							cProperty = LEFT(aStates[i],ATC('=',aStates[i],1)-1)
							vValue = SUBSTR(aStates[i],ATC('=',aStates[i],1)+1)
						CATCH
							lWasError = .t.
						ENDTRY 
						IF NOT lWasError
							TRY 
								oObj.oEditStatesList.Add( EVALUATE(vValue), cProperty )
							CATCH 
							ENDTRY 
						ENDIF 
					ENDIF 
				NEXT 
				ADDPROPERTY(oObj,'onEditStatesParsed',.t.)
			ENDIF 
		ENDIF
	ENDPROC


	*-- Code used in BINDEVENT()
	PROCEDURE hostmodehandler

		LOCAL oForm
		LOCAL ARRAY aEventSrc[1] 
		AEVENTS(aEventSrc,0)
		oForm = aEventSrc[1]
		this.ctrlIterator(oForm,'modify',oForm.formmode)
	ENDPROC


	*-- Loop through controls in form/container and parse/apply changes (recursive)
	PROCEDURE ctrliterator
		*Iteration in container controls, recursive
		LPARAMETERS oCntRef, cAction, cFormState
		*oCntRef = reference to container class
		*Action = "parse" or "modify"
		*cFormState = 'add', 'edit', 'view', 'A','E','V' 

		LOCAL i, oObj, cClass, cProperty

		FOR EACH oObj IN oCntRef.Objects

			cClass = LOWER(oObj.BaseClass)

			*check view states
			IF PEMSTATUS(oObj,'onViewStates',5)
				IF NOT PEMSTATUS(oObj,'onViewStatesParsed',5) &&not parsed
					this.parse(oObj) 
				ENDIF 

				IF PEMSTATUS(oObj,'onViewStatesParsed',5) 
					IF oObj.onViewStatesParsed AND cAction == 'modify' ;
						 AND (cFormState = 'view' OR cFormState = 'V')
						this.adjust(oObj,oObj.oViewStatesList)
					ENDIF   
				ENDIF 

			ENDIF 

			*check add states
			IF PEMSTATUS(oObj,'onAddStates',5)
				IF NOT PEMSTATUS(oObj,'onAddStatesParsed',5) &&not parsed
					this.parse(oObj) 
				ENDIF 

				IF PEMSTATUS(oObj,'onAddStatesParsed',5) 
					IF oObj.onAddStatesParsed AND cAction == 'modify' ;
						 AND (cFormState = 'add' OR cFormState = 'A')
						this.adjust(oObj,oObj.oAddStatesList)
					ENDIF 
				ENDIF 

			ENDIF 

			*check edit states
			IF PEMSTATUS(oObj,'onEditStates',5)
				IF NOT PEMSTATUS(oObj,'onEditStatesParsed',5) &&not parsed
					this.parse(oObj) 
				ENDIF 

				IF PEMSTATUS(oObj,'onEditStatesParsed',5) 

					IF oObj.onEditStatesParsed AND cAction == 'modify' ;
						 AND (cFormState = 'edit' OR cFormState = 'E')
						this.adjust(oObj,oObj.oEditStatesList)
					ENDIF 
				ENDIF 
			ENDIF 

			IF PEMSTATUS(oObj,'Refresh',5) AND this.refreshcontrol 
				oObj.Refresh() 
			ENDIF 

			*for container objects, we continue recursively 
			IF INLIST(cClass, 'formset','form','page','toolbar','control','container','column' ;
					,'pageframe', 'commandgroup', 'optiongroup', 'grid' )

				this.ctrlIterator(oObj, cAction, cFormState)
			ENDIF 
		ENDFOR 
	ENDPROC


	*-- modify properties as specified in onAddStates, onEditStates, onViewStates
	PROCEDURE adjust
		LPARAMETERS oObj, oPropsCollection

		LOCAL lError

		FOR i = 1 TO oPropsCollection.Count
			cProperty = oPropsCollection.GetKey(i)

			TRY 
				IF '.' $ cProperty
					*we can have some special case for a container, macrosubst used
					oObj.&cProperty = oPropsCollection.Item(i) 
				ELSE 
					ADDPROPERTY(oObj,cProperty,oPropsCollection.Item(i))
				ENDIF 
			CATCH 
				lError = .T.
			ENDTRY 
		ENDFOR 

		RETURN NOT lError
	ENDPROC


ENDDEFINE
*
*-- EndDefine: ctrladjuster
**************************************************

**************************************************
*-- Class:        cmd 
*-- ParentClass:  commandbutton
*-- BaseClass:    commandbutton
*-- Time Stamp:   09/05/06 11:18:08 PM
*
DEFINE CLASS cmd AS commandbutton


	Height = 27
	Width = 84
	Caption = "Command1"
	formmode = "V"
	onaddstates = "Enabled=.T."
	oneditstates = "Enabled=.T."
	onviewstates = "Enabled=.F."
	Name = "cmd"


ENDDEFINE
*
*-- EndDefine: cmd
**************************************************
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform