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) &¬ 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) &¬ 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) &¬ 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 **************************************************