|
Fiddler是一个微软开发的Http代理,可以用于跟踪调试客户端与服务器之间的Http信息,Fiddler监控所有的Http往来,可以设置断点,窜改出入数据。
在ActionScript3.0中是不支持函数重载的. 最近, 想了个办法来模拟. public function add(obj1 : Object = null, obj2: Object = null) : void { if (obj1 == null && obj2 == null ) { // 调用无参数Add函数 AddNoArgument(); } else if ( typeof(obj1).toString().toLowerCase() == "string") && obj2 == null ) { // 调用String参数的Add函数 AddString(obj1.toString()); } } 当然这个方法也会有一些问题. 第二种方法 public function add( args) : void { if (args.length == 0) { // 调用无参数Add函数 AddNoArgument(); } else if ( args.length == 1 && typeof(args[0]) == "int") ) { // 调用String参数的Add函数 AddString(args[0].toString()); } } 其中addString是add函数的String类型的重载函数. 如果大家有什么更好的解决方案, 请不吝赐教.
XtraReports的设计器可以作为给终端用户使用的独立的报表设计器, 也就是说用户可以自己编辑,预览,甚至创建报表. 这个设计器和Visual Studio的集成开发环境很象, 可以定制外观, 满足用户的需要. 甚至, 你可以自己创建报表设计器, 因为在XtraReport中设计器是一个分开独立的控件. 先介绍一下设计器的组成元件. 报表设计器主要是用于使用户可以编辑报表. 标准的设计器是使用XRDesignFormEx类来展示的, 这个类提供了编辑和创建报表的主要功能. 下图是一个标准的报表设计器: 这个Form里包含了不同的元件: 报表在XRDesignPanel对象中被编辑, 其他工具栏和停靠面板由XRDesignBarManager和XRDesignDockManager控制. 所有的这些控件都可以通过设计Form的XRDesignFormExBase.DesignPanel, XRDesignFormEx.DesignBarManager和XRDesignFormEx.DesignDockManager属性来操作. 下面列举了设计器中使用的元件接口. Element | Description |
---|
Design Panel | 这是报表设计器的主要元件. 它展示了一个面板用于创建一个新的报表或者编辑原有的报表. 它显示报表带并控制报表带中控件的归属, 并可以移动, 缩放, 复制, 粘贴这些控件, 另外还可以在控件上绑定数据, 或者进行其他的操作. 而且可以预览报表效果.
| Main Menu | 展示报表设计器的主菜单. 包含了一系列的项目和子项目, 用于为用户提供相关操作. 通常, 它复制所有的ToolBar按钮, 格式化按钮以及布局按钮.
| Main Toolbar | 展示报表设计器的ToolBar. 包含创建报表, 保存装载报表布局, 剪裁,复制,粘贴等按钮, 以及撤销, 重做等操作.
| Formatting Toolbar | 展示报表设计器的格式化Toolbar. 包含一些缺省的操作文本的按钮.
| Layout Toolbar | 展示报表设计器的布局Toolbar. 包含缩放, 移动一组控件位置的按钮.
| Status Bar
| 在报表设计器底部展示StatusBar. 通常用于显示报表编辑操作过程中的特殊信息.
| Toolbox | 展示报表设计器的控件工具箱. 包含所有报表控件, 可以拖放新的控件到报表区中. 可以添加自定义控件到工具箱中.
| Report Explorer | 展示报表设计器的Explorer. 它显示了报表树状结构, 使用它可以很方便地浏览整个报表.
| Field List | 展示了报表设计器的树状字段列表. 显示了数据源的树状结构. 用于将数据绑定到报表.
| Property Grid | 展示报表设计器的属性容器. 可以修改报表元件的属性.
|
激活报表设计器: 尽管报表设计器是XRDesignFromEx的实例, 但一般不需要手工创建此对象. 通常使用以下代码: // Create a new report. XtraReport1 report = new XtraReport1();
// Invoke the End-User Designer and load the report into it. report.ShowDesigner();
// Invoke the End-User Designer and load the report into it, modally. report.ShowDesignerDialog();
在此介绍创建报表过程中使用到的XtraReports的控件. 所有的控件都可以在设计时,运行时,或者通过设计器添加到报表中, 本文介绍的是一些最基本的信息.
报表控件概览
XtraReports中的所有报表对象都通过在Bands中的控件来表现. 在设计时, 报表控件可以从工具箱添加到报表中, 只有点击工具箱中需要的控件, 然后放到报表带中即可. 另一种方式是使用字段列举窗口添加控件, 这种情况下, 控件将和数据字段绑定.
如果要在运行时添加报表控件, 你只需要简单地创建一个相应类型的变量, 并通过XRControlCollection.Add方法添加到报表带中即可
所有的报表控件包括bands都是继承自XRControl. 其中部分控件可以还作为容器, 这种情况下控件集合可以通过XRControl.Controls来获得. 如果要获取控件的容器, 可使用XRControl.Parent属性.
下面列举了XtraReports中的标准报表控件.
Class
|
Description
|
Subreport
|
用于在报表中添加子报表. 被添加的报表需要被包含在项目中, 并设置SubReport的ReportSource属性. 子报表可用于合并报表和创建主从表.
|
WinControlContainer
|
用于添加Windows Forms或者第三方的控件. 此对实际上是添加的控件的封装, 并提供对Drawing方法的支持
|
XRBarCode
|
用于在报表中显示条形码. 使用XRBarCode.Symbology和XRBarCode.SymbologyId来设置条形码的类型
|
XRChart
|
在报表中显示图形, 使用此控件来根据一个或多个SeriesViewTypes来展示不同的数据.
|
XRCheckBox
|
用于在报表中展示复选框.
|
XRLabel
|
标签. 可以是单行的, 也可以是多行的.
|
XRLine
|
线条. 使用这个控件来画线.
|
XRPageBreak
|
换页. 如果是Band中需要换页, 那么使用控件的Band.PageBreak属性比较好.
|
XRPageInfo
|
显示报表页面的附加信息. 可以显示页码, 日期或者其他信息.
|
XRPanel
|
用于包含其他控件的控件. 可以使用此控件来进行控件的分组.
|
XRPictureBox
|
在报表中显示一个图片
|
XRRichText
|
显示一个控件, 用于显示,输入,修改格式化的文本. 可以用XRRichText.LoadFile从文件中加载文本.
|
XRTable
|
表格 |
XRTableCell
|
表格单元. 与XRControl.Text绑定
|
XRTableRow
|
表格中的行. 通过不需要用到此控件, 直接操作表格单元更普遍.
|
XRZipCode
|
邮政编码 |
一个普通的XtraReport报表一般包含数个包含报表控件的带. 在这里介绍一个XtraReports中的几种不同类型的带, 他们都有一些什么用途, 又是如何添加,编辑,删除.
Report Bands
在把报表添加到应用之后, 缺省的样子如下图所示. 可以看到, 报表被初始化分为3个基本的带(页头, 明细, 和页脚), 这些带中可以添加不同的报表控件.
每一种带指明了控件在报表中是怎样定位和被打印的, 即确定了打印的顺序和次数. 注意, 有些<band strips>包含了带是如何被打印的信息, 比如: PageHeader和PageFooter就说明了是每一页都有这一带的.
在创建报表时, 可以添加或者删除任意的带. 在XtraReports中有很多不同类型的带, 每一个都是<Band>的子类. 列举如下:
下图显示了不同类型的带的相对位置:
TopMarginBand and BottomMarginBand
ReportHeaderBand and ReportFooterBand
PageHeaderBand and PageFooterBand
GroupHeaderBand and GroupFooterBand
DetailBand
报表的预览显示的不是带本身, 而是<PrintingSystem>的输出. PageHeaderBand, PageFooterBand, TopMarginBand和BottomMarginBand在报表预览的每一页都有输出. ReportHeaderBand和ReportFooterBand类只显示一次. GroupHeaderBand和GroupFooterBand出现在每个记录组中.
在XtraReport中, 每一个报表都是XtraReport或者其子类. 打个比方说, XtraReport就好象Windows Forms. 同样的道理, 所有的form都Form类的子类. XtraReport中的报表类可以与数据绑定也可以不绑定. 如果要创建一个绑定数据的报表, 需要查看<数据绑定>和<绑定数据控件>这两个主题的帮助. 在创建一个报表时, 可以从已有的报表中加载样式和布局, 样式中包含了报表控件外观的属性值, 而布局包含了报表的结构信息. 另外, 还可以从其他报表系统中导入报表, 比如: Access, 水晶报表等等, 如果要详细了解XtraReport的导入功能, 请参阅<Importing Overview>主题. 报表类(XtraReport的子类)创建后, 就可以生成其实例. 需要注意的是, XtraReport对象可以在Windows Forms中使用也可以在Asp.net中使用. 在Windows应用中使用报表, 通常需要维护报表的<Printing System>, 这个对象提供了报表的输出功能. 创建报表有两种方式, 一种是简单地添加一个"模板"报表, 一种是通过报表向导来创建报表. 在报表添加到项目后, 报表设计器提供了大量的设计时元素来加快简化报表的创建. XtraReport工具箱包含了所有的控件, Report Navigator可以浏览整个报表, Feild List可以拖放数据字段来创建与数据绑定的报表控件. XtraReport的所有报表都是由<Report Band>和<Report Control>组成的. public class XtraReport1 : DevExpress.XtraReports.UI.XtraReport { private DevExpress.XtraReports.UI.DetailBand Detail; private DevExpress.XtraReports.UI.PageHeaderBand PageHeader; private DevExpress.XtraReports.UI.PageFooterBand PageFooter; private DevExpress.XtraReports.UI.XRLabel xrLabel1; private DevExpress.XtraReports.UI.XRLabel xrLabel2;
private System.ComponentModel.Container components = null;
public XtraReport1() { InitializeComponent(); }
protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } // . 然后开始创建报表的结构, 首先在XtraReportBase.Bands属性中添加Bands, 然后在相应的Bands的XRControl.Controls属性中添加控件. 报表带和控件的添加方法一般是这样的 // Add Detail, PageHeader and PageFooter bands to the report's collection of bands. this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {this.Detail, this.PageHeader, this.PageFooter});
// Add two XRLabel controls to the Detail band. this.Detail.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {this.xrLabel1, this.xrLabel2}); 最后创建好的报表可以输出给用户看了 // Create a report. XtraReport1 report = new XtraReport1();
// Create the report's document so it can then be previewed, printed or exported. // NOTE: Usually you don't need to call this method as it's automatically called by all of the following methods. // See the corresponding member topic to find out when it needs to be called. report.CreateDocument();
// Show the form with the report's print preview. report.ShowPreview();
// Print the report in a dialog and "silent" mode. report.PrintDialog(); report.Print();
// Open the report in the End-User designer report.RunDesigner();
// Export the report. report.CreateHtmlDocument("report.html"); report.CreatePdfDocument("report.pdf"); report.CreateImage("report.jpg", System.Drawing.Imaging.ImageFormat.Gif); 附: XtraReport的类结构层次图:
1. 我从未创建过一个不使用Cairngorm的RIA应用, 甚至是连一个Mini项目我也使用了Cairngorm. 使用Cairngorm放大或者说是加剧了学习曲线, 大多数第一次使用Flex的开发者是从创建小的应用开始逐步了解Flex的思想和概念. 所以最好先从使用容器和组件,创建动态界面,使用WebService/HTTP Service,绑定其返回结果这样的步骤开始. 然后尝试更新后台的持久数据,使用ColdFunsion/Java/C#/PHP等等.这是Flex开发者学习道路上的一个里程碑. 接下来,可以去理解风格/状态/效果这样的Flex功能, 在Mxml中写一些ActionScript. 以上的这些步骤都不涉及到Cairngorm,直到你能熟练地使用Flex后, 可以去阅读Cairngorm的系列文章(http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html) 2. 你的应用与用户的交互非常少,只有一两个 这主要是用于衡量应用的复杂性,如果你的应用中的用户用例(Use-Case)比较多,那么Cairngorm对你将会非常有价值. 相反,如果用例比较少,那么你完全可以不使用Cairngorm来完成应用. 最好的解决方案不是无物可加,而是无物可舍! the best solution is not when there is nothing left to add, but when there is nothing left to take away! 3. 你是应用的唯一开发者 Cairngorm的优点是可控性/可维护性/伸缩性, 在别人的工作基础添加功能变得非常非常容易. 而如果只有你一个开发者,那么不使用Cairngorm将会一种简洁的做法. 4. 你发现了Cairngorm的Bug 如果你发现了Bug,那么就不适合在重要的项目中使用Cairngorm. Cairngorm并不是完全没有Bug,在早期的Beta版中,和其他软件产品一样,我们忽略了一些偶尔出现的Bug.
Cairngorm的组成: 1. Model Locator:保存应用的ValueObject(数据)和共享变量,与HttpSession类似,只不过是保存在客户端而不是在服务器端而已 2. View:一个或者多个Flex组件(按钮、Panel、下拉框等等)组合在成一个被命名的单元。绑定Model Locator中的数据,根据用户动作(点击、滚动、拖放)产生自定义的Cairngorm事件。 3. Front Controller:接收Cairngorm事件,并映射到对应的Cairngorm命令。 4. Command:处理业务逻辑,调用Cairngorm的代理或者其他命令,更新Model Locator中的Value Object和变量值。 5. Delegate:在命令中创建,初始化一个远程调用(Http, WebService等等),并将返回结果传递给Command。 6. Service:定义远程调用连接远程的数据存储。 Cairngorm的工作方式: 1. 客户端界面由各个View组成,View通过绑定Model Locator的成员来显示数据。View根据用户操作生成事件。这些事件由Front Controller广播并接收,然后映射到相应的命令。命令包含业务逻辑、创建代理来完成操作,处理代理返回的结果,并更新Model Locator的数据。因为View是与Model Locator中的数据绑定的,因此Model Locator中数据更新后,View自动反应出数据的变化。由代理调用服务并返回处理结果不是必须的,但是这是推荐做法。
在Flex2中VideoDisplay取代了1.5中的MediaPlay,提供播放Flv视频的功能. 而且对于此组件的控制都需要自己编写. 最近遇到一个问题,就是想通过设置PlayheadTime来实现视频播放时间的跳转时,发现有时会出现失灵的情况. 经研究后发现主要是因为组件加载视频不完整的原因. 经过测试,如果是在本地的开发环境中,视频的加载非常快,100M的Flv几乎是瞬间加载完毕. 但是如果将编译生成的SWF文件上传到服务器,然后加载Flv文件,速度非常慢,主要是需要通过互联网传送. 所以会出现在本地开发时,视频的跳转一切正常.但是在服务器上却屡屡出错.
解决方法: 可以在视频加载过程Progress事件中添加代码,强制在全部加载完成后启动播放.
if ( videoPlayer.bytesLoaded / videoPlayer.bytesTotal > 0.99 ) videoPlayer.play();
开源项目fluorine(Flex与.net的AMF0网关、WebORB的替代者)使用注意事项 网站链接:http://fluorine.thesilentgroup.com/fluorine/index.html
Fluorine是与AmfPHP、OpenAmf类似的但是用于.net平台的开源AMF网关。可以应用在Flex2与.net(1.1与2.0)中。 通过使用Fluorine可以在Flex中直接调用.net程序中类的相应方法,并且完成了Class Mapping。也就是说可以传递一个复杂对象作为参数。 通过我的试验发现,.net返回的DataTable可以被正确地解析为AS3中的Array
下面是我在使用的发现的一些注意事项: Flex端: 1. 在VO的构造函数中需要调用flash.net.registerClassAlias("com.ariaware.pizza.vo.OrderVO", OrderVO); 其中第一个参数是VO在.net端的Assemble全称,即NameSpace+类名,第二个参数是ActionScript中的VO类
2. GateWayURL需要书写正确,一般的形式是:var gatewayURL:String = "http://localhost/FluorinePizzaService/Gateway.aspx";
3. 在指定.net端类名和方法名的时候,注意大小写一致 var pizzaService:AMF0Service = new AMF0Service ( gatewayURL, "pizzaService", null );
.net端 1. 注意VO中的字段名称与Flex端VO类中的名称一定要完全对应,否则就取不到对应的值。
2. 需要在Web.config中添加下面几行,紧跟在<system.web>后面就行了 <httpModules> <add name="FluorineGateway" type="com.TheSilentGroup.Fluorine.FluorineGateway, com.TheSilentGroup.Fluorine" /> </httpModules> 3. 项目中需要引用com.TheSilentGroup.Fluorine这个Dll
4. 需要在项目中添加Gateway.aspx这样一个空的Web窗体
使用时: 1. 需要注意清除一下本地的Cookie,如果有一个名为.ASPXAUTH的Cookie如果不为空,会造成FormsAuthentication.Decrypt的错误。
|