PB控件属性之Graph

Graph图形控件

【其他】


类型轴--Category--String型、数值型、Date型、Datetime型和Time
值轴--Value--数值型、Date型、Datatime型和Time
系列轴--Series--String

图形外观
PowerBuilder
提供了17种图形外观,可以粗略划分为平面图形和立体图形两大类,也可以更细致地划分为5类,即(1)条型、列型(包括它们的立体变形);(2)区域和线型图形(包括它们的立体变形);(3)堆积图;(4)饼型图(包括立体变形);(5)散点图。

图形控件的三种使用方式。使用Graph显示样式的数据窗口是Graph类型控件最常使用的一种方式,因为这种方式提取数据比较方便,运行时动态改变要查看的范围也比较灵活。但是,由于这种使用方式的数据来源只局限于数据库,所以当应用程序还需要应用处理其他来源的数据时可以考虑使用窗口中的Graph控件。最后一种是在数据窗口中的Graph控件,因为这种方式不能自动提取数据,需要编写的脚本比较多,所以这种方式使用比较少。但是,因为提取数据都是由脚本完成,所以开发人员可以有更多的灵活性,可以让用户在运行时根据需要更灵活地控制控件的运行,所以在高级的应用软件中该控件还是经常使用的。


【属性】

▲Title属性:该届性保存的是Graph的标题内容,在控件的上方显示的大字标题,是String类型的属性。创建Graph控件后首先就要修改该属性,该属性应该说明图形中数据的用途、统计范围等信息。该属性可以在运行时修改。比如,修改窗口中Graph控件gr_1的标题,可以使用gr_1.title="商品销量统计";要修改Graph显示样式的数据窗口对象的标题,可以使用dw_1.object.gr_1.title="商品销量统计";如果要修改数据窗口对象中Graph控件
gr_1
的标题,可以使用语句dw_1.object.gr_1.title="商品销量统计"

▲GraphType属性:指定图形的外观类型。该属性的设定比较直观,都有相应样式的图标,在开发时设定只要在相应的属性窗口中选择就可以了。如果在运行时设定,可以用脚本修改控件的属性取值。对于窗口中的Graph控件使用相应的枚举值,gr_1.GraphType = Pie3D!;对于数据窗口中的控件或者Graph显示祥式的数据窗口使用相应的数值,dw_1.object.gr_1.graphtype= 17

▲Axis.Label属性:该属性可以设定不同坐标轴的标签。其中Axis可以是categoryvaluesseries三个。当统计图的设置需要根据用户的选择来确定时,需要在运行时修改坐标轴标签,可以使用该属性。
窗口中的Graph控件gr_1
gr_1.category.label = "haha"
gr_1.series.label = "hoho"
gr_1.values.label = "hehe"
数据窗口控件对应的数据窗口对象中图形控件
gr_1
dw_1.object.gr_1.category.label = "xaxa"
dw_1.object.gr_1.series.label = "xoxo"
dw_1.object.gr_1.values.label = "xexe"
图形显示样式的数据窗口中图形gr_1(同上)

▲Legend属性:当Graph中有系列时该属性可以控制例图(legend)是否显示以及显示在什么位置。数据窗口中取值为数字,窗口控件中的取值为枚举型。
窗口中的Graph控件gr_1gr_1.legend = atleft!
数据窗口控件对应的数据窗口对象中图形控件gr_1和图形显示样式的数据窗口中图形
gr_1:
dw_1.object.gr_1.legend = 1

(其他属性见帮助)

**Graph控件的属性

General属性页
▲GraphType
属性:该属性用来定义图形控件的外观。PowerBuilder提供了17种图形外观,见前面

▲SeriesSortCategorySort属性:该属性确定系列轴和分类轴的排序方式,是枚举型属性,有三个可用的取值:Ascending!为升序排列,Descending!为降序排列,Unsort!为原始顺序。

▲Legend属性:该属性用来定义是否显示例图以及显示在什么位置。可用的取值有atbottom!(底部),attop!(上面),atleft!(左面),atright!(右面)和nolegend!(不显示)。

