|
Fiddler是一個微軟開發(fā)的Http代理,可以用于跟蹤調(diào)試客戶端與服務器之間的Http信息,F(xiàn)iddler監(jiān)控所有的Http往來,可以設置斷點,竄改出入數(shù)據(jù)。
在ActionScript3.0中是不支持函數(shù)重載的. 最近, 想了個辦法來模擬. public?function?add(obj1?:?Object?=?null,?obj2:?Object?=?null)?:?void?{ ????if?(obj1?==?null?&&?obj2?==?null?)?{ ?????????//?調(diào)用無參數(shù)Add函數(shù) ?????????AddNoArgument(); ????} ????else?if?(?typeof(obj1).toString().toLowerCase()?==?"string")?&&?obj2?==?null?)?{ ?????????//?調(diào)用String參數(shù)的Add函數(shù) ?????????AddString(obj1.toString()); ????} } 當然這個方法也會有一些問題. 第二種方法 public?function?add( ?args)?:?void?{ ????if?(args.length?==?0)?{ ?????????//?調(diào)用無參數(shù)Add函數(shù) ?????????AddNoArgument(); ????} ????else?if?(?args.length?==?1?&&?typeof(args[0])?==?"int")?)?{ ?????????//?調(diào)用String參數(shù)的Add函數(shù) ?????????AddString(args[0].toString()); ????} } 其中addString是add函數(shù)的String類型的重載函數(shù). 如果大家有什么更好的解決方案, 請不吝賜教.
XtraReports的設計器可以作為給終端用戶使用的獨立的報表設計器, 也就是說用戶可以自己編輯,預覽,甚至創(chuàng)建報表. 這個設計器和Visual Studio的集成開發(fā)環(huán)境很象, 可以定制外觀, 滿足用戶的需要. 甚至, 你可以自己創(chuàng)建報表設計器, 因為在XtraReport中設計器是一個分開獨立的控件. ??? 先介紹一下設計器的組成元件. 報表設計器主要是用于使用戶可以編輯報表. 標準的設計器是使用XRDesignFormEx類來展示的, 這個類提供了編輯和創(chuàng)建報表的主要功能. ??? 下圖是一個標準的報表設計器:  ??? 這個Form里包含了不同的元件: 報表在XRDesignPanel對象中被編輯, 其他工具欄和停靠面板由XRDesignBarManager和XRDesignDockManager控制. 所有的這些控件都可以通過設計Form的XRDesignFormExBase.DesignPanel, XRDesignFormEx.DesignBarManager和XRDesignFormEx.DesignDockManager屬性來操作. ??? 下面列舉了設計器中使用的元件接口. Element | Description |
---|
Design Panel | 這是報表設計器的主要元件. 它展示了一個面板用于創(chuàng)建一個新的報表或者編輯原有的報表. 它顯示報表帶并控制報表帶中控件的歸屬, 并可以移動, 縮放, 復制, 粘貼這些控件, 另外還可以在控件上綁定數(shù)據(jù), 或者進行其他的操作.? 而且可以預覽報表效果.
| Main Menu | 展示報表設計器的主菜單. 包含了一系列的項目和子項目, 用于為用戶提供相關(guān)操作. 通常, 它復制所有的ToolBar按鈕, 格式化按鈕以及布局按鈕.
| Main Toolbar | 展示報表設計器的ToolBar. 包含創(chuàng)建報表, 保存裝載報表布局, 剪裁,復制,粘貼等按鈕, 以及撤銷, 重做等操作.
| Formatting Toolbar | 展示報表設計器的格式化Toolbar. 包含一些缺省的操作文本的按鈕.
| Layout Toolbar | 展示報表設計器的布局Toolbar. 包含縮放, 移動一組控件位置的按鈕.
| Status Bar
| 在報表設計器底部展示StatusBar. 通常用于顯示報表編輯操作過程中的特殊信息.
| Toolbox | 展示報表設計器的控件工具箱. 包含所有報表控件, 可以拖放新的控件到報表區(qū)中. 可以添加自定義控件到工具箱中.
| Report Explorer | 展示報表設計器的Explorer. 它顯示了報表樹狀結(jié)構(gòu), 使用它可以很方便地瀏覽整個報表.
| Field List | 展示了報表設計器的樹狀字段列表. 顯示了數(shù)據(jù)源的樹狀結(jié)構(gòu). 用于將數(shù)據(jù)綁定到報表.
| Property Grid | 展示報表設計器的屬性容器. 可以修改報表元件的屬性.
|
??? 激活報表設計器: 盡管報表設計器是XRDesignFromEx的實例, 但一般不需要手工創(chuàng)建此對象. 通常使用以下代碼: //?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();
在此介紹創(chuàng)建報表過程中使用到的XtraReports的控件. 所有的控件都可以在設計時,運行時,或者通過設計器添加到報表中, 本文介紹的是一些最基本的信息.
報表控件概覽
XtraReports中的所有報表對象都通過在Bands中的控件來表現(xiàn). 在設計時, 報表控件可以從工具箱添加到報表中, 只有點擊工具箱中需要的控件, 然后放到報表帶中即可. 另一種方式是使用字段列舉窗口添加控件, 這種情況下, 控件將和數(shù)據(jù)字段綁定.
如果要在運行時添加報表控件, 你只需要簡單地創(chuàng)建一個相應類型的變量, 并通過XRControlCollection.Add方法添加到報表帶中即可
所有的報表控件包括bands都是繼承自XRControl. 其中部分控件可以還作為容器, 這種情況下控件集合可以通過XRControl.Controls來獲得. 如果要獲取控件的容器, 可使用XRControl.Parent屬性.
下面列舉了XtraReports中的標準報表控件.
Class
|
Description
|
Subreport
|
用于在報表中添加子報表. 被添加的報表需要被包含在項目中, 并設置SubReport的ReportSource屬性. 子報表可用于合并報表和創(chuàng)建主從表.
|
WinControlContainer
|
用于添加Windows Forms或者第三方的控件. 此對實際上是添加的控件的封裝, 并提供對Drawing方法的支持
|
XRBarCode
|
用于在報表中顯示條形碼. 使用XRBarCode.Symbology和XRBarCode.SymbologyId來設置條形碼的類型
|
XRChart
|
在報表中顯示圖形, 使用此控件來根據(jù)一個或多個SeriesViewTypes來展示不同的數(shù)據(jù).
|
XRCheckBox
|
用于在報表中展示復選框.
|
XRLabel
|
標簽. 可以是單行的, 也可以是多行的.
|
XRLine
|
線條. 使用這個控件來畫線.
|
XRPageBreak
|
換頁. 如果是Band中需要換頁, 那么使用控件的Band.PageBreak屬性比較好.
|
XRPageInfo
|
顯示報表頁面的附加信息. 可以顯示頁碼, 日期或者其他信息.
|
XRPanel
|
用于包含其他控件的控件. 可以使用此控件來進行控件的分組.
|
XRPictureBox
|
在報表中顯示一個圖片
|
XRRichText
|
顯示一個控件, 用于顯示,輸入,修改格式化的文本. 可以用XRRichText.LoadFile從文件中加載文本.
|
XRTable
|
表格 |
XRTableCell
|
表格單元. 與XRControl.Text綁定
|
XRTableRow
|
表格中的行. 通過不需要用到此控件, 直接操作表格單元更普遍.
|
XRZipCode
|
郵政編碼 |
一個普通的XtraReport報表一般包含數(shù)個包含報表控件的帶. 在這里介紹一個XtraReports中的幾種不同類型的帶, 他們都有一些什么用途, 又是如何添加,編輯,刪除.
Report Bands
在把報表添加到應用之后, 缺省的樣子如下圖所示. 可以看到, 報表被初始化分為3個基本的帶(頁頭, 明細, 和頁腳), 這些帶中可以添加不同的報表控件.
每一種帶指明了控件在報表中是怎樣定位和被打印的, 即確定了打印的順序和次數(shù). 注意, 有些<band strips>包含了帶是如何被打印的信息, 比如: PageHeader和PageFooter就說明了是每一頁都有這一帶的.
在創(chuàng)建報表時, 可以添加或者刪除任意的帶. 在XtraReports中有很多不同類型的帶, 每一個都是<Band>的子類. 列舉如下:
下圖顯示了不同類型的帶的相對位置:
TopMarginBand and BottomMarginBand
ReportHeaderBand and ReportFooterBand
PageHeaderBand and PageFooterBand
GroupHeaderBand and GroupFooterBand
DetailBand
報表的預覽顯示的不是帶本身, 而是<PrintingSystem>的輸出. PageHeaderBand, PageFooterBand, TopMarginBand和BottomMarginBand在報表預覽的每一頁都有輸出. ReportHeaderBand和ReportFooterBand類只顯示一次. GroupHeaderBand和GroupFooterBand出現(xiàn)在每個記錄組中.
在XtraReport中, 每一個報表都是XtraReport或者其子類. 打個比方說, XtraReport就好象Windows Forms. 同樣的道理, 所有的form都Form類的子類.  ? XtraReport中的報表類可以與數(shù)據(jù)綁定也可以不綁定. 如果要創(chuàng)建一個綁定數(shù)據(jù)的報表, 需要查看<數(shù)據(jù)綁定>和<綁定數(shù)據(jù)控件>這兩個主題的幫助. ? 在創(chuàng)建一個報表時, 可以從已有的報表中加載樣式和布局, 樣式中包含了報表控件外觀的屬性值, 而布局包含了報表的結(jié)構(gòu)信息. 另外, 還可以從其他報表系統(tǒng)中導入報表, 比如: Access, 水晶報表等等, 如果要詳細了解XtraReport的導入功能, 請參閱<Importing Overview>主題. ? 報表類(XtraReport的子類)創(chuàng)建后, 就可以生成其實例. 需要注意的是, XtraReport對象可以在Windows Forms中使用也可以在Asp.net中使用. 在Windows應用中使用報表, 通常需要維護報表的<Printing System>, 這個對象提供了報表的輸出功能. ? 創(chuàng)建報表有兩種方式, 一種是簡單地添加一個"模板"報表, 一種是通過報表向?qū)韯?chuàng)建報表. 在報表添加到項目后, 報表設計器提供了大量的設計時元素來加快簡化報表的創(chuàng)建. XtraReport工具箱包含了所有的控件, Report Navigator可以瀏覽整個報表, Feild List可以拖放數(shù)據(jù)字段來創(chuàng)建與數(shù)據(jù)綁定的報表控件. ?? 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?); ???} ?? ???//? . ? ? 然后開始創(chuàng)建報表的結(jié)構(gòu), 首先在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}); 最后創(chuàng)建好的報表可以輸出給用戶看了 //?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的類結(jié)構(gòu)層次圖:
1. 我從未創(chuàng)建過一個不使用Cairngorm的RIA應用, 甚至是連一個Mini項目我也使用了Cairngorm. 使用Cairngorm放大或者說是加劇了學習曲線, 大多數(shù)第一次使用Flex的開發(fā)者是從創(chuàng)建小的應用開始逐步了解Flex的思想和概念. 所以最好先從使用容器和組件,創(chuàng)建動態(tài)界面,使用WebService/HTTP Service,綁定其返回結(jié)果這樣的步驟開始. 然后嘗試更新后臺的持久數(shù)據(jù),使用ColdFunsion/Java/C#/PHP等等.這是Flex開發(fā)者學習道路上的一個里程碑. 接下來,可以去理解風格/狀態(tài)/效果這樣的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. 你是應用的唯一開發(fā)者 Cairngorm的優(yōu)點是可控性/可維護性/伸縮性, 在別人的工作基礎添加功能變得非常非常容易. 而如果只有你一個開發(fā)者,那么不使用Cairngorm將會一種簡潔的做法. 4. 你發(fā)現(xiàn)了Cairngorm的Bug 如果你發(fā)現(xiàn)了Bug,那么就不適合在重要的項目中使用Cairngorm. Cairngorm并不是完全沒有Bug,在早期的Beta版中,和其他軟件產(chǎn)品一樣,我們忽略了一些偶爾出現(xiàn)的Bug.
Cairngorm的組成: 1. Model Locator:保存應用的ValueObject(數(shù)據(jù))和共享變量,與HttpSession類似,只不過是保存在客戶端而不是在服務器端而已 2. View:一個或者多個Flex組件(按鈕、Panel、下拉框等等)組合在成一個被命名的單元。綁定Model Locator中的數(shù)據(jù),根據(jù)用戶動作(點擊、滾動、拖放)產(chǎn)生自定義的Cairngorm事件。 3. Front Controller:接收Cairngorm事件,并映射到對應的Cairngorm命令。 4. Command:處理業(yè)務邏輯,調(diào)用Cairngorm的代理或者其他命令,更新Model Locator中的Value Object和變量值。 5. Delegate:在命令中創(chuàng)建,初始化一個遠程調(diào)用(Http, WebService等等),并將返回結(jié)果傳遞給Command。 6. Service:定義遠程調(diào)用連接遠程的數(shù)據(jù)存儲。 Cairngorm的工作方式: 1. 客戶端界面由各個View組成,View通過綁定Model Locator的成員來顯示數(shù)據(jù)。View根據(jù)用戶操作生成事件。這些事件由Front Controller廣播并接收,然后映射到相應的命令。命令包含業(yè)務邏輯、創(chuàng)建代理來完成操作,處理代理返回的結(jié)果,并更新Model Locator的數(shù)據(jù)。因為View是與Model Locator中的數(shù)據(jù)綁定的,因此Model Locator中數(shù)據(jù)更新后,View自動反應出數(shù)據(jù)的變化。由代理調(diào)用服務并返回處理結(jié)果不是必須的,但是這是推薦做法。
在Flex2中VideoDisplay取代了1.5中的MediaPlay,提供播放Flv視頻的功能. 而且對于此組件的控制都需要自己編寫. 最近遇到一個問題,就是想通過設置PlayheadTime來實現(xiàn)視頻播放時間的跳轉(zhuǎn)時,發(fā)現(xiàn)有時會出現(xiàn)失靈的情況. 經(jīng)研究后發(fā)現(xiàn)主要是因為組件加載視頻不完整的原因. 經(jīng)過測試,如果是在本地的開發(fā)環(huán)境中,視頻的加載非常快,100M的Flv幾乎是瞬間加載完畢. 但是如果將編譯生成的SWF文件上傳到服務器,然后加載Flv文件,速度非常慢,主要是需要通過互聯(lián)網(wǎng)傳送. 所以會出現(xiàn)在本地開發(fā)時,視頻的跳轉(zhuǎn)一切正常.但是在服務器上卻屢屢出錯.
解決方法: 可以在視頻加載過程Progress事件中添加代碼,強制在全部加載完成后啟動播放.
??? if ( videoPlayer.bytesLoaded / videoPlayer.bytesTotal > 0.99 ) ??? ??? videoPlayer.play();
開源項目fluorine(Flex與.net的AMF0網(wǎng)關(guān)、WebORB的替代者)使用注意事項 網(wǎng)站鏈接:http://fluorine.thesilentgroup.com/fluorine/index.html
Fluorine是與AmfPHP、OpenAmf類似的但是用于.net平臺的開源AMF網(wǎng)關(guān)。可以應用在Flex2與.net(1.1與2.0)中。 通過使用Fluorine可以在Flex中直接調(diào)用.net程序中類的相應方法,并且完成了Class Mapping。也就是說可以傳遞一個復雜對象作為參數(shù)。 通過我的試驗發(fā)現(xiàn),.net返回的DataTable可以被正確地解析為AS3中的Array
下面是我在使用的發(fā)現(xiàn)的一些注意事項: Flex端: 1. 在VO的構(gòu)造函數(shù)中需要調(diào)用flash.net.registerClassAlias("com.ariaware.pizza.vo.OrderVO", OrderVO); 其中第一個參數(shù)是VO在.net端的Assemble全稱,即NameSpace+類名,第二個參數(shù)是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的錯誤。
|