【vfp开源代码栏目提醒】:网学会员,鉴于大家对vfp开源代码十分关注,论文会员在此为大家搜集整理了“dynamicformattingnew.prg”一文,供大家参考学习!
*!* 定义一个类,以便知道如何将效果应用于报表对象
DEFINE CLASS EffectsListener AS ReportListener
*!* 下面的自定义属性用于保存一个效果处理器集合
oEffectHandlers = .NULL.
*!* 下面的数组用于以对象方式保存FRX中的每条记录信息
DIMENSION aRecords[1]
*!* 建立一个效果处理器集合,并使用在后面建立的DynamicForeColorEffect和
*!* DynamicStyleEffect处理器填充集合,这两个类在后面有定义
FUNCTION Init
DODEFAULT()
WITH This
.oEffectHandlers = CREATEOBJECT('Collection')
.oEffectHandlers.Add(CREATEOBJECT('DynamicForeColorEffect'))
.oEffectHandlers.Add(CREATEOBJECT('DynamicStyleEffect'))
ENDWITH
ENDFUNC
*!* 定义aRecords与FRX中的记录一样多,所以在报表运行时就不必重新定义数组的大小了,
*!* 第一列表示我们是否已经处理过了记录,第二列包含一个用于处理记录的效果处理器集合
FUNCTION BeforeReport
DODEFAULT()
WITH This
lnSession=SET("Datasession") &&保存当前报表所使用的数据工作期的编号
SET DATASESSION TO .FRXDataSession &&转到报表定义文件所在的数据工作期
SELECT FRX &&选择报表定义文件工作区
DIMENSION .aRecords[reccount(), 2]
SET DATASESSION TO lnSession &&转回到报表所使用的数据工作期
ENDWITH
ENDFUNC
*!* 在处理每一个报表中的对象时,都会触发EvaluateContents事件,因此,
*!* 应当在该事件中把我们要求的效果传递给要被绘制的字段
FUNCTION EvaluateContents(tnFRXRecno, toObjProperties)
LOCAL loEffectObject, ;
loEffectHandler, ;
lcExpression
WITH This
*!* 如果已经检查过了记录,则标记数组的第1列为.T.
IF NOT .aRecords[tnFRXRecno, 1]
.aRecords[tnFRXRecno, 1] = .T.
.aRecords[tnFRXRecno, 2] = .SetupEffectsForObject(tnFRXRecno)
ENDIF
*!* 由于上面的SetupEffectsForObject方法返回的是一个集合对象,
*!* 所以下面要使用FOR EACH语句来编历集合,为字段搜寻效果处理器集合。
*!* 如果字段不需要任何效果,集合则为空;如果需要,则该集合中包含一个
*!* 基于Custom类的对象(即下面对EffectObject的定义)
FOR EACH loEffectObject IN .aRecords[tnFRXRecno, 2]
*!* 下面的loEffectObject.oEffectHandler,是对DynamicForeColorEffect或
*!* DynamicStyleEffect对象的引用,请见SetupEffectsForObject方法中对
*!* GetEffect的说明
loEffectHandler = loEffectObject.oEffectHandler
lcExpression = loEffectObject.cExpression
loEffectHandler.Execute(toObjProperties, lcExpression)
NEXT
ENDWITH
*!* 执行默认行为
DODEFAULT(tnFRXRecno, toObjProperties)
ENDFUNC
*!* 搜寻每个效果处理器来查看它是否要处理当前报表对象,如果是,则添加该对象
*!* 到一个处理器集合中,并返回这个集合
FUNCTION SetupEffectsForObject(tnFRXRecno)
LOCAL loFRX,loHandlers,loObject
WITH This
*!* 下面的GetReportObject方法用于建立loFRX对象,其中的属性是FRX中当前
*!* 记录的各字段,属性值是字段的值
loFRX = .GetReportObject(tnFRXRecno)
loHandlers = CREATEOBJECT('Collection')
*!* 下面的循环语句用于遍历oEffectHandlers集合,其中包含DynamicForeColorEffect
*!* 和DynamicStyleEffect两个对象,用于处理用户指定的效果
FOR EACH loEffectHandler IN .oEffectHandlers
*!* DynamicForeColorEffect和DynamicStyleEffect都基于UserEffectHandler类,
*!* GetEffect方法在UserEffectHandler类中定义,GetEffect方法用于判断USER
*!* 字段中是否包含有“*:EFFECTS”这样的指令字符。如果有,则返回一个基于
*!* Custom的对象(见EffectObject类的定义),在其oEffectHandler属性中
*!* 包含对DynamicForeColorEffect或DynamicStyleEffect对象的引用,在其
*!* cExpression属性中包含指定的指令表达式
loObject = loEffectHandler.GetEffect(loFRX)
IF VARTYPE(loObj