DEFINE CLASS MyRL AS ReportListener oFRX = NULL ... ************************************ FUNCTION BeforeReport( ) This.oFRX = CREATEOBJECT("Collection") SET DATASESSION TO (This.FRXDataSession) SELECT frx SCAN SCATTER MEMO NAME loData ADDPROPERTY(loData, "objprop", NULL) This.oFRX.Add(loData) ENDSCAN SET DATASESSION TO (This.DefaultDataSession) BINDEVENT(This, "EvaluateContents", This, "OnEvaluateContents", 1) ENDFUNC ************************************ FUNCTION OnEvaluateContents(nFRXRecNo, oObjProp) IF oObjProp.Reload This.oFRX(nFRXRecno).objprop = oObjProp ELSE This.oFRX(nFRXRecno).objprop = NULL ENDIF ENDFUNC ************************************ FUNCTION Render(nFRXRecNo,.............) loData = This.oFRX(nFRXRecno) IF ISNULL(loData.objprop) lcFont = loData.fontname ... ELSE lcFont = loData.objprop.fontname ... ENDIF ENDFUNC ************************************ FUNCTION AfterReport( ) UNBINDEVENT(This, "EvaluateContents", This, "OnEvaluateContents") This.oFRX.Remove(-1) ENDFUNC ... ENDDEFINEAnother benefit is that you have NO base class code in the EvaluateContents to slow down your ReportListener. The OnEvaluateContants will only fire if there is code in the EvaluateContents of a parent class or subclass ReportListener.