最近在學習flex,準備將手上的項目使用flex製作。
項目中需要對打印進行預覽,網上搜索,找到一個flexReport的開源組件。
看了一下例子發現還是蠻不錯的,就象看pdf一樣。
但是比較鬱悶的是竟然不提供包下載,只能下載源文件進行編譯。。千辛萬苦把環境搭建好,進行實際應用。
源文件裏面只提供 頁頭,頁尾,文本,表格的封裝組件(其實就是說明遇到分頁該怎麼辦)。實際上不使用封裝組件也是可以預覽的,但是只能在第一頁顯示,高度不夠就悲劇(隱藏,別想會到下一分頁)。出現分頁後遇到未封裝的組件就會異常。
因爲我需要在報表中插入多張圖片文字說明,1頁肯定不夠。
好了,這下沒法子了,本着不修改源碼,也實現也個封裝圖片的實現每個頁面都可以出現圖片的功能。
封裝代碼很容易,但是問題不只有這點,更厲害的來了。
遇到的問題有:
1.圖片只能出現在第1頁,如果想使用文本將它擠到第二頁,就會出現異常,原因是你沒有判斷分頁方法。
2.分頁錯亂,有些頁面是還剩下大半空白就已經分頁。
3.組件重複,如果你上一頁的情況出現1的問題,那麼恭喜你,這一頁會重複該組件。
4.一頁中能使用一個文本組件,不然會出現異常,原因是第一個文本佔據了全部高度(不管你的內容是多少),到第二個的時候就認爲要進行分頁,但是很悲劇的出現索引-1。。
總的四個問題,確實可以令人崩潰。還好有源碼在手上,不然真的要仆街。經過調試調試再調試終於找到了問題所在點跟解決辦法。
萬惡之源就在此:
1.第一頁的生成:位置爲Body.render() . 一看就清楚了,如果提供了判斷分頁的方法那就好說了.沒提供的話就出現問題1的前部分了.
解決辦法:
1.圖片的問題比較簡單,因爲沒提供判斷分頁的方法.只需實現方法 validNextPage. 還沒完,圖片不能顯示的給 height 賦值.因爲這樣會增加畫布的高度,又會出現新的問題。
這是本人使用的方法,可以參考一下。使用一個屬性代替height,在佈局時height的高度設置爲0。當然你可以修改源碼。
1+2+3.分頁的生成:位置爲Body.nextPage().整個代碼的意思是:上一頁的最後一個組件是否(是否提供分頁方法)會造成分頁,如果分頁就一切正常,如果沒分頁的話就會出現問題3(組件重複).下一句:新的組件佔滿整個高度, 就造成問題2了。最後就會出現問題1後面的問題了。
解決辦法:將else if(!displayed(childInstance))中的語句修改爲
解決了問題2,3。 問題就是修改下一句else if (childInstance.validNextPage) 。
4.這個是因爲組件本身的高度判斷有問題,當實際高度跟擁有的高度出現不同的時候這個問題就會產生。
將條件 if(super.height==value) 改爲 if(super.height<=value) 因爲可以解決(純屬估計,未測試).當然也可以使用其它方法避免出現這種情況。例如:使用多個文本組件合成一個,將文本設置成一頁的最後一個組件。
好了,寫了這麼多希望能給看這文章的人一些幫助。
最後如果哪位有比較好點、完整點的版本希望能共享出來。