| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2864 人关注过本帖
标题:下面红色的标记的代码表示什么意思?
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1529
专家分:180
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:22 
下面红色的标记的代码表示什么意思?
CREATE TABLE orders (订单号 C(2),订单日期 d ,发货日期 d, 订单金额 N(6))
INSERT INTO (订单号,订单日期,发货日期,订单金额) VALUES ("01",{^2008-10-1},{^2008-10-25})
create report report1.frx

添加域控件订单号,订单日期,发货日期,订单金额,并设置保存在USER 字段中的
指令为:"*:EFFECTSFORECOLOR=IFF(发货日期> 订单日期+10,RGB(255,0,0),RGB(0,0,0)"
接着
建一个EffectsListener的派生类,该类保存在DyFormat.prg文件中。
DEFINE CLASS EffectsListener AS ReportListener  

  PROCEDURE EvaluateContents(tnFRXRecno, toObjProperties)
  LOCAL lcEffect,lnSession,lcExpression  
 
  lcEffect="*:EFFECTS FORECOLOR"
  lnSession=SET("Datasession") &&保存当前数据工作期
  
  SET DATASESSION TO This.FRXDataSession &&转到报表定义文件数据工作期
  SELECT FRX &&选择报表定义文件工作区
  GO tnFRXRecno &&根据记录号定位记录
   
  IF ATC(lcEffect,FRX.User)>0 &&查找USER字段中是否包含“*:EFFECTS FORECOLOR”标记
  lcExpression=STREXTRACT(FRX.User,lcEffect+'=',CHR(13),1,3) &&提取出IIF()函数语句
  LOCAL lnColor,lnPenRed,lnPenGreen,lnPenBlue
   
  SET DATASESSION TO lnSession &&返回报表数据工作期
  SELECT Orders &&转换到Orders临时表来计算发货日期是否大于定货日期+10
  lnColor=EVALUATE(lcExpression) &&根据表达式计算颜色值
  IF VARTYPE(lnColor)='N'
&&&  如果用lnColor=EVALUATE(lcExpression) &&根据表达式计算颜色值,lncolor=255

有以下几个问题请教:


*!* 根据颜色值重新分离为RGB颜色值   &&1。颜色值与RGB颜色值的区别?


  lnPenRed=BITAND(lnColor, 0x0000FF)     &&&2。lncolor为什么与0x0000FF比较
  lnPenGreen=BITRSHIFT(BITAND(lnColor, 0x00FF00), 8)  &&&3。lncolor为什么与0x00FF00比较并称位8
lnPenBlue=BITRSHIFT(BITAND(lnColor, 0xFF0000), 16))   &&&4。lncolor为什么与0xFF0000比较并称位16

  WITH toObjProperties
  IF .PenRed<>lnPenRed OR .PenGreen<>lnPenGreen OR .PenBlue<>lnPenBlue
  .PenRed=lnPenRed  
  .PenGreen=lnPenGreen
  .PenBlue=lnPenBlue
  .FontStyle=129 &&粗体(1)+删除线(128),见表12-17中的说明
  .Reload=.T. &&通知ReportListener进行重绘
  ENDIF  
  ENDWITH  
  ENDIF  
  ENDIF  

  SET DATASESSION TO lnSession

  *!* 执行默认行为
  DODEFAULT(tnFRXRecno, toObjProperties)
  ENDPROC  


要在报表中使用EffectsListener类,建立一个名为runreport1.prg,代码如下:
loListener=NEWOBJECT("EffectsListener","DyFormat.prg")
loListener.ListenerType = 1 &&输出到预览窗口
loListener.OutputType = 1
REPORT FORM Report1.frx OBJECT loListener

[ 本帖最后由 sylknb 于 2012-1-17 18:24 编辑 ]
搜索更多相关主题的帖子: create report 订单号 
2012-01-17 18:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
分離顏色值為RGB三色基值,下面是我寫的代碼,與上面的一樣原理:

程序代码:
*-------------------------------
* 求出长整型颜色值的RGB分量
* 参数:tnColor -- 长整型颜色值
*       tnRed   -- 红色分量(引用传递)
*       tnGreen -- 绿色分量(引用传递)
*       tnBlue  -- 蓝色分量(引用传递)
* 备注:通过参数返回值
*-------------------------------
PROCEDURE RGBComp(tnColor, tnRed, tnGreen, tnBlue)
    tnBlue = BITRSHIFT(tnColor, 16)
    tnGreen = MOD(BITRSHIFT(tnColor, 8), 256)
    tnRed = MOD(tnColor, 256)
