【vfp开源代码栏目提醒】:网学会员为需要vfp开源代码的朋友们搜集整理了DynamicFormatting.prg相关资料,希望对各位网友有所帮助!
* 定义一个类,以便知道如何将效果应用于报表对象
define class EffectsListener as _ReportListener of ;
home() + 'ffc\_ReportListener.vcx'
oEffectHandlers = .NULL.
&& 一个效果处理器集合
dimension aRecords[1]
&& 一个FRX中每条记录信息数组
* 建立一个效果处理器集合,并使用我们知道的处理器填充集合,
* 被填充的子类或实例在后面有定义
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
.SetFRXDataSession()
dimension .aRecords[reccount(), 2]
.ResetDataSession()
endwith
endfunc
* 应用一些我们要求的效果给要被绘制的字段
function EvaluateContents(tnFRXRecno, toObjProperties)
local loEffectObject, ;
loEffectHandler, ;
lcExpression
with This
* 如果我们已经检查过了记录,则标记该记录
if not .aRecords[tnFRXRecno, 1]
.aRecords[tnFRXRecno, 1] = .T.
.aRecords[tnFRXRecno, 2] = .SetupEffectsForObject(tnFRXRecno)
endif not .aRecords[tnFRXRecno, 1]
* 为字段搜寻效果处理器集合(如果字段不需要任何效果,集合有可能为空),为字段添加效果
for each loEffectObject in .aRecords[tnFRXRecno, 2]
loEffectHandler = loEffectObject.oEffectHandler
lcExpression = loEffectObject.cExpression
loEffectHandler.Execute(toObjProperties, lcExpression)
next loEffect
endwith
* 执行默认行为
dodefault(tnFRXRecno, toObjProperties)
endfunc
* 搜寻每个效果处理器来查看它是否要处理当前报表对象,如果是,则为该对象添加它
* 到一个处理器集合中,并返回这个集合
function SetupEffectsForObject(tnFRXRecno)
local loFRX, ;
loHandlers, ;
loObject
with This
loFRX = .GetReportObject(tnFRXRecno)
loHandlers = createobject('Collection')
for each loEffectHandler in .oEffectHandlers
loObject = loEffectHandler.GetEffect(loFRX)
if vartype(loObject) = 'O'
loHandlers.Add(loObject)
endif vartype(loObject) = 'O'
next loEffectHandler
endwith
return loHandlers
endfunc
* 为FRX中的指定记录返回一个SCATTER NAME对象
procedure GetReportObject(tnFRXRecno)
local loObject
This.SetFRXDataSession()
go tnFRXRecno
scatter memo name loObject
This.ResetDataSession()
return loObject
endproc
enddefine
* 建立一个类来保存对一个效果处理器和表达式的引用,该效果处理器
* 假定对一个FRX中的特定记录起作用
define class EffectObject as Custom
oEffectHandler = .NULL.
cExpression = ''
enddefine
* 为效果处理器对象定义一个抽象类
define class EffectHandler as Custom
* 通过EffectsListener的EvaluateContents方法执行一个调用来执行一个效果
function Execute(toObjProperties, tcExpression)
endfunc
* GetEffects is called to return an object containing a reference to the
* handler and the expression it's supposed to work on if the specified report
* object needs this effect, or return null if not.
function GetEffect(toFRX)
local loObject
loObject = .NULL.
return loObject
endfunc
* EvaluateExpression可以被调用来计算指定的表达式
function EvaluateExpression(tcExpression)
return evaluate(tcExpression)
endfunc
enddefine
* 为效果处理器定义一个抽象类,用于在USER备注字段中查找
* "*:EFFECTS <effectname> = <effectexpression>"
define class UserEffectHandler as EffectHandler
cEffectsDirective = '*:EFFECTS'
&& 该指令表示需要一个效果
cEffectName = ''
&& 要查找的效果名称(在子类中填充)
function GetEffect(toFRX)
local lcEffect, ;
loObject
lcEffect = This.cEffectsDirective + ' ' + This.cEffectName
if atc(lcEffect, toFRX.User) > 0
loObject = createobject('EffectObject')
loObject.oEffectHandler = This
loObject.cExpression = strextract(toFRX.User, lcEffect + ' = ', ;
chr(13), 1, 3)
else
loObject = .NULL.
endif atc(lcEffect, toFRX.User) > 0
return loObject
endfunc
enddefine
* 定义一个类来提供动态前景效果
define class DynamicForeColorEffect as UserEffectHandler
cEffectName = 'FORECOLOR'
* 计算表达式,Evaluate the expression. If