▲Perspective属性:该属性用来确定图形和窗口之间的距离,只适用于三维图形。 通过拖动滑块可以调整该属性取值的大小,滑块拖动的同时就可以看见效果。

▲Elevation属性:该属性用来调整三维图形的视角,只适用于三维图形。拖动属性窗口中该属性的滑块向左移动时图形顺时针旋转,向右移动时图形做逆时针旋转。

▲Rotation属性:该属性在水平角度旋转图形,只适用于三维图形。该属性和上面的Elevation属性相配合,可以给用户最佳的观看角度。当然,在程序运行时允许用户修改这两个属性是最好的。

▲OverLapPercent属性:该属性确定图形的各个系列的重叠程度,以百分比的形式表示,该属性适用于平面图和列型图。在属性窗口中可以通过调节滑块来调整属性的取值。

▲Spacing属性:该属性用来确定分类轴上数据条或列之间的距离大小,以占用条或者列宽度的百分比表示。该属性不能用于平面区域图、平面线型图、平面饼图和散点图。例如,gr_1.Spacing=110表示数据条之间的距离为条本身宽度的110%

▲Depth属性:该属性用来调整三维图形的厚度,只适用于三维图形。

Axis属性页
▲Axis
下拉框:该下拉框用来选择要设置属性的坐标轴,可以选择的值有CategoryValues,当图形外观为三维并且有系列轴时还可以选择Series。进入到Axis属性页时首先就应该明确该下拉框的取值。选择不同的轴,该属性页中的属性即为选定轴对应的属性。当在脚本中修改图形控件的外观时,也应该指定是对哪个坐标轴的属性进行操作。语句格式是:Graphcontrolname.axisname.property=属性值。其中,axisname的值和该下拉框的可用值相同,property为坐标轴的属性。

▲Label属性:该属性用来定义Axis下拉框中选中的坐标轴的标签。上面已经介绍过如何在脚本中修改该属性,在开发环境中可以直接输入标签的内容。

▲ShareBackEdge属性:布尔类型属性,该属性用来指定三维图形是否有背景阴影。该属性缺省为True,表示背景有阴影。

▲AutoScale属性:布尔类型的属性,表示是否自动根据添加的数据值确定轴上显示的数据的刻度,即是否自动确定数据的最大值和最小值。并不是对所有类型的图形外观都可以修改该属性的,绝大多数的图形外观中该属性都为True并且不允许为False,只有散点图可以修改该属性为False或者为True

▲DataType属性:该属性用来确定在坐标轴上显示的数据的类型。不同的坐标轴可以使用的数据类型不同,在前面已经做过详细的介绍。在开发环境中通过选择可以指定坐标轴的数据类型。

▲RoundToRoundToUnit属性:这两个属性确定在AutoScale属性选中时轴上刻度的最大值和单位。当坐标轴变量的取值大于RoundTo属性的取值时,该坐标轴的最大刻度自动调整增加RoundTo的整数倍。比如,RoundTo取值为15,而坐标轴变量取值为18,则自动将该轴的最大刻度调整为30;如果坐标轴的最大取值为31,则坐标轴自动调整最大刻度为45。当坐标轴变量的最大取值都小于RoundTo属性值时,则坐标轴的最大刻度为RoundTo的取值。该属性的设置要和坐标轴的数据类型相匹配。RoundToDouble类型,RoundToUnit是枚举类型,它的取值范围取决于坐标轴的数据类型,坐标轴的每种数据类型都对应一些可用的RoundToUnit取值。比如,当坐标轴的DataType属性为AdtDate!时,RoundToUnit的取值可以为rndDefault!rndyears!rndMonths!rndDays!等。

▲MinimumValueMaximunValue属性:当AutoScale属性为False时该属性可用,同时RoundToRoundToUnit属性不可用。所以只有散点图中可以使用该属性,该属性用来设置坐标轴的最大值和最小值。

▲ScaleType属性:该属性设置刻度的类型。通常的刻度类型是线型的,但有时也许需要对数类型的刻度。该属性的三个可用值是Linear!Log10!Loge!