ENDPROC

這個分離顏色的函數,在VFP9自帶的工具文件夾中有,不過明白它的原理,自己寫一個也很方便,省得多調用一個外部庫。

[ 本帖最后由 TonyDeng 于 2012-1-17 18:34 编辑 ]

授人以渔,不授人以鱼。
2012-01-17 18:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
在24位真彩色系統中,每個點的顏色由3個字節(3*8=24)構成,故稱24位顏色。3個字節是按順序排列的,從低位到高位(人的閱讀順序即是從右至左)依次是紅、綠、藍,每個字節代表一個分色值。整個8字節24位二進制數在內存中是長整型數(對16位機器而言這是長整型,即long int)。

現在看看黃色,它的RGB表示法是RGB(255,255,0),轉換為內存數據,是CHR(0)+CHR(255)+CHR(255),這是一個3字節的字符串,從右到左就是紅、綠、藍分色的內碼,這個字符串就是24位二進制數據。

這個表示法相當於如下操作:Color = red + 256 * green + 256 * 256 * blue,每乘一個256,數據增加一個字節,即是左移8位,逆運算就是右移。
要從這樣的數據反求三色,執行逆運算即可。比如求紅色,用Color值除以256(256是1個字節的滿位值,ASCII字符是256進制的),餘數就是紅色值,其餘類推。


[ 本帖最后由 TonyDeng 于 2012-1-17 18:56 编辑 ]

授人以渔,不授人以鱼。
2012-01-17 18:48
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1529
专家分:180
注 册:2006-6-3
收藏
得分:0 
还是不明确,能简单一点,太笨了。
2012-01-17 20:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
Color = red + 256 * green + 256 * 256 * blue
總之,你想辦法從上面的公式反求r、g、b吧,自己想通了,就知道怎麼做了,呵呵~

授人以渔,不授人以鱼。
2012-01-17 20:13
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1529
专家分:180
注 册:2006-6-3
收藏
得分:0 
还没有转过来,举一个简单列子好吗?
2012-01-17 20:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
當數學題做嘛。你看那個公式,右側三項,兩項是256的倍數,只要除以256,餘下的就是第一項red,然後把red減掉,剩下右邊兩項,刨去一個256之後,情形跟剛才一樣。如此反復,就把三項都提取出來了。用移位運算,也是要把每個字節提煉出來,移位及與三個16進制書與運算,都是為了提取字節數據。0x0000FF、0x00FF00、0xFF0000,FF(即256)分別處於三個不同位置,正是三分色的滿值,分別對應我上面所說的三個位置。

授人以渔,不授人以鱼。
2012-01-17 20:45
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
求三色值
2012-01-17 21:54
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1529
专家分:180
注 册:2006-6-3
收藏
得分:0 
Color = red + 256 * green + 256 * 256 * blue
是不是这样理介;
第1次除256,red/256除不尽余256,为F;(256 * green )/256 没有余数,为0,(256 * 256 * blue)/256没有余数,为0,color=f,0,0
第2次除256,green/256除不尽余256,为F,,( 256 * blue)/256没有余数,为0,color=0,f,0

第3次除256,( blue)/256除不尽余256,为F,color=0,0,f

对公式还不是清楚能否举一个运算过程好吗?下面三张图是各16进制化二进制
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

如果用lnColor=EVALUATE(lcExpression) &&根据表达式计算颜色值
程序运行是用   lnColor,时lncolor=255



为什么:BITAND(lnColor, 0x0000FF)                 按位与变成什么色?
        BITRSHIFT(BITAND(lnColor, 0x00FF00),  8)   为什么与0x00FF00按位与,并转位8,它结果变成什么色?
        BITRSHIFT(BITAND(lnColor, 0xFF0000), 16) 为什么与0x00FF00按位与,并转位16,  它转位变成什么色?


2012-01-17 22:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
24位16進制數Color,當我們用0x0000FF與它的時候,因為前16位全是0,後8位全是1,根據與邏輯運算,把Color的前16位全部覆蓋為0,只留下後面8位的數據,而這正是我們需要提取的red數據。同樣,跟0x00FF00與運算,就是提取中間的1個字節(8位),因為右邊多了8位0,所以全體右移8位把那8個0擠掉,就是green值。blue也一樣。

授人以渔,不授人以鱼。
2012-01-17 22:43
快速回复:下面红色的标记的代码表示什么意思?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022189 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved