依据条件改变数据颜色
(深圳:独孤求败 2003-05-26)
(深圳:独孤求败 2003-05-26)
依据条件改变数据颜色是许多场合都要用到的重要功能,数据颜色的改变不仅引人注目,而且能起到暗示作用,清楚地告诉用户价位的涨跌或状态的改变等。大多数证券期货实时行情显示软件都提供了这种功能。在当前价位比其前一价位高时,当前价位数据颜色变红,表示价位上涨;反之,颜色变绿,表示价位下跌;若当前价位与其前一价位相等,则数据颜色不变。PowerBuilder没有提供解决这一问题的捷径,但我们仍可利用动态数据窗来实现。先考虑一下实现的步骤,在Retrieve前需要把有关列的数据先保存起来;Retrieve后我们获得了相应列的新数据;我们需要将上述二者作一比较,以确定颜色的变化。值得指出的是,由于动态数据窗函数dwModify()只能用描述数据窗的模式串作参数,不能接收变量作参数,故我们得想法把比较的结果传递给数据窗。为解决这个问题,可以在定义数据窗时多定义几个空列,这几列不与数据库表中的列相对应,它们作为存放比较结果的缓冲区。原则上若需要N列实时地变色,则需要N列缓冲区,就应该多定义N个空列。下面给出了一个例子具体说明。
这段程序写在某窗口的Timer事件中,该窗口内有数据窗dw_infor,其"buy"、"sell"列分别表示买价和卖价,需要实时地变颜色。为此,我们在数据窗dw_infor中多定义了"buybuf"和"sellbuf"两列,分别存放"buy"列和"sell"列Retrieve前后数据比较的结果。
//Red=255;Green=65280
int i,infor_rownum decimalbuy_old[],sell_old[],buy_new[],sell_new[]
dw_infor.SetRedraw(false)
infor_rownum=dw_infor.RowCount()
FOR i=1 To infor_rownum
buy_old[i]=dw_infor.GetitemNumber(i,"buy")
sell_old[i]=dw_infor.GetitemNumber(i,"sell")
NEXT
dw_infor.retrieve()
FOR i=1 TO infor_rownum
buy_new[i]=dw_infor.GetitemNumber(i,"buy")
sell_new[i]=dw_infor.GetitemNumber(i,"sell")
NEXT
FOR i=1 TO infor_rownum
dw_infor.Setitem(i,"buybuf",buy_new[i]-buy_old[i])
dw_infor.Setitem(i,"sellbuf",sell_new[i]-sell_old[i])
NEXT
dw_infor.dwModify("buy.color='0~tif(buybuf>0,255,if(buybuf<0,65280,0))'") dw_infor.dwmodify("sell.color="0~tif(sellbuf>0,255,if(sellbuf<0,65280,0))'") dw_infor.setredraw(true)
我们看到,程序在Retrieve前后分别将"buy"和"sell";列的数据写进与其类型匹配的数组中,然后将比较的结果分别写入"buybuf"和"sellbuf"列,最后用函数dwModify()改变有关列的颜色。记住在该窗口的Open事件中设置事务对象并激活Timer事件。此外,还有一些方法可以改变颜色,比如先在某些需要变颜色的行或列设置带颜色的长方形,同时将其上面的数据窗中的数据设置成透明的,当条件改变时,可以通过改变数据窗后的长方形的颜色来实现。