图形控件具有直观视觉展示的功能,powerbuilder的graph图形可以由2种方式生成,一种是数据窗口方式,一种是控件方式。数据窗口生成的特点是构造非常方便,其缺点是不能实现多表数据生成图形,不显示具体的数值,貌似其图形的颜色也无法修改(用SetSeriesStyle()试了几次也未成功)。在网上搜索了一个,对图形控件的文章不是很多,经不断摸索,也终于算基本弄明白Graph控件的几个基本函数,做出的图形也基本满足了自己的要求,先上图。
其特点:1、图形的着色可由函数控制,根据自己喜欢的颜色生成。2、鼠标移动到系列轴上时可显示数值。3、系列轴的数值(也可包括百分比)显示在系列轴的下方。具体实现方法如下:
先放一个graph控件在窗口上,自动命名为gr_1。在窗口的open事件或gr_1的constructor下编写代码,自动生成图形。代码如下:
//设置类型轴的标签
gr_1.category.label = "时间"
//设置数值轴的标签
gr_1.values.label = "次数"
//分别从3个表中取出想要的数值,此代码大家自己写吧。主要用到数组和select count(*)语句和循环语句。这里简单的表示一下。如果不需要展示数值和百分比,代码相对比较简单了。
int i_tz[],i_jd[],i_fz[] //用于分别记录各小时内的数值,展示在系列轴下。
int i_all[] //用于记录各系列总数值,用于生成百分比,展示在系列轴下。
int i_day_all = 0 //用于生成全部累计值
int j //用于循环计数
for j = 1 to 23 //按小时分布
select count(*) into :i_tz[j] from tz where hour(start_time) = :j and XXX(其它条件);
select count(*) into :i_jd[j] from jd where hour(start_time) = :j and XXX(其它条件);
select count(*) into :i_fz[j] from fz where hour(start_time) = :j and XXX(其它条件);
i_all[j] = i_tz[j] + i_jd[j] + i_fz[j]
next
// 设置图形的标题。
gr_1.title = "XXXX分布图" + string(i_day_all) + "次"
//设置系列轴,也可增加变量统计各类型的总次数。如total_fz,total_jd,total_fz
//这里要用到第1个函数controlname.AddSeries(seriesname)
int series_tz,series_jd,seriese_fz //用于记录填加的系列轴的序号
series_tz = gr_1.AddSeries("主线外破" + string(total_tz) + "次")
series_jd = gr_1.AddSeries("主线外破接地" + string(total_tz) + "次")
series_fz = gr_1.AddSeries("分支外破" + string(total_tz) + "次")
//设置系列轴的填充色,注意系列轴的名称要与填加的名称保持一致,这里是名称不是序号
//这里用到第2个函数controlname.SetSeriesStyle(seriesname,Foreground!,color)
gr_1.SetSeriesStyle("主线外破" + string(total_tz) + "次",Foreground!,rgb(250,80,80))
gr_1.SetSeriesStyle("主线外破接地" + string(total_tz) + "次",Foreground!,rgb(80,220,50))
gr_1.SetSeriesStyle("分支外破" + string(total_tz) + "次",Foreground!,rgb(90,90,220))
//设置类型轴的数值,同时显示次数和占比,同时填加数据
//这里用到第3个函数controlname.AddCategory(categoryname),由于需要构造显示次数、占比,所以名字会较长。
//这里用到第4个函数controlname.AddData(seriesnumber,datavalue,categoryvalue)
//先构造类型轴的值
//系列轴的排序是按文本方式,若不加"0",顺序不是正常的阅读习惯。
string cate_value
for j = 1 to 23
if j < 10 then
//使用"~r~n"回车符,使时间、次数和占比分别位于不同的行
cate_value = "0" + string(j) + "时" + "~r~n" + string(i_all[j]) + "次" +"~r~n" + string(round(i_all[j]*100/i_day_all),2) + "%"
else
cate_value =string(j) + "时" + "~r~n" + string(i_all[j]) + "次" +"~r~n" + string(round(i_all[j]*100/i_day_all),2) + "%"
end if
//设置类型轴的值
gr_1.AddCategory(cate_value)
//为类型轴填加数据
gr_1.AddData(series_tz,i_tz[j],cate_value)
gr_1.AddData(series_jd,i_jd[j],cate_value)
gr_1.AddDate(series_fz,i_fz[j],date_value)
next
移动鼠标显示各系列数值、显示数值背景透明大家可以到网上自行查找,经测试按其代码可以实现。
大功告成。这里只用到关于graph的4个函数,其他函数可以通过powerbuilder的帮助功能查询使用。