设置主刻度线:坐标轴的刻度线可以进行二级划分,即主刻度线和次刻度线,这样读取数据更方便、快捷。主刻度线的设置需要一组属性,包括主刻度线的个数(Major Divisions),刻度线的类型(MajorTic属性,可用的取值有4个:Outside!表示向外,Inside!表示向内,Straddle!表示交叉和Notic!表示没有刻度线),是否显示主刻度线网格线(MajorGridLine属性,有6个可用的值,可以直接在下拉框中选择需要的类型),每组几个刻度显示标签(DisplayEveryNLabels属性)等。

设置次刻度线:次刻度线的许多属性和主刻度线的类似,包括次刻度线的个数(MinorDivisions属性),次刻度线的类型(MinorTic)和是否显示次刻度网格线(MinorGridLine)等。

线条风格:用来指定主轴线(PrimaryLine属性)、辅助轴线(SecondaryLine属性)、0值线(OriginalLine)和框架线(Frame)等的线段类型。可以使用的类型有Continuous!Dash!Dot!DashDot!DashDotDot!Transparent!

Text属性页
该属性页中设置控件各个部分显示的文字内容和文字的显示方式。文字的这些显示属性是通过grDispAttr对象来定义的,可以在PB提供的工具Browser窗口中查看该对象的详细属性。在脚本中需要引用这些属性时可以使用如下格式:
GraphControlName.AxisName.grDispAttrName.Property
其中的Property可以从Browser窗口中查得,其他表示相应的属性。比如,要修改Graph控件gr_1Series坐标轴的字体显示属性为Italic,可以使用下面的语句:
gr_1.Series.DispAttr.Italic=True

▲TextObject下拉框:在图形控件中有很多的文本对象,在设定属性之前应该首先指定需要设定哪些文本对象的属性,该下拉框中就是要选择设定属性的文本对象。各个取值的含义如下:
Title
图形控件的标题
Value Axis Label
数据轴的标签
Legend
例图
Value Axis Text
数据轴的文本
Category Axis Label
分类轴的标签
Series Axis Label
系列轴的标签
Category Axis Text
分类轴的文本
Series Axis Text
系列轴的文本

▲DisplayExpression属性:该属性确定文本对象的显示内容,单击右侧的省略号按钮弹出编辑窗口,在编辑窗口中可以编辑表达式。表达式中可以使用运算符以及系统为Graph控件提供的一些缺省变量,这些都可以在编辑窗口中通过选择来组合表达式。

▲Escapement属性:该属性用来旋转文本对象的显示方向(对于标题和例图不可用)。例如,在TextObject下拉框中选择Category Axis Label文本时,然后在Escapement属性框中输入900,则文本对象逆时针旋转了90度,变成了垂直显示。在脚本中需要控制文本对象的旋转角度,可以用脚本修改相关对象的Escapement属性。比如修改gr_1的分类轴上标签显示方向:gr_1.Category.LabelDispAttr.Escapement=1800

数据窗口中的图形控件和Graph显示样式的数据窗口对象的属性
这两种情况下的图形实际上是相同的,都是图形控件,并且都可以为图形命名,使用该名称引用图形控件。下面的介绍中对这两种情况不加以区分。

▲Data属性页
该属性页用来设置Graph控件最重要的几个属性,即图形控件的数据来源。CategoryValueSeries分别用来设定几个轴的数据来源,可以直接选择其中的字段或者表达式,也可以手工输入,数据窗口对象中的很多表达式在这里都可以直接使用。比如,可以定义Day(RegDate)Series的数据源,其中RegDate是一个Date类型的字段,Day是一个提取日期的函数。对于初学者如果不能确定表示式是否正确,一个好的方法是将表达式首先在数据窗口对象的计算字段表达式窗口中进行校验,如果通过则可以使用。使用表达式可以更方便、精确地控制图形的显示。
数据窗口中的Graph控件可以选择显示数据的范围为pageall,而Graph显示样式的数据窗口只能选择all,即所有的数据。

