原文:http://eclipse.org/birt/phoenix/deploy/reportScripting.php
BIRT提供了一个基于Mozilla Rhino的脚本模型。报表引擎创建报表的过程可以划分为两个阶段——生成和呈现。生成阶段利用报表设计,生成一个名为报表文档的中间文件。呈现阶段利用报表文档进行渲染,生成HTML或PDF。报表生产线既可以将两个阶段作为一个任务执行,也可以作为两个任务分别执行。如果作为一个任务,那么报表文档是生成在内存中。在设计器中选择『以HTML方式预览』时,默认是采用这种方式的。反之,如果作为两个任务分别执行,那么报表文档将被保存在磁盘中。在设计器中选择『在浏览器中预览』时,默认是采用这种方式的。
每一个阶段的事件都通过事件处理器覆盖,用以修改报表内容。既可以用JavaScript,也可以用Java。
事件
三大对象——报表对象、报表元素和数据源(集)——具有脚本事件。当前所处的阶段决定了可以定制的事件类型和对象属性。
下图描绘了包含一个表和一个数据元素的简单报表的事件触发顺序:
reportContext和this
在使用Script编辑器时,如果选择Pallette View,那么会显示选定的报表元素、指定事件中能够使用的函数和变量。例如,下图指出了某个数据元素的onCreate事件能够使用的函数和变量:
this可用于在事件中列出元素的所有方法和属性。
reportContext则可以用于访问和修改报表一级的属性。开发人员可用它来设置全局变量。例如:
报表的onInitialize事件
reportContext.setPersistentGlobalVariable("testglobal", "test global string");
用Persistent版本的方法能让变量跨持久化。变量是Object类型的,具有高度的灵活性。
某个表中一个标签的onPrepare事件
this.text = reportContext.getPersistentGlobalVariable('testglobal');
全局变量可以通过绑定编辑器赋给数据元素。只需在给定列的表达式构建器中引用该变量即可。例如,如果绑定编辑器中有一列,其值从数据库取回。那么可以通过以下的表达式,在原值后附加上某个全局变量的值:
dataSetRow["MyString"] + "-" + reportContext.getPersistentGlobalVariable('testglobal');
reportContext也可用于访问会话级变量。
// attributeBean是Birt Viewer提供的一个会话级变量
myAttributeBean = reportContext.getHttpServletRequest.getAttribute('attributeBean');
reportDoc = myAttributeBean.getReportDocumentName();
this.text = reportDoc;
reportContext允许访问和修改脚本内使用的上下文。例如:
报表的onInitialize事件
appContext = reportContext.getAppContext();
importPackage(Packages.java.util)
myArrList = new ArrayList();
myArrList.add("one");
myArrList.add("two");
appContext.put("AppContextTest", myArrList);
这段代码读取了当前的应用上下文,并进行了一些修改。然后,可以在某个标签元素的onPrepare事件处理器中,这样使用:
appContext = reportContext.getAppContext();
myObject = appContext.get("AppContextTest");
this.text = myObject.size();
上例也可以这样实现:
reportContext.setPersistentGlobalVariable("testglobal", myArrList);
reportContext还可用于获取当前的区域信息,以及存储于资源文件中的消息。
报表级事件
afterFactory
|
结束生成阶段时执行
|
afterRender
|
结束呈现阶段时执行
|
beforeFactory
|
开始生成阶段前执行
|
beforeRender
|
开始呈现阶段前执行
|
initialize
|
开始生成阶段和呈现阶段前执行
|
在initialize事件中,可以定义全局函数、变量和对象。例如,创建一个全局的函数:
function gTest(v){
return "Global Function:" + v;
}
// 仅在图表脚本中使用时需要
reportContext.setPersistentGlobalVariable("gTest", gTest);
只需这样调用:
gTest("MyTest");
或:
gTest = reportContext.getPersistentGlobalVariable("gTest");
val = gTest("Use Persistent");
在图表脚本中访问reportContext时,使用:
context.getExternalContext().getScriptable()
如,图表标题可以这样修改:
function beforeGeneration(chart, context){
importPackage(Packages.org.eclipse.birt.chart.model.type.impl);
newChartTitle = context.getExternalContext().getScriptable().getPersistentGlobalVariable("testglobal");
chart.getTitle().getLabel().getCaption().setValue(newChartTitle);
}
在beforeFactory中,有几个方法可以用于访问报表中的元素。需要对元素命名。例如,想要在动态文本元素"TestHeader"中显示数据集"orders"的查询语句,可以在beforeFactory中这样写:
query = this.getDataSet("orders").queryText
this.getDynamicText("TestHeader").valueExpr = "query;";
报表元素级事件
onPrepare
|
生成阶段中,为每个报表元素调用一次。可用于修改设计。变更影响元素的所有实例,例如,所有的表行。
|
onCreate
|
生成阶段中调用。可访问和修改元素的某个实例(如,每隔9行设置1行背景为红色)
|
onRender
|
呈现阶段中调用。类似于onCreate。不可访问数据。
|
一个非常简单的例子——某表中的明细行:
onPrepare:
this.getStyle().backgroundColor = "red"; // 影响所有行
onCreate:
if (this.getRowData().getExpressionValue(3) > 100)
this.getStyle().backgroundColor = "red"; // 只影响该行
如果该表中有100行,则onPrepare只调用1次,而onCreate和onRender将调用100次。
元素级事件实例
设置标签、文本、动态文本和数据元素的值
标签:onPrepare/onCreate
this.text = "My New Label"
文本:
this.context = "My New Text"
动态文本:
this.valueExpr = "row['CITY']";
this.valueExpr = "'my row count: ' + (row[0] + 1)";
数据元素:
使用绑定编辑器。
设置TOC
类似于值表达式,期待字符串:
this.tocExpression = "'tocbyrownumber: ' + row[0]";
使用行数据
在onCreate中可使用行数据,可用于对值进行检查。
this.getRowData().getExpressionValue(i) // 第i列的值
this.getRowData().getExpressionValue("some_expression") // 对该行套用表达式的值
例如:
if (this.getRowData().getExpressionValue(1) == "product1")
this.getStyle().backgroundColor = "red";
if (this.getRowData().getExpressionValue("row[price]" == "$30")
this.getStyle().backgroundColor = "blud";
修改超链接
可在onPrepare中修改:
this.getAction().URI = "'http://www.google.com'";
getStyle
用于定制给定元素的属性。例如:
this.getStyle().fontWeight = "bold";
getParent
用于访问父元素。例如,从数据元素获取表:
this.getParent().getParent().getParent();
getValue
满足一些基于值变更视觉外观的需求。
if (this.getValue() > 30){
this.getStyle().fontFamily = "Arial"
this.getStyle().backgroundColor = "Yellow"
}
命名表达式
是指在某个元素上创建,并给予命名的表达式。其定义可在onPrepare中修改,其值可在onCreate和onRender中访问。例如,定义一个表达式totalCreditValue,其值为Total.sum(row[?CREDITLIMIT?])。然后,就可在其他元素中用JavaScript和Java访问。
例如,在某个表上建一个表达式"RWC",值为row[0],则可在行中用以下方式访问:
rc = this.parent.getNamedExpressionValue("RWC");
分享到:
相关推荐
2. **Thunderbird脚本**: - 自动化任务:通过编写脚本实现定时任务,如自动备份邮件、定期发送报告等。 - 用户配置:批量设置用户界面、快捷键、首选项,以符合企业标准。 - 数据迁移:脚本可以帮助快速迁移大量...
2. 脚本系统:Unity使用C#进行游戏逻辑编写,FlappyBird的Unity版本中,Bird的运动、碰撞检测、游戏逻辑等都是通过C#脚本来实现的。 3. 物理引擎:Unity内置的物理引擎处理Bird的飞行和碰撞。Bird的跳跃通过添加...
Flappy Bird的资源包括图像素材、音频文件和可能的游戏逻辑脚本。在"Flappy bird资源.zip"压缩包中,我们可以找到这些关键元素,例如背景图片、小鸟动画序列、管道图形、碰撞检测所需的物理形状等。 Unity引擎支持...
1. **Bird脚本**:控制鸟的飞行,包括点击屏幕时的上升力和重力下落。 2. **Pipe脚本**:管理管道的生成、移动和销毁,实现无尽的关卡。 3. **Score脚本**:记录并显示玩家得分。 4. **GameManager脚本**:控制游戏...
1. 游戏逻辑:Flappy Bird的核心在于角色的飞行控制和管道的生成与移动。源码中会包含角色跳跃的物理模拟,以及通过调整角色的向上速度来实现“飞行”。同时,管道的随机生成和碰撞检测也是游戏的关键部分,这些功能...
总的来说,通过学习和分析Flappy Bird的源码,我们可以掌握Unity游戏开发的基本流程,包括游戏对象的创建、脚本编程、物理引擎的运用、碰撞检测、动画控制以及资源管理。这不仅有助于我们理解游戏的工作原理,也有助...
- 在Unity3D中,游戏逻辑通常由C#脚本控制。我们需要编写几个关键的脚本,如控制小鸟飞行的“BirdScript”,生成和移动管子的“PipesScript”,以及处理游戏状态和得分的“GameManagerScript”。 5. **场景构建与...
"flybird"项目中,游戏场景包含玩家角色(鸟)、管道、地面等游戏对象,每个对象都有各自的脚本组件来控制它们的行为。 2. **物理引擎**:Unity3D内置了物理引擎,使得游戏中的物体可以模拟真实世界的物理规则,如...
Unity3D中的C#编程语言可以实现这一逻辑,通过创建脚本来控制小鸟的飞行和碰撞检测。 在Unity中创建项目时,我们首先需要设置场景。设定一个2D项目,并添加天空盒背景,然后导入必要的素材,包括小鸟、管道、地面等...
总的来说,Unity Flappybird项目是一个很好的学习平台,可以帮助开发者掌握Unity的基本功能,包括2D游戏开发、物理系统、动画控制、输入管理、脚本编写和UI设计等多个方面。通过实践这个项目,你将能够提升自己的...
C#脚本可以控制Sprite的位置、大小和旋转。 8. **音频播放**:游戏中的音效增强用户体验。C#可以控制Audio Source组件播放和停止音频。 9. **游戏状态管理**:游戏有开始、游戏进行、游戏结束等状态,C#可以创建...
4. 游戏逻辑脚本:这部分可能包含示例代码,用于演示小鸟的移动逻辑、碰撞检测、得分计算等。对初学者来说,这是理解游戏核心逻辑的重要资源。 自学开发Flappy Bird,你需要掌握以下几个关键技术点: 1. **2D图形...
通过分析这个Flappy Bird项目,我们不仅可以了解到Unity3D的基本使用,还能掌握游戏开发的关键技术,包括物理模拟、碰撞检测、动画系统、脚本编程和跨平台发布等。对于想要学习或提升Unity3D技能的开发者来说,这是...
4. **版本控制**:压缩包名为`thunderbird-monterail-master`,其中的`master`通常与Git版本控制系统相关,表示这是项目的主分支。这表明主题的开发可能是在Git上进行的,因此,版本控制的概念和命令也是开发者需要...
总结,制作一款类似FlappyBird的游戏,需要掌握Unity的基本操作,理解2D物理引擎的运用,编写逻辑清晰的C#脚本,并且能够运用Unity的动画系统和用户交互机制。通过实践,开发者不仅可以提升技术能力,还能体验到游戏...
你需要编写脚本来控制游戏逻辑,如鸟的飞行、碰撞检测、得分计算、游戏结束条件等。例如,你可以创建一个名为“BirdScript”的C#脚本,其中包含Update()函数,用于检查按键输入并调整飞行状态。 6. **碰撞检测**:...
这些UI元素可以通过RectTransform组件进行布局,并通过脚本控制它们的行为。 7. **碰撞检测**:Unity的Collider组件用于实现游戏对象间的碰撞检测。在Flappy Bird中,小鸟与管道的碰撞检测是游戏失败的关键条件,...
此项目展示了如何将流行的Flappy Bird游戏移植到微控制器上,使其能够在小型硬件平台上运行,无需复杂的图形处理单元或高性能处理器。下面我们将详细探讨其中涉及的关键知识点。 首先,"FlappyBird含图素资源,直接...
总结,通过Cocos Creator,开发者可以快速地构建出FlappyBird这样的游戏,利用其丰富的组件和便捷的脚本系统,实现游戏逻辑与交互。掌握这些基本知识,不仅能够帮助你制作FlappyBird,还能为其他2D游戏开发打下坚实...
开发者可以学习如何编写控制角色移动、碰撞检测、分数计算、游戏状态管理等脚本,理解游戏循环、对象生命周期和事件处理等概念。 5. **2D游戏开发**: Flappy Bird是一个2D游戏,Unity的2D工具集包括Sprite ...