GRAPH在PowerBuilder中的应用在线教程
上图中,序列A在横坐标为2时是一个断点,序列B在横坐标为5时是一个断点。同时,我们注意到,横坐标的间隔点值分别为1、2、4、5、 7、8、9、10。数值相差并不均匀,但在坐标轴上却均匀间隔,这使得我们看到的图形并不能反映真实情况。为什么出现这种情况呢?这是因为:PowerBuilder按CA值从小到大顺序自动从数据库中取点连线。它并不考虑这些点横坐标的意义,所以只按所取点的不同横坐标数均匀分割横坐标轴。在这种情况下,GRAPH只能取确实存在于数据库中的数据。对于序列A,数据库中不存在CA为4的记录;对于序列B,数据库中不存在CA为7的记录。PowerBuilder取点连线时,以一个指针(假定为P )记录当前CA值,以另一个指针(假定为Q)记录其前一个CA值。当P值为 4时,只取到B序列的一个点(B,4,13),因此时Q值为2,故与B序列中CA为 2的点(B,2,10)相连,A序列中CA为2的点(A,2,5)此时没有与之相连的点。然后P指针前移,指向A值为5,Q指针前移,指向CA值为4。此时取到两点(A,5,14)、(B,5,11)。但因Q值为4,所以(B,5,11)与B序列CA值为 4折点 (B ,4,13)相连,而(A,5,14)却无A序列CA值为4的点相连,故不 连。然后P、Q指针再次后移。这样就造成点(A,2,5)被跳过,成为A序列的断点。同理,B序列在(B,5,11)处也是断点。如何解决这些问题呢 ?我们不能离开原始数据本身去修改运算结果,即不能在GRAPH上直接修改,而应考虑数据源。因为在只做查询时,数据库中数据一般不能修改,一种办法是将欲显示的数据从数据库中读出,经过处理后放入某一外部文件,然后令GRAPH从该文件读取数据,形成显示结果图。这就要结合上面所述的使用GRAPH的第二种方法:将GRAPH作为控件放入某一窗口中。下面举例说明其实现方法:在某一窗口如W—GRAPH中放入一 个GRAPH控件(GR—1),在该控件的CONSTRUCTOR脚本中加入以下SCRIPT 语句:
li—FileNum
long ff
string str
li—FileNum= fileopen ("c:\try.txt", LineMode!,WRITE!,Lo ckWrite!,REPLACE !)
fileseek(li—FileNum,0,FromBeginning!)
for i=1 to seriescount
//seriescount为图中序列个数,各序列名称在series[ ]中
for j=1 to categorycount
/*categorycount为横坐标的坐标点数。由要显示的数据CA值范围及相邻CA值的最小间隔长度决定。例如:要显示的数据CA值在1到10 的范围内,若不同CA值最小相隔为0.5,则此时categorycount值为20, 横坐标值为0.5,1,1.5,2……;若不同CA值最小相隔为1,则此时catego rycount值为10,横坐标值为1,2,3……。各横坐标值在category[]中 */
VARCA=0
SELECT CA
INTO:VARCA
FROM QUERYDB
WHERE ABS(QUERYDB.CA-:CATEGORY[J])<=1E-6:
if VARCA=0 and j>1 then
/*插补的CA值原数据库中不存在,对应VA值要进行修正。方法是找出当前CA值(CATE GORY[J])其前最临近的一个(第M个)、数据库中 存在的CA值对应的VA值(PVA)、其后最临近的一个(第N个)、数据库中存在的CA值对应的VA值(SVA),取(SVA-PVA)*(J-M)/(N-M)作为当前VA 值。赋予VALUE[1,J]*/
修正
//程序略
end if
** str=series[i]+" "+category[j]+" "+value[i,j]
filewrite(li—FileNum,str)
next
next
ff=FileLength("c:\TRY.txt")
gr_1.importfile("c:\TRY.txt",1,ff)
//程序结束
在**行,series[i]中存放当前序列名称,如"A"、"B"、"C"等(i=1 ,2……);category [j]中存放当前横坐标分隔点 名称,如"1"、"2"、 "3"、"4"等(j=1,2……)。value[i,j] 中存放对应于当前序列及横坐标的相应纵坐标值。双引号中不是空格,而是TAB键,如果键入的是空 格,则代表换行,TAB键则表示在本行中空一个字符。
这样在W_GRAPH窗口打开后,该图形将有如下显示形式,而不存在断点问题:图2