▲General属性页
该属性页中设置常用的属性,Graph显示样式的数据窗口有该属性页,实际上该属性页和其他显示样式的数据窗口区别不大,只是增加了NameLine ColorShadeColor三个属性,这三个属性分别用来设置图形控件的名称、线条的颜色和阴影的颜色,其他属性参见前面关于数据窗口对象的介绍。

▲Graph属性页
该属性页设置图形的外观,很多属性都和窗口中的Graph控件在General属性页中的同名属性含义是相同的,在此不再赘述。


【函数】

Graph控件函数

★AddCategory函数:函数的语法是controlname.AddCategory(categoryname),作用是添加一个分类轴。只有当分类轴的数据类型为string时可以使用该函数。函数执行成功返回新添加分类轴的索引号,如果已经有同名的分类轴存在则返回同名分类轴的索引号。当原分类轴设置了排序属性,则新添加的分类轴按照原规则自动调整到适当的位置。函数执行错误返回-1。当需要在指定的位置添加分类轴时可以使用InsertCategory函数,当需要添加非string类型的分类袖时使用InsertCategory函数。例如,gr_1.addcatagory("pcs")的作是向图形控件中添加一个名称为pcs的分类轴。

★AddSeries函数:函数的语法是controlname.AddSeries(seriesname),作用是向图形控件controlname中添加名称为seriesname的系列轴。其中,seriesnamestring类型的参数,
是要添加的系列轴的名称。函数执行成功返回新添加的系列轴的索引号,如果已经有同名系列轴存在,则返回同名系列轴的索引号。函数执行错误返回-l。当需要添加其他类型的系列轴时使用InsertSeries函数。例如,向图形控件gr_1中添加一个名称为costs的系列轴,并保存它的索引号,可以使用语句:ls_s = gr_1.addseries("costs")

★AddData函数:作用是向图形控件的数据轴添加数据,该函数有两种语法格式。controlname.AddData(seriesnumber,datavalue {,categoryvalue})用于除了散点图之外的所有形式的图形控件,而controlname.AddData(seriesnumber,xvalue,yvalue)专门用于散点图。第一种语法格式时,将数据添加到指定系列轴的指定分类轴上(如果指定了分类轴)或者最后一个分类轴上(没有指定分类轴);当指定的分类轴不存在时则直接创建该分类轴,并按照原来分类轴的排序规则直接将该分类轴调整到适当的位置,然后将数据添加到相应的位置;如果指定的分类轴已经存在则数据将替换原来的数据。第二种语法格式时,xvalueyvalue分别为要添加的XY轴数据的大小,添加的位置由参数seriesnumber确定。这两种格式的函数,不管哪种都经常和函数FindSeries搭配使用,除非只有数量确定的系列轴。

★SetDataStyle函数:该函数有三种语法格式,分别用来设定图形控件的颜色,线型和填充方式等。语法如下:
controlname.SetDataStyle(seriesnumber,datapointnumber,colortype,color)
controlname.SetDataStyle(seriesnumber,datapointnumber,linestyle,linewidth)
controlname.SetDataStyle(seriesnumber,datapointnumber,enumvalue)
其中controlnameGraph控件的名称。各个参数的含义如下:
seriesnumber
integer类型,是要设置的数据所在系列的索引号
datapointnumber
integer类型,是要设置的数据所在数据点的索引号(也可以理解成是category的索引号)
colortype
GrcolorType枚举类型,用来指定要设置数据哪方面的颜色。可用的取值有Foreground!(文本颜色),Background!(背景颜色),LineColor!(线段的颜色)和Shade!(阴影的颜色,只适用于三维图形)
color
long类型,为colortype的新颜色。经常使用GRB函数来计算颜色,也可以按65536*Blue + 256*Green + Red的公式自己来计算颜色的取值
linestyle
LineStyle枚举类型,用来指定线段的类型。可用的取值有Continuous!Dash!DashDot!DashDotDot!Dot!Transparent!
linewidth
integer类型,是用象素数量来表示的线段的宽度

