【vfp开源代码栏目提醒】:以下是网学会员为您推荐的vfp开源代码-ColumnChartListener.prg,希望本篇文章对您学习有所帮助。
*!* 定义一些要使用的常量
#define FRX_OBJCOD_TITLE 0 && 标题带区的OBJCODE字段值
#define FRX_OBJCOD_PAGEHEADER 1 && 页标头带区的OBJCODE字段值
#define GDIPLUS_FontStyle_Regular 0 && GDI+字型:正常
#define GDIPLUS_Unit_Point 3 && GDI+单位:点
*!* ColumnChartListener类
DEFINE CLASS ColumnChartListener as _ReportListener OF ;
HOME() + 'FFC\_ReportListener.vcx'
oGDIGraphics = .NULL. && 对GPGraphics对象的引用
DIMENSION aRecords[1] && 保存FRX中每条记录标识的数组
DIMENSION aValues[1] && 保存要绘制图表的标签和值的数组
nCurrentRow = 0 && aValues中被处理的当前行
DIMENSION aColumnColors[1] && 柱颜色数组
nSpacing = 100 && 柱间距
nLegendSpacing = 300 && 图表和图例的间距
nLegendBoxSize = 200 && 图例方框的大小
nLegendBoxSpacing = 100 && 图例中的项目间距
nLegendTextSpacing = 50 && 图例中方框和文本的间距
cLegendFontName = 'Arial' && 图例文本的字体名称
nLegendFontSize = 10 && 图例文本的字体大小
*!* 为各个柱形设置颜色
FUNCTION Init
WITH This
DIMENSION .aColumnColors[8]
.aColumnColors[1] = .CreateColor(RGB( 0, 0, 255)) && 蓝色
.aColumnColors[2] = .CreateColor(RGB( 0, 255, 0)) && 绿色
.aColumnColors[3] = .CreateColor(RGB(255, 0, 0)) && 红色
.aColumnColors[4] = .CreateColor(RGB(255, 0, 255)) && 品红
.aColumnColors[5] = .CreateColor(RGB(255, 255, 0)) && 黄色
.aColumnColors[6] = .CreateColor(RGB( 0, 255, 255)) && 青色
.aColumnColors[7] = .CreateColor(RGB(255, 128, 0)) && 橙色
.aColumnColors[8] = .CreateColor(RGB(128, 0, 255)) && 紫色
ENDWITH
DODEFAULT()
ENDFUNC
*!* 在报表启动前进行一些设置工作
FUNCTION BeforeReport
DODEFAULT()
WITH This
*!* 建立一个GPGraphics对象,这样才可以使用GDI+进行绘制
.oGDIGraphics = NEWOBJECT('GPGraphics', ;
HOME() + 'ffc\_GDIPlus.vcx')
*!* 定义aRecords大小与FRX中的记录一样多,所以在报表运行时,就不需要重新
*!* 定义数组大小了。数组的第1列表示是否处理了FRX中的记录,第2列表示是否
*!* 是一个柱形图表对象,第3
列表示是否处理了图表标签,第4列表示是否处理了
*!* 图表数据
.SetFRXDataSession() &&选择报表定义文件FRX所在的数据
工作期
DIMENSION .aRecords[RECCOUNT(), 4]
.ResetDataSession() &&回到报表数据文件工作期
ENDWITH
ENDFUNC
*!* 由于GDI+ plus句柄在每页上改变,因此需要适当地设置我们的SharedGDIPlusGraphics
*!* 属性,并为GPGraphics对象设置句柄
FUNCTION BeforeBand(tnBandObjCode, tnFRXRecNo)
WITH This
IF INLIST(tnBandObjCode, FRX_OBJCOD_PAGEHEADER, FRX_OBJCOD_TITLE)
IF NOT .IsSuccessor
.SharedGDIPlusGraphics = .GDIPlusGraphics &&保存报表页面句柄
ENDIF NOT .IsSuccessor
.oGDIGraphics.SetHandle(.SharedGDIPlusGraphics) &&设置GDI+ plus句柄
ENDIF INLIST(tnBandObjCode ...
DODEFAULT(tnBandObjCode, tnFRXRecNo)
ENDWITH
ENDFUNC
*!* 为FRX中的指定记录返回一个SCATTER NAME对象
PROCEDURE GetReportObject(tnFRXRecno)
LOCAL loObject
This.SetFRXDataSession()
GO tnFRXRecno
SCATTER MEMO NAME loObject
This.ResetDataSession()
RETURN loObject
ENDPROC
*!* 如果是一个柱形图表,设置形状的属性
PROCEDURE AdjustObjectSize(tnFRXRecno, toObjProperties) &&处理形状
LOCAL loObject
WITH This
*!* 如果还没有检查过,查找其在FRX中的记录并查看如果其USER备注字段
*!* 包含“COLUMNCHART”,则标记该数组中的值,这样下次就可以不用再
*!* 处理这个记录了
IF NOT .aRecords[tnFRXRecno, 1]
loObject = .GetReportObject(tnFRXRecno)
.aRecords[tnFRXRecno, 1] = .T.
.aRecords[tnFRXRecno, 2] = ATC('COLUMNCHART', loObject.User) > 0
ENDIF NOT .aRecords[tnFRXRecno, 1]
*!* 如果是一个柱形图表,设置报表中的形状对象的高度与宽度相等
IF .aRecords[tnFRXRecno, 2]
toObjProperties.Height = toObjProperties.Width &&将形状设置为正方形
toObjProperties.Reload = .T. &&通知ReportListener
ENDIF .aRecords[tnFRXRecno, 2]
ENDWITH
ENDPROC
*!* 处理图表中的域控件对象
PROCEDURE EvaluateContents(tnFRXRecno, toObjProperties) &&处理字段
LOCAL loObject, ;
lcText, ;
lnRow
WITH This
*!* 如果.aRecords[tnFRXRecno, 1]没有检查过,在这个事件中能够处理的对象只能是
*!* 标签和域控件,所以检查FRX中USER字段中是否包含“LABEL”和“DATA”,然后
*!* 标记数组.aRecords[tnFRXRecno, 1]为.T.,这样下次就不必再处