照清

用勤奋之这石,补能力之缺口!

导航

PB中依据条件改变数据颜色

Posted on 2008-06-18 15:14  照清  阅读(3397)  评论(0编辑  收藏  举报
    最近刚刚开始接触PB程序的开发,感觉PB对数据库的操作还是蛮灵活的。为此在该方面的一些知识与大家分享,希望能够共同学习讨论。以下为正文:

     依据条件改变数据颜色是许多场合都要用到的重要功能,数据颜色的改变不仅引人注目,而且能起到暗示作用,清楚地告诉用户价位的涨跌或状态的改变等。大多数证券期货实时行情显示软件都提供了这种功能。在当前价位比其前一价位高时,当前价位数据颜色变红,表示价位上涨;反之,颜色变绿,表示价位下跌;若当前价位与其前一价位相等,则数据颜色不变。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事件。此外,还有一些方法可以改变颜色,比如先在某些需要变颜色的行或列设置带颜色的长方形,同时将其上面的数据窗中的数据设置成透明的,当条件改变时,可以通过改变数据窗后的长方形的颜色来实现。 

Hellow!