enumvalue
:枚举类型,用来设置数据点的填充方式或者符号类型,系统会根据参数的取值自动识别是设置填充方式还是符号类型。当设置填充方式时的可用值有Bdiagonal!Diamond!Fdiagonal!Horizontal!Solid!Square!Vertical!
三种语法格式中前面的两个参数都相同。如果想要将经过颜色设置的数据点恢复到缺省的颜色,可以使用函数gr_1.ResetDataColors(seriesnumber,datapointnumber)

★SetDataPieExplore函数:该函数是一个非常有用的函数,可以使饼型图中某部分的图形分离出来,在进行数据分析时经常使用该函数进行强调显示。该函数只适用于饼型图,语法是:controlname.SetDataPieExplode(serisnumber,datapoint,percentage),其中,参数percentage表示分离的饼块离开饼型图中心的距离占饼型图半径的百分比,取值范围为0-100,可以为小数。函数执行成功返回1,执行失败返回-1,如果参数为NULL,则返回NULL。经常在图形控件的DoubleClicked事件中调用该函数和函数ObjectAtPointer配合。使用户双击部分分离显示。如:
integer li_series,li_datapoint
grobjecttype lgobt_clicked
if this.graphtype <> piegraph! and this.graphtype <> pie3d! thenreturn
lgobt_clicked = this.objectatpointer(li_series,li_datapoint)
if (li_series > 0 and li_datapoint > 0) then
this.setdatapieexplode(li_series,li_datapoint,50)
end if
和该函数相关的函数是GetDataPieExplode,它的作用是查看某个饼块是否从饼型图中分离出来,并且得到分离出来的饼块的百分比。函数的语法是:controlname.GetDataPieExplode(series,datapoint.percentage)

★SetSeriesStyle函数:该函数有四种语法格式,分别用来设置系列轴的颜色、线型、填充方式与是否重叠等。语法如下:
controlname.SetSeriesStyle(seriesname,colortype,color)
controlname.SetSeriesStyle(seriesname,linestyle,linewidth)
controlname,SetSeriesStyle(seriesname,enumvalue)
其中,参数seriesnamestring类型的系列轴的名称,其他参数的意义和函数SetDataStyle中的同名参数是相同的。该函数经常和SeriesName函数配合使用,来读取已知索引号的系列轴的名称,然后再调用该函数设置其风格。如,下面的脚本用来改变用户点击处的系列轴的填充方式:
string ls_seriesname
integer li_seriesnbr,li_seriespoint
grobjecttype lgobt_mousehit
lgobt_mousehit = this.objectatpointer(li_seriesnbr,li_seriespoint) //
获取用户点击信息
if lgobt_mousehit = typeseries! then //
如果点击的是系列轴
ls_seriesname = gr_1.seriesname(li_seriesnbr) //
获取点击的系列轴的名称
this.setseriesstyle(ls_seriesname,horizontal!) //
设置系列轴的填充方式
end if
上面的函数可以允许应用程序在运行时让用户根据自己的偏爱来修改图形控件的外观,另外还应该让用户选择他所偏爱的图形类型。这可以通过改变控件的graphtype属性来实现,
可以构建下拉列表拒和下拉图形列表框等很多方式,让用户来选择图形控件的外观。

其他函数(具体语法见帮助)
FindaCategory
查找特定标签内容的分类轴的索引号
FindSeries
查找特定标签内容的系列轴的索引号
GetData
获取指定系列、数据点处的数据
GetDataPieExplode
获取饼图分离的比例
GetDataStyle
获取数据点的外观属性,具体语法取决于要获取哪方面的属性
GetDataValue
获取指定系列轴、指定数据点的数据
GetSeriesStyle
获取系列轴的外观属性,具体语法取决于要获取哪方面的属性
ImportClipBoard
将剪贴板上的数据插入到图形控件中
ImportFile
从指定的文件中输入数据到图形控件中
ImportString
从指定的字符串中输入数据到图形控件中
ModifyData
修改指定系列轴、指定数据点的数据,有两种语法格式
SaveAs
按照指定的格式保存图形控件中的数据
SeriesCount
计算图形控件中系列的数目
SeriesName
获取指定索引号的序列的名称
CategoryCount
计算图形控件中分类轴的数目
CategoryName
获取指定索引号的分类轴的名称
DataCount
计算指定系列轴上数据点的数目
DeleteCategory
删除指定的分类轴
DeleteData
删除指定系列轴上的指定的数据点
DeleteSeries
删除指定的系列轴
ObjectAtPointer
获取用户鼠标点击处控件的相关信息
★ObjectAtPointer
函数是一个非常重要的函数,经常在图形控件的Clicked事件或者DoubleClicked事件中用该函数获取用户鼠标点击处控件的相关信息,进而判断是否选择了图形控件的特定部件,从而决定是否继续执行其他脚本。该函数是一个比较重要的函数,应该加以掌握。函数语法是:
controlname.objectAtPointer({Graphcontrol,}seriesnumber,datapoint)
其中,controlname是图形控件的名称,通常在图形控件的相关事件中编写脚本时可以使用
This
指代词或者省略;当该函数用于数据窗口时参数Graphcontrol为数据窗口对象中的图形控件名称,这时controlname为数据窗口控件的名称。另外两个参数都是用来保存相关信息的,其中seriesnumber保存鼠标点击的系列轴的索引号,datapoint用来保存鼠标点击处的数据点的一个integer类型的参数。函数返回值为grObjectType类型的枚举值,用来指明用户所点击的是图形控件的哪一部分。经常对该函数的返回值进行判断,看用户是否选择了控件的特定部分。返回值有如下取值:
TypeCategory!
分类的标签
TypeLegend!
在例图框中,但不在系列标签上
TypeCategoryAxis!
分类轴或者标签间
TypeSeries!
联结系列的数据点的线(当图形为线型时),或者是例图框内的系列标签
TypeCategoryLabel!
分类轴的标签
TypeSeriesAxis!
三维图形的系列轴
TypeData!
数据点或者其他数据标记
TypeSeriesLabel!
三维图形系列轴的标签
TypeGraph!
图形控件内不是另一个grObjectType的任何位置
TypeTitle!
图形的标题
TypeValueAxis!
包括指标签的值轴
TypeValueLabel!
值轴的标签


**
数据窗口中的Graph控件

如何在程序运行时控制数据宙口中的图形控什,使其外观、数据显示等都符合用户的要求,这些情况和窗口中的图形控件是类似的。因为数据窗口中的图形控件可以自动提取数据,所以大部分工作是修改控件的图形外观以及如何获取图形控件中的相关信息。窗口中图形控件的很多函数也可以使用,语法稍微有些区别,一般都比其多一个参数用来指定图形控件的名称,并且这个参数是第一个参数。比如,获取用户在数据窗口中图形控件上点击的信息,可以使用如下语法格式的ObjectAtPointer函数:
controlname.objectatpointer(graphcontrol,seriesnumber,datapoint)
而在窗口中的语法格式如下:
controlname.objectatpointer(seriesnumber,datapoint)
其中,参数Graphcontrolstring类型的参数,为数据窗口中的图形控件的名称。函数执行后的返回值和窗口中Graph控件的同名函数的返回值相同。


**
*
datastore lds_data
integer li_i
integer li_amount
string ls_name,ls_date
integer li_sno

lds_data = create datastore
lds_data.dataobject = "d_sale"
lds_data.settransobject(sqlca)
if lds_data.retrieve() <= 0 then return

for li_i = 1 to lds_data.rowcount()
li_amount = lds_data.getitemnumber(li_i,"amount")
ls_date =string(month(date(lds_data.getitemdatetime(li_i,"saledate"))))
ls_name = lds_data.getitemstring(li_i,"name")

li_sno = gr_1.findseries(ls_name)
if li_sno <= 0 then
li_sno = gr_1.addseries(ls_name)
end if
gr_1.adddata(li_sno,li_amount,ls_date)
next
*grobjecttype lgot_obj
integer li_series,li_po

lgot_obj = gr_1.objectatpointer(li_series,li_po)

if lgot_obj = typedata! then
st_1.text = string(this.getdata(li_series,li_po))
st_1.x = parent.pointerx()
st_1.y = parent.pointery()
st_1.visible = true
end if

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值