當前位置:首頁 » 操作系統 » 列印控制項源碼

列印控制項源碼

發布時間: 2022-05-27 07:56:28

A. 易語言列印機組件可以應用到熱敏列印機嗎

不知道你指的是想自定義一個列印軟體嗎?如果熱敏列印機在電腦上可以正常列印,比如Word文檔,或者TXT,你可以直接應用到的。列印機組件會調用系統列印機對話框。如果不能列印TXT,Word這些,那就需要進一步摸索了。這在於列印機廠家是否開放介面給你調用。有些列印機廠家是封鎖的。具體你可以搜索列印機的源碼來測試摸索。不過一般市面上的都支持,插入USB就可以了。

B. extjs4.2如何動態的在在容器中顯示組件

JasperReports和iReport的個人資料

介紹JasperReports的是一個開放源碼的報表列印組件是一個java開源代碼組織sf.net報表列印的作品,PDF,HTML或XML各種形式生成報告,為支持分頁列印,並且可以製作各類圖表。 JasperReport是組織按照預定義的XML文檔數據的報告,這些不同的數據源,包括關系型資料庫(配置JDBC連接),Java容器對象(集合和數組)。要完成的填補的報告,你必須先完成該報告的XML文件,這個過程是生成報表設計對象,然後序列化對象存儲在磁碟或網路,用於生成特定於應用程序的表格數據。事實上,在設計過程的形式被定義在XML文件中的Java表達式來表達設計的報告。編輯過程中,將有多種,以確保數據的一致性驗證,並最終將產生的數據文件或填充數據的編制。是iReport也是開源組織sf.net一個免費軟體,它的主要作用是可視化的方式升級,產生JasperReport的報告格式和JasperReport,因為沒有很好的可視化報表設計工具iReport的缺陷,因此,我們使用這兩個工具相結合。地址:iReport的JasperReports的,可以在這個地址獲得:安裝使用的iReport iReport的iReport的第一需要在本機安裝JDK,並配置您的環境中,下載並安裝最新版本的JDK,然後配置Windows環境變數加入「後面的路徑; Java安裝目錄,在新的環境變數JAVA_HOME:Java安裝目錄CLASSPATH:Java安裝目錄的\ bin」如果你已經安裝了JDK,你可以跳過這些步驟。然後從的iReport的網站上下載最新版本的iReport的任何目錄中的文件解壓後,解壓iReport的,其中有通過雙擊一個iReport.bat,約30秒後,如果你能彈出iReport的主要形式,表示您的系統可以運行iReport的,如果你不能彈出的主要形式,一般,因為JDK的安裝不正確。配置在iReport的iReport的第一步是資料庫配置資料庫連接,選擇菜單中的「源/連接到數據源」,打開下面的對話框,點擊「新建」,打開下面的對話框,你可以創建一個數據連接,我們創建JDBC數據源,例如,連接類型/數據源列表中選擇Database.JDBC.connection「,」姓名「,創建一個新的連接,採取所需的JDBC驅動程序的名稱,選擇一個驅動器到Oracle,例如,選擇「的oracle.jdbc.driver.OracleDriver JDBC URL,輸入用戶名和密碼的同時,JDBC連接例如:」為jdbc:oracle的:薄:@ localhost的:1521:探戈「,輸入用戶和密碼連接到資料庫。包要注意的是,配置環境變數CLASS_PATH OracleJDBC。創建後,點擊「測試」測試資料庫連接。建立連接後,你可以查詢的數據表,選擇菜單中的「源/報告查詢,打開下面的對話框:在報告的sql查詢頁面,您可以輸入任何SQL數據來獲取數據,完成失敗者iReport的sql語句,自動列出清單中的所有領域,這些領域可以使用變數在報告過程中,另一個要注意的:當我們創建多個數據源,需要建立一個數據源,選擇菜單:「設置」/「設置當前數據源,打開下面的對話框:所有已建立的數據源設置在當前數據源。通過JDBC數據的Java容器的數據是很方便,但我們通常不會確定在設計一個完整的SQL語句,通常我們需要在運行時構造動態SQL,當然,我們可以通過編程方式構造SQL,並通過iReport的,復雜的SQL語句是不容易保持,但也容易出錯。 JasperReports的允許從Java容器的數據,首先告訴iReport的Java容器類的路徑,選擇菜單:工具/類路徑「,如圖所示:設置路徑後,選擇菜單中的」源/報表查詢,以「JavaBean的數據源」頁,類名,進入容器的完整路徑,如下圖所示:點擊「閱讀JavaBean的屬性容器欄位全部讀出,到目前為止,我們就要開始做報表。開始使用iReport iReport的界面開發,我們熟悉德爾福著名插件類似QuickReport的整個頁麵包括一些波段,每個波段來實現不同的顯示界面如下:新報告「新報告」中,單擊工具欄中的按鈕或通過菜單報告/ iReport的添加「創建報告」菜單,如下所示:創建了一份報告,在報告名稱「框中的名稱,然後定義的紙張尺寸,提供了多種預設的尺寸,當然,也可以選擇自定義頁面尺寸,兩個定位,即水平和垂直。在該對話框的下半部分,您還可以設置頁邊距,列,等等。當設置完成後,單擊「確定」,完成新的行動。報告結構創建一個新的報告,我們來看看報告的結構。報告結構是大約幾部分組成:標題,pageHeader的ColumnHeader,產品詳細介紹,columnFooter pageFooter,總之,組頁眉,組頁腳標題:每一份報告,一般都會有一個名稱,如銷售報告,×××,標題是預留最好的地方的名字,當然,你也可能需要預留在正確的地方。pageHeader:報表的一些共同的元素,如頁碼,創建,創建者的信息都存放在這里的是一個更好的選擇。每頁標題將再次列印的ColumnHeader:這里是地方名之列,記住,不列數據。詳情:需要遍歷數據,例如銷售記錄數據。columnFooter:地點列級統計計算的列的值或說明。PageFooter:頁面級統計或頁面。總結:可能需要幾頁(你的報表可能有幾頁)統計50銷售記錄,例如,採取了三個,然後放置這些統計數據記錄最好的地方是匯總統計。組頁眉:每個表的內容可能需要一個屬性來劃分顯示內容和計算的內容,如希望在幾個月各組分別銷售記錄,那麼你可以定義一組(A組定義的參考),組頁眉的指令集,或者設置的標志最好的地方。組頁腳:放置組的統計或描述。動態對象變數的聲明,參數,會遇到很多變數(變數),參數(參數)的欄位(欄位)的內容,所以我們首先推出了使用這些對象,並在這個過程中使用iReport的意義的領域:欄位(欄位):從資料庫或Java容器對象的內容,該報告的主要內容是表示語法$ F.參數(參數):這是你的應用需要提供報告的入口,例如,你想解釋的報告是在WHERE語句,那麼你可以使用的參數(參數)。$ P語法,多個參數的報告一個HashMap的傳入。使用的參數,參數必須被配置在iReport,我們需要在列印列印操作,我們創建參數列印:PrintOperator。選擇菜單預覽 - 報告參數「,打開下面的對話框:在參數頁面,點擊」添加「按鈕,打開下面的新參數」對話框:「參數名」,填寫參數:「PrintOperator」中的名稱「Paramenter類類型」選擇框中,選擇的參數類型,選擇的「java.lang.String的」填充「默認值表達式」當傳入的值丟失的默認值因為iReport是一個純java語言開發,支持任何java語句。 「paramenter描述」一些描述中的參數。點擊「確定」完成創建參數。接下來是簡短的通話例如:HashMap的地圖=新的HashMap(); map.put(「PrintOperator」,「寧」); JasperFillManager.fillReport(jasperreport的地圖,DS)變數(變數):這是一些邏輯上的報告的運行性能,如統計值(總和,最大值,最小值,等等)。為$ V的語法,例如,我們要總結的訂單量,訂單量的資料庫中的欄位為AMT中,我們創建了一個變數的名為totalAmt的變數摘要的訂單量,點擊菜單上的「預覽/報告變數,打開下面的對話框:我們看到的iReport為我們提供了預先定義有用的五個變數,為我所用,解釋如下:$ V:報表處理的記錄?$ V:列印此頁?$ V:這個頁面?處理的記錄?$ V:報告的列數$ V:這列處理項目?$ V:集團帶加工項目,當創建一個組自動生成變數持續根據情況自動生成變數分組。我們現在添加一個新定義的變數,點擊「添加」,打開新的變數對話框:「變數名,輸入變數的名稱:」totalAmt「,選擇類型的變數」變數類型「java.math。 BigDecimal的「計算類型,選擇的計算類型的總和,這里是的求和輸入變數在」變數表達的表達,我們在這里是採取實地的AMT的資料庫,所以寫成「$ F」,請小心。當我們糾正數據源配置,當我們進入的表達是正確的,那麼顯示的顏色是綠色的,不正確地寫出表達式,如藍色所示。然後,我們在「初始值表達式」的值初始化輸入,同一類型的Java語句:新java.math.BigDecimal的(0)。點擊「確定」完成參數設置。放置在報告中的頁面元素iReport的工具欄提供了豐富的元素,從簡單到包括圖形,支持分組報表。我們引進兩類,一類為靜態文本,動態文本。這兩個工具按鈕如下:點擊「T」型工具按鈕,打開「添加靜態文本對話框。他的用法比較簡單,有一些電腦經驗可以理解,這里就不介紹了。 '我只是在這里說:在靜態文本頁列印輸入要顯示的內容表達時,你可以接受的返回類型布爾Java表達式,當返回的Boolean.TRUE將靜態文本列印時,它返回布爾值。 FALSE不列印,以後會介紹在這篇文章中,使用此功能來列印行顯示黑色和白色交替的效果。讓我們來看看動態文本,點擊「F」,打開下面的對話框:大致相似的動態和靜態文本,動態文本的「文本欄位」接受的表達,在TextField中的表達「,輸入動態表達式「$ F,如圖所示,綠色表示輸入是正確的。模式,你也可以輸入數據格式。隨著上述發言的基本知識,我們就可以開始創建報告。我創建報告,請考慮以下思路。首先,通過Java容器中,而不是直接連接到資料庫取數據,這是因為我們的報表通常是更復雜的,很難直接通過一個簡單的SQL語句來實現,即使我們可以寫一個復雜的select語句實現了報告的查詢,但對於未來的維護和故障診斷是相當困難的,因此不建議這種做法。考慮從另一個角度來看,查詢報表動態創建基於用戶的輸入,我們在後台的數據組織和處理會使調試和簡單。我創建數據容器類ReportBaseObject,很簡單的部分代碼如下:公共類ReportBaseObject的公共無效setB_data_1(的BigDecimal b_data_1)......公開日期getD_data_1()公共無效setD_data_1(日期d_data_1)......公共整數getI_data_1()公共無效setI_data_1的(的整數i_data_1)......公眾的String()getS_data_1的公共無效setS_data_1(字元串s_data_1)......}這是一個通用的數據容器,容器定義欄位的類型為20個字元,20個數字類型欄位10日期整數和10,容器適合任何語句,這樣做是基於以下的考慮。報告分為兩部分,第一部分是iReport的生產報告界面,在背景中的第二部分,根據用戶輸入的條件下取得報告所需的數據。遲的第一部分由項目的工作人員在現場製作,第二部分是由開發人員完成,因此需要可以分開的兩部分的工作,我們可以通過提供一個通用對象來實現這一目標。工程人員在現場和客戶討論需求,並在沒有數據的情況下,開始製作報表的界面,他們所要做的是使用一個表列出了他們所需要的數據,意思是:如:baseObject相應欄位描述語句代碼:批准B_data_1 01_001 s_data_1的單號S_data_2文檔類型D_data_1貨物日期D_data_2的配合量B_data_2支付的金額確認用戶界面,工程師將形成傳遞給開發商,開發商容器顯著性意義的數據填寫表單欄位。下面的語句是我畫的截圖:如下圖所示,顯示不同的背景,我們希望列印出來的灰色和白色的線的效果,你可以使用屬性來實現上述的「列印expresssion」的具體做法有兩種:把在同一列中的TextField同一領域,設置背景(默認為白色),其他背景(淡黃色)白色背景列印時新布爾表達式輸入((($ V.intValue())%2)灰色背景當表達式輸入新的布爾值((($ V.intValue())%2)== 1)另一種方法是細節帶中拉一個矩形,設置其背景為淡黃色,設置== 0)列印其列印時,表達的是新的布爾((($ V.intValue())%2)== 1),這意味著,只有奇數列列印此矩形淺黃色背景。設置白色前景黑框矩形邊界消失。矩形,把需要的文本欄位和透明剔這個文本欄位的含義是透明的。

調用IE內置列印模塊完成網路列印解決方案和常式

重點: web瀏覽器的classid = CLSID:8856F961-340A-11D0-A96B = 0寬度00c04fd705a2高度= 0 VIEWASTEXT>

的「document.all.WebBrowser.ExecWB(6,1)」級=「NOPRINT 「>

「document.all.WebBrowser.ExecWB(8,1)」級=「NOPRINT>

」document.all.WebBrowser。的ExecWB(7,1)「類=」NOPRINT「>

註:

CSS列印控制:

C. Excel2010VBA編程與實踐的自 序

尋,是一種尺度。古時八尺為一尋,王安石詩雲「飛來峰上千尋塔,聞說雞鳴見日升」,形容飛來峰上塔之極高。
尋,是一種技巧。今日網路為自學者提供了非常巨大的資源平台,但缺乏技巧的查詢和求助,往往「眾里尋他千網路」卻難有「驀然回首」的頓悟。而善用關鍵詞搜索,則常可使人體會到「燈火闌珊」之美景。
尋,是一種追求。網路上活躍著這么一群人,他們曾經也是懵懂的菜鳥,在尋解獲助時心存感激,在尋師問道時心懷崇敬。漸漸地,他們因互助的理念而聚集,相互扶持,堅持不懈地學習、實踐與創新。面對一個個技術的據高點,他們是睿智而無私的「尋者」,壁立千尋敢登攀,尋根究底解疑難!
尋,是一種心境。求知探秘當志存華山論劍之高遠,解決問題應意守無劍無招之尋常,這便是「尋者」修煉的心境。來者是客,有問必答,不慕華麗的招式,但求直擊問題之根源,用簡單的方法完成復雜的事情。
本叢書的作者就是這樣的一群「尋者」。在長期的線上答疑和線下交流、培訓活動中,他們接觸過針對同一類問題千奇百怪的提問,深知許多人苦尋而不得的要害,甚至練就了一手僅根據含混不清的提問進行猜題、解題的本領。通過不斷地積累與整理,Excel技巧網(技術社區)的版主們推出了「Excel疑難千尋千解」叢書,這些「疑難」都是許多人曾經搜索和提問過的,也是大多數用戶在工作中可能會遇到的一些尋常問題。書中案例涉及行政辦公、人力資源、金融財務、經濟統計、學校教育、工程技術、醫療衛生、質量管理、生產管理等多個領域,並根據Excel的主要功能分冊地整理成書。
在叢書編著過程中,「實用為主」的原則貫徹始終,所有案例都遵循實際工作場景和知識點解說緊密結合的主線,拋開一些華而不實、艱難晦澀的高深解法,而將基礎理論和解決方案寓於尋常技巧之中,讓讀者能得其用、明其理,以期實現為更多的人解決更多問題的簡單願景。
尋者
感謝您選擇「Excel 疑難千尋千解」叢書之《Excel 2010 VBA編程與實踐》!
Excel 2010具有強大的運算與分析能力。從Excel 2007開始,改進的功能區使操作更直觀、更快捷,實現了質的飛躍。不過需要進一步提升效率及實現自動化則僅靠功能區的菜單功能是遠遠不夠的,正因如此,微軟公司在Excel中引進了VBA程序,且首次在Excel中升級VBA到 7.0版本。通過VBA可以讓復雜的報表簡單化,且可以讓部分操作全自動完成,十倍或者百倍的製表效率成為可能。
叢書介紹
「Excel 疑難千尋千解」叢書是由Excel技巧網的負責人、微軟最有價值專家(MVP)黃朝陽先生策劃並組織編寫的一套系列書籍。
Excel技巧網旨在重點推廣Excel 2010及今後更高版本的應用,並為廣大的Excel愛好者提供一個內容充實、分類清晰、經典實用、精彩紛呈、互惠學習、友好交流的平台。社區成立不久便吸引了眾多微軟MVP和有志於推廣電子表格應用技術的高手駐足,長期為網友免費解答疑難問題,並勤於將精彩的答疑帖子按其所涉及的知識和應用兩個維度,整理成為原創技術文章。
社區設有討論、文章、資源三大技術專區,並按照Excel的功能歸屬將主題劃分為基礎應用、數據透視表、條件格式、函數與公式、圖表與圖形、VBA、SQL in Excel、綜合應用等方面,本叢書的各讀本正是基於相近的主題分類。
本叢書由黃朝陽、王建發、陳國良等微軟MVP以及羅剛君、榮勝軍、李術彬、林盤生、陳樹青、章蘭新等多位社區資深版主聯手打造,將來還將邀請更多高級會員加盟參與叢書其他讀本的創作。其中《Excel 2010操作與技巧》、《Excel 2010函數與公式》、《Excel 2010 VBA編程與實踐》已先於第一批出版,近期還將陸續推出《Excel 2010圖表與圖形》、《SQL in Excel 2010》等其他讀本。
得益於多年來在社區答疑中的磨礪,作者們將豐富的實戰經驗付諸筆端,精心設計了上千案例,將Excel方方面面的知識點融入其中。每個案例都採用一般用戶遇到疑難時最可能的提問方式和應用場景對問題進行描述,提供具有針對性的解決方案和詳盡的操作步驟,並配合以原理分析和知識擴展環節,既授人以魚,又授人以漁。叢書採用「疑難」加「知識點」的特色目錄索引,方便讀者根據需要快速地查找。對於渴望學習和掌握新知識的Excel用戶來說,與其千百次地找尋問題答案,不如靜心地讀此叢書一卷。
讀者對象
本書使用Microsoft Office Excel 2010界面進行編寫,但是在編寫過程中作者特意注重程序的通用性,確保每個案例的解決方案都通用於Excel 2003、2007和2010。而且為了方便讀者,隨書光碟中主要有兩種格式的案例文件,包括xls格式和xlsm格式,如果是載入宏則包括xla格式和xlam格式。不管讀者使用Excel 2003、2007還是2010都可以直接使用,不需要轉換,也不需要修改代碼就可以順利的在多版中使用本書的所有案例。
本書通過250個案例和1個大型綜合應用展示VBA編程技巧,適合所有辦公製表人士,特別是需要提升工作效率及需要深入研究VBA者學習之用。如果您沒有VBA基礎,那麼本書可以為您解決工作中的疑難。書中對常見問題有一個或者多個解決方案,並輔以解題思路與原理分析,讀者可以通過書中的現有案例進行拓展,解決更多的類似問題。而對於已有VBA基礎者,則可以學習本書的解題思路與代碼防錯技術、代碼優化之道。本書的案例涉及基礎應用、查找引用、數據處理、報表列印、函數開發、文件目錄、圖表設計、圖形對象、窗體控制項、插件開發、代碼封裝和在工資管理系統等諸多方面,可以全方位的提升VBA編程的功底,讓您將VBA理論投入到工作中轉換成效率。
閱讀指南
本書包括11章,涉及製表的每個方面。前10章分別為基礎理論篇、查找引用篇、數據處理篇、報表列印篇、函數開發篇、文件目錄篇、圖表設計篇、圖形對象篇、窗體控制項篇、插件開發篇,每章有數十個案例,且為了讓讀者能學以致用,每章提供3個思考與練習題。最後一章為綜合應用,講述通過VBA開發工資管理系統的思路。
詳細的章節內容如下:
第1章:基礎理論篇
本章包括5個小節——快速獲取幫助、程序防錯要點、代碼優化之道、提升代碼的兼容性。主要介紹VBA編程的一些基礎知識、代碼的糾錯與優化,不過是以案例形式呈現出來,通過實際的應用讓理論描述更有說服力。
第2章:查找引用篇
本章包括4個小節——本表查找、跨表及多表查找、文件查找與轉換和圖片查找與引用。主要講述數據引用、圖片引用的經典案例。其中對於查找提供了多種思路,盡量展示效率最高且具有容錯性的代碼與技巧。本章是全書的三大重點之一,通過大量的實例傳授瞬間查找數據的技巧。
第3章:數據處理篇
本例包括7個小節——定位的技巧、數據處理及格式轉換、單元格合並技巧、報表合並與拆分、單元格顏色的綜合應用、重復數據處理和數據透視。本章是第二個重點,全面闡述VBA對數據處理的技巧。Excel本身具備數據處理的功能,而利用VBA可以大大提升數據處理的速度,本章屬於辦公製表人員必學范疇。
第4章:報表列印篇
本章包括2個小節——列印設置和特殊列印格式設計。主要講述與列印或者列印格式設置方面的疑難處理技巧,包括工資條設計、分頁小計、批量列印和底端標題等等相當常用的一些疑難處理。
第5章:函數開發篇
本例包括3個小節——自定義函數基礎、開發自定義函數和自定義函數的管理。本章闡述開發函數的技巧與函數的管理思路,從而強化Excel的運算能力。
第6章:文件目錄篇
本章包括2個小節——文件管理和目錄管理。本章內容與製表本身無直接關系,但可以對文件和文件夾進行刪除、備份、創建、轉換、命名等等操作,對工作大有裨益。
第7章:圖表設計篇
本章包括2個小節——圖表編輯和多表管理。設計基本的圖表比較適合手工操作,而對於圖表或者圖表中的標簽批量操作時,VBA就有用武之地了,可使操作效率大大提升。
第8章:圖形對象篇
本章包括3個小節——圖形對象的基本操作、批註的高級應用和圖形對象綜合應用。與圖形對象相關的高級應用不適合手工操作,本章通過21個案例演示VBA操作圖形對象的技巧,包括導入、導出、引用、瀏覽等等操作。
第9章:窗體控制項篇
本章包括4個小節——ActiveX控制項應用、窗體設計技巧、窗體與工作表之數據交互和開發動畫窗體。其中重點在於窗體與工作表數據交互的案例演示,通過窗體處理數據並導入、導出,可以實現很多Excel本身無法完成的功能。最後對窗體的美化技巧提供6種思路。
第10章:插件開發篇
本章包括3個小節——訂制菜單與工具欄、開發通用插件和封裝DLL插件。本章是本書第三個重點章節,通過案例展示VBA開發插件的強大功能,並附帶開發功能區的步驟與技巧,使讀者有中文功能區的開發有進一步認識。通過本章的案例,讀得可以開發自己需要的插件,包括將插件封裝,從而實現代碼隱藏。
第11章:工資管理系統
本章講述利用VBA開發一個中型系統的過程與思路,屬於VBA的綜合應用。
本書約定
為了熟悉本書對滑鼠操作、鍵盤指令等描述方式,從而更順暢地閱讀本書,您有必要了解以下內容:
菜單
本書中表示連續多個菜單指令時,使用右箭頭「→」進行連接,例如:單擊「文件」選項卡→「選項」→「公式」,表示依次單擊「文件」選項卡的「選項」按鈕,在彈出的「Excel 選項」對話框中單擊「公式」選項卡。
滑鼠
本書中表示滑鼠操作時,均使用標準的表示方法。其中「指向」表示將滑鼠指針移到對象之上,且不單擊任何按鈕;而「單擊」特指利用滑鼠左鍵單擊目標;「右鍵單擊」表示利用滑鼠的右鍵單擊對象;「雙擊」表示快速按下滑鼠左鍵兩次;「拖放」則表示按下滑鼠左鍵不松開的狀態下拖動滑鼠,拖到目標區域後再放開滑鼠左鍵。
鍵盤
本書中表示按鍵時使用尖括弧「【】」號包含,例如「按【Ctrl+Shift+Enter】組合鍵」表示同時按下鍵盤上的Ctrl鍵、Shift鍵和Enter鍵。其他按鍵的表示方法相同,如果需要特殊操作方法,會在相關內容中詳細說明。
代碼
本書的VBA代碼均不區分大小寫,在編寫代碼可以隨意,但代碼錄入到代碼窗口後,VBA會將代碼自動轉換成首字元大寫形式,帶引號的字元串和變數名除外。
本書特點
本書與市場上其他Excel書籍有很大的不同,文體結構新穎,案例貼近實際,講解深入透徹,表現為以下幾個方面:
場景式提問
本書從成千上萬網友提問中精心歸納、提煉出各類問題,並還原為貼近真實的求助語言及案例,方便讀者搜尋與實際工作相似問題。
增強式目錄
本書總體章節劃分以「基礎理論→分類應用→綜合實戰」為主線,將VBA的主要知識點和經典解決方案設計到每個疑難的案例中,並採用「疑難」加「知識點」的特色目錄索引,方便讀者根據需要翻閱和查找。
開創式結構
本書案例中的「解決方案」環節是對問題的思路解說,結合「操作方法」環節中的步驟讓人更容易理解。「原理分析」環節則主要解釋所使用代碼的工作原理。「知識擴展」環節包括與案例相關的知識點補充,可拓展讀者的視野,同時也有利於理解案例本身的解決思路。
本書的代碼還有兩個顯著的特點,有別於市場上其它同類書籍,即處處確保代碼的防錯與通用性。
防錯
防錯是指編寫代碼時盡可能考慮所有可能出錯的情況,並在代碼中加以防範。或者根據不同潛在的運行環境提供不同的執行方案,讓代碼可以多種情況下順利執行,而不會彈出錯誤提示框導致程序中斷。
通用
通用性是指代碼可以適應不同環境。環境是指軟體的不同版本,例如WIN XP、VISTA和WIN 7操作系統都可以順序執行本書所有案例的代碼,Excel 2003、2007和2010版本的用戶也可以順利執行每個案例的代碼,且不需要做任何修改。
環境還包括表格的區域。本書盡可能不採用硬編碼引用工作表對象和區域地址,而採用具備自動適應變化的代碼作為數據處理的引用源,從而使代碼適應不同用戶或雖是同一用戶但工作表數據區域變化時皆可使用。例如Range(A1:D10)引用區域屬於硬編碼,當數據區域變化後,代碼必須修改才可執行;而採用ActiveSheet.UsedRange或者ActiveCell.CurrentRegion兩種方法引用區域則可以適應數據區域的增減變化,從而提升代碼的通用性。
學習方法
本書是VBA編程的案例集粹,其宗旨在於為讀者解決實際工作的疑難,以及對同類的問題提供解決思路。
書中各章節的結構雖然是從易到難,但章節之間相互獨立,即可以從任意章節開始學習,不需要遵照從前至後的順序閱讀。
本書每個案例中的「解決方案」部分表示對問題的思路解說,配合「操作方法」中的步驟和代碼更容易理解。「原理分析」部分則主要包括兩方面內容:代碼中部分方法或者語句的語法解釋,以及解決本疑難的理論依據。「知識擴展」部分包括與本例問題或者本代碼相關的知識補充,用於擴展讀者的知識范圍,同時也有利於理解本例代碼的思路。
本書是「Excel疑難千尋千解」叢書之一,可為讀者解決VBA編程的疑難,同時也是作者羅剛君的另一本著作《Excel VBA程序開發自學寶典》的升級版與配套教材。《Excel VBA程序開發自學寶典》重點在於講述VBA編程的基礎理論和語法,並配有「Excel百寶箱」大型插件的設計過程詳解,該書適合完全沒有VBA基礎者學習,而本書是該書配套的案例,可以使讀者將理論付諸實踐,解決實際工作中的疑難及開發屬於自己的插件。
售後服務
本書由Excel技巧網(技術社區)出品,讀者在閱讀中有任何疑難或者建議、BUG反饋等都可以到社區發貼,包括求助、交流,也可以在社區下載與本書相關的文檔。社區為本叢書開辟了一個專門的版面用於編讀往來,同時本書也配備了專屬的QQ群作為售後服務的聯系方式,群號公布於上述網址,讀者可以申請到群中與作者面對面交流。
購買本書除可以獲取隨書光碟中的所有案例文件外,還有兩項服務,包括實用插件和Excel百寶箱。
實用插件是指隨書光碟中的8個插件,位於「贈品」文件夾中。8個插件可以實現8個功能,同時學習插件的開發思路。每個插件附有源代碼,每句代碼都有含義注釋,且配有使用說明。插件名稱如下:
1.二級選單
可以像數據有效性一樣產生下拉列表,但更強大,可以產生二級選單。
2.批註替換工具
可以批量替換批註文本的工具,且可設定區分大小寫與匹配方式。
3.選項菜單設計
通它既可控制某些視圖對象的顯示與隱藏,又可學習選項菜單的設計思路。
4.一鍵錄入代碼
用於提升編寫代碼的速度與准確度,單擊菜單即可錄入常見代碼。
5.復選框管理
可以批量生成復選框,也可以批量刪除、勾選復選框,功能強大,操作方便。
6.歷史數據記錄器
將指定區域中每一個單元格的修改都記錄在案備查,且同時記錄修改時間。
7.增強型視圖控制
是內置的視圖工具的強化版本,更重要的是可以學習如何開發發功能區。
8.自定義函數封裝
自定義函數Connect是&運算的強化版本,功能強大,且配備代碼封裝教材。
除以上服務外,如果讀者同時購買本書和《Excel VBA程序開發自學寶典》,那麼額外贈送三個實用插件和一個百寶箱8.0正式版。插件包括:
1.隱藏磁碟
可以將指定的磁碟隱藏起來,並禁用使用,從而確保文件安全。
2.隱藏錯誤值
可以將工作表中的所有錯誤值在隱藏與顯示之間瞬間切換。
3.工作簿標簽
在菜單產生工作簿標簽的插件,讓工作簿切換更方便、快捷。
百寶箱8.0是利用VBA開發的大型插件,百寶箱正版包括105個功能,可以大大強化Excel的功能,原價50元銷售。對於讀者可以免費贈送,可進入作者QQ群後向作者免費申請。
本書由黃朝陽策劃,羅剛君和章蘭新負責編寫。其中第1、2、3、4、8、9、10和11章由羅剛君編寫;第5、6、7章由章蘭新編寫,最後由羅剛君、黃朝陽完成統稿。
編著者
2010年8月28日
------------------------------------------------------------------------------------------------------------------------
申明:本書的所有案例和講解都允許作為視頻或面授培訓的教材,但使用者必須遵循約定,在培訓教材的明顯處註明「全部(或部分)案例出自『Excel疑難千尋千解』叢書之《Excel 2010 VBA編程與實踐》」的字樣,以確保作者著作權不受侵犯。

D. 求vb列印預覽控制項源碼程序

Private Sub Command1_Click()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset

Dim oApp As New CRAXDRT.Application
Dim oRpt As CRAXDRT.Report
Dim reportName As String
Dim connstr As String
Dim sSQL As String
'上面三行是新增加的
Screen.MousePointer = vbHourglass
reportName = "\TOAAGLE001.rpt" '定義要引用的rpt文件
Set oRpt = oApp.OpenReport(App.Path & reportName, 1)
oRpt.Database.SetDataSource rs '連接水晶報表和數據源
oRpt.ReadRecords
CRViewer1.ReportSource = oRpt '啟用水晶報表的預覽功能
CRViewer1.ViewReport
Screen.MousePointer = vbDefault

If conn.State = adStateOpen Then conn.Close
'connstr = "Provider=MicroSoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\prtest.mdb;Persist Security Info=False" 'prtest.mdb是程序當前目錄的測試Access資料庫
connstr = "Provider=MSDASQL.1;Extended Properties='DRIVER=sql server;SERVER=OC_CHINA05;UID=HXMFG;PWD=perfect888;APP=Visual Basic;WSID=PC-201104151518;DATABASE=Taileec6'"
conn.ConnectionString = connstr

conn.Open

conn.CursorLocation = adUseClient

If rs.State = adStateOpen Then rs.Close
If Trim(txtno.Text & "") = "" Then
sSQL = "SELECT * FROM dbo.INM_SYS_SYSPARAMETER RIGHT OUTER JOIN dbo.T_AGLE_M ON dbo.INM_SYS_SYSPARAMETER.SYS_PAR_CODE_C = dbo.T_AGLE_M.huopindanwei LEFT Outer Join dbo.INM_ITEM_M ON dbo.T_AGLE_M.huopinid = dbo.INM_ITEM_M.ITM_M_ITEMNO_C RIGHT OUTER JOIN dbo.T_AGLE_D LEFT OUTER JOIN dbo.INM_CUST_M ON dbo.T_AGLE_D.kehuid = dbo.INM_CUST_M.CUST_M_CUSTNO_C ON dbo.T_AGLE_M.dingdanid = dbo.T_AGLE_D.dingdanid"
Else
sSQL = "SELECT * FROM dbo.INM_SYS_SYSPARAMETER RIGHT OUTER JOIN dbo.T_AGLE_M ON dbo.INM_SYS_SYSPARAMETER.SYS_PAR_CODE_C = dbo.T_AGLE_M.huopindanwei LEFT Outer Join dbo.INM_ITEM_M ON dbo.T_AGLE_M.huopinid = dbo.INM_ITEM_M.ITM_M_ITEMNO_C RIGHT OUTER JOIN dbo.T_AGLE_D LEFT OUTER JOIN dbo.INM_CUST_M ON dbo.T_AGLE_D.kehuid = dbo.INM_CUST_M.CUST_M_CUSTNO_C ON dbo.T_AGLE_M.dingdanid = dbo.T_AGLE_D.dingdanid Where dbo.T_AGLE_D.dingdanid='" & Trim(txtno.Text & "") & "'"
End If
rs.Open sSQL, conn, adOpenKeyset, adLockReadOnly

'CRViewer1.ReportfileName = App.Path & "\TOAAGLE001.rpt"
'CRViewer1.PrintReport
End Sub

E. 報表用得最多的控制項是哪兩類

FastReport.Net:歷史悠久,簡單易用,界面簡單且功能強大性價比高。提供源碼,工程師可以在一定程度上自定義一些功能。但支持平台少只有.net和vcl。
Stimulsoft:功能強,界面效果炫酷,支持儀表盤,並且支持平台多(JS、Web、.Net、Wpf、Java、PHP),提供源碼。

F. 如何獲得uiautomation的xml文件

一、軟體安裝
首先通過appstore下載安裝Xcode開發工具,當前編寫文檔時最新版本為4.5.1

二、通過Xcode工具編寫運行測試腳本
說明:如果是在IOS模擬器上運行測試用例,需要有被測試應用的源代碼才有許可權把應用安裝到模擬器中,當前示例中使用了自己編寫的一個簡單Iphone應用,大家也可以直接在網上搜索一個開源的應用即可。

1、當你有了一個應用的源代碼之後,在Xcode工具中,首先選中被測應用,然後點擊菜單欄中的「Proct-Profile」,則會彈出Instruments工具,在彈出的工具中選擇IOS Simulator-》Automation,然後點擊Profile

2、在彈出的Automation工具中選擇需要測試的項目,同時在Add-》Create 添加測試腳本,點擊Create後,在中間區域會出現編寫測試腳本的區域,在中間添加以下腳本
//獲取當前window對象
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
//列印除當前界面的控制項數信息
target.logElementTree();

具體的API參考官方文檔
http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html

3、點擊左上角的Record按鈕則開始運行測試用例,運行完成後在工具的中間位置,原來編寫代碼的地方會出現運行結果的log日誌,我們在剛才的代碼中
編寫了target.logElementTree(),這句API會列印出當前頁面的控制項信息,可以在日誌中看到樹形結構的控制項,點擊可以查看控制項的一
些屬性,這個API在編寫代碼的過程中也會比較有用。
另外如果想切換到編寫代碼的頁面,可以點擊圖中紅框處的進行切換。
注意:通過點擊Record來運行測試用例時,代碼執行完成後不會自動停止,所以需要手工的點擊一下左上角的Stop按鈕來停止運行。

4、錄制回放功能
如果你是第一次編寫自動測試腳本,可能很多API都不知道,這時候你可以先使用一下UIAutomation的錄制回訪功能,參考一下大概是怎麼來編寫測試用例的,當然你也會發現通過錄制回訪會有很多重復的代碼,當你熟悉之後就可以不用錄制回訪來編寫腳本了。
首先你切換到編寫腳本的界面,這時候會看到中間的下方會有一個紅色按鈕,你點擊一下就開始錄制了,這時候會自動幫你在模擬器中啟動起來被測應用,然後你在模擬器上繼續點擊操作的步驟都會被記錄下來。
中間紅色區域就是自動生成的代碼,你可以點擊代碼中的箭頭能看到不同的API,因為查找到一個元素可以使用不同的路徑,對你屬性了解API會有些幫助。
錄制完成後點擊紅色按鈕旁邊的方塊形停止按鈕,錄制就停止了,
想要運行的話還是點擊左上角的Record按鈕就再次運行錄制結果了。

三、編寫測試用例進階篇
通過上面你應該了解了大概怎麼來使用UIAutomation工具以及編寫簡單的測試腳本,當時編寫的也不算是一個測試用例,最起碼的斷言操作都沒有,那麼這一篇我們來將一下如何來編寫一個真正的測試用例。
1、元素識別
如果要編寫測試用例,我們首先想到要操作的控制項元素應該如何去識別找到它呢,第二節我們簡單說了一下通過腳本輸出控制項Log是一種方式可以識別到控制項,還有另外一種方式是使用設備自帶的Accessibility Inspector功能
在模擬器上,你還可以激活Accessibility 的檢測器。啟動模擬器,找到「Settings > General > Accessibility > Accessibility Inspector」,然後將它設為「打開」狀態。
此時在模擬器上會出現一個覆層,你進入需要測試的應用,滑鼠點擊相應的控制項,如下圖所示會看到一些信息,Label就是這個控制項的id屬性,Traits
就是這個控制項的類型,Frame就是這個控制項的位置以及大小{{36,295},{43,21}},其中第一個位置{36,295}是該控制項的左上角的坐
標,{43,21}則是這個控制項的寬度和高度,通過這兩個參數可以算出控制項的具體坐標位置。

2、編寫測試用例

var testName = "FirstTest";
UIALogger.logStart(testName);
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
app.logElementTree();
window.tableViews()[0].cells()[0].tap();
target.delay(3);
var date = window.elements()["date"];
UIALogger.logMessage( date );
if (date){
UIALogger.logPass( testName );
}
else{
UIALogger.logFail( testName );
}

上面是使用了UIAutomation自帶的一些API完成了一個自動測試用例的編寫,包括了元素查找以及斷言操作,但是如果你編寫多個測試用例的話會發現一些問題,比如一些代碼會有重復,用例組織不是很好,斷言操作不方便。

3、tuneup介紹
下面為大家介紹一個開源的基於UIAutomation擴展的JS庫tuneup,這個js擴展庫是方便大家來編寫測試用例。
Tuneup開源地址 https://github.com/alexvollmer/tuneup_js

如何來使用,首先你可以在電腦上新建一個測試用例目錄,比如文件夾名稱就叫Demo,下面可以新建一個lib子文件夾,存放需要用到的一個擴展庫,你下載的tuneup目錄內容可以都放到lib目錄下,在demo文件夾下新建一個測試用例的js文件,測試代碼中只需要把tuneup使用import引用進來就可以使用了,通過tuneup編寫的測試用例如下。

#import "lib/tuneup/tuneup.js"
var target = UIATarget.localTarget();
var app = target.frontMostApp();
/* Second是測試用例的注釋,可以填寫用例的用途,以及編寫人等信息 */
test("Second", function(target, app) {
var window = app.mainWindow();
app.logElementTree();
window.tableViews()[0].cells()[0].tap();
var date = window.elements()["date"];
assertNotNull(date,"進入日期詳情頁面,date屬性沒找到!"); });

四、通過命令行運行測試用例
為了能夠實現自動定時運行測試腳本,編寫完成的測試用例我們希望是能夠通過命令行的方式來啟動運行的,那麼下面我們介紹一下如何通過命令行來啟動運行我們編寫好的測試用例。
instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/ AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate "/Users/ios/Library /Application Support/iPhone Simulator/6.0/Applications/D02EF837-94F7-457A-989A-A654FC034803 / DemoSBTableViewTest.app" -e UIASCRIPT /AutoTest/workspace/IosDemo/test.js -e UIARESULTSPATH /AutoTest/workspace/IosDemo/lib/
上面是通過命令行來運行測試用例的腳本,
-t 後面的參數為Automation.tracetemplate的路徑,不用修改,Xcode4.5以後的版本路徑都是這個,如果是Xcode4.5以前的路徑會不一樣
「/User***.app」 這個參數為被測程序的絕對路徑,模擬器中安裝的應用都可以在本地硬碟中找到
-e UIASCRIPT 指定執行的js腳本
-e UIARESULTSPATH 指定輸出結果存放的路徑

五、後續基於UIAutomation擴展需要的改進點
1、輸出的用例運行結果存在給定的xml文件中, 後續需要解析xml文件,解析成testng的格式,方便後續和Jenkins等持續集成平台整合
2、查找定位元素,只能按照控制項層級,一級一級往下找,使用起來有些不方便,需要再次封裝一下
3、需要加入外圍的一些控制,使整個自動化測試運行完全自動化,另外還需要加入一些失敗重跑機制,UI的自動化一般都會存在一些不穩定的因素

G. js中如何獲取一個id的值

只要使用getAttribute("id")函數即可獲取li元素的id值,下面我們一起實例操作一下吧

  1. 首先我們在html當中創建li標簽

    H. qtx格式用什麼軟體可以打開

    可以使用Apple QuickTime Player打開。

    QTX 是QuickTime擴展文件格式,QuickTime是蘋果公司提供的系統及代碼的壓縮包,它擁有C和Pascal的編程介面,更高級的軟體可以用它來控制時基信號。應用程序可以用QuickTime 來生成,顯示,編輯,拷貝,壓縮影片和影片數據,就象通常操縱文本文件和靜止圖像那樣。

    除了處理視頻數據以外,諸如QuickTime3.0還能處理靜止圖像,動畫圖像,矢量圖,多音軌,MIDI音樂,三維立體,虛擬現實全景和虛擬現實的物體,當然還包括文本。它可以使任何應用程序中都充滿各種各樣的媒體。

    (8)列印控制項源碼擴展閱讀:

    其他格式的文件

    *.lnk 快捷方式

    打開方式:Windows系統。

    *.chm 幫助文件

    打開方式:Windows系統。

    *.xls Excel文件

    打開方式:Microsoft Excel。

    *.doc Word文檔

    打開方式:Microsoft Word。

    *.mp3 音頻文件

    打開方式:播放器。

    *.wav 音頻文件

    打開方式:播放器。

    *.mid 音頻文件

    打開方式:播放器。

    *.wma 音頻文件

    打開方式:播放器。

    *.rar 壓縮文件

    打開方式:Winrar。

    *.zip 壓縮文件

    打開方式:Winzip。

    *.htm 網頁文件

    打開方式:Microsoft Internet Explorer。

    *.pdf pdf文檔

    打開方式:Acrobat Reader。

    I. Google瀏覽器列印預覽插件,不是那個Jquery.PrintPage,想知道怎麼在IE下使用,有沒有這個插件。

    沒的吧

    J. 如何寫一個webpack插件

    前言
    最近由於用著html-webpack-plugin覺得很不爽,於是乎想自己動手寫一個插件。原以為像gulp插件一樣半天上手一天寫完,但令人郁悶的是完全找不到相關的文章。一進官方文檔卻是被嚇傻了。首先是進入 how to write a plugin 看了一頁簡單的介紹。然後教程會告訴你,你需要去了解compiler和compilation這兩個對象,才能更好地寫webpack的插件,然後作者給了github的鏈接給你,讓你去看源代碼,我暈。不過幸好最後給了一個 plugins 的API文檔,才讓我開發的過程中稍微有點頭緒。
    how to write a plugin這個教程還是可以好好看看的,尤其是那個simple example,它會教你在compilation的emit事件或之前,將你需要生成的文件放到webpack的compilation.assets里,這樣就可以藉助webpack的力量幫你生成文件,而不需要自己手動去寫fs.writeFileSync。
    主要就是這段代碼
    ?

    1
    2
    3
    4
    5
    6
    7
    8

    compilation.assets['filelist.md'] = {
    source: function() {
    return filelist;
    },
    size: function() {
    return filelist.length;
    }
    };

    基本特性介紹
    首先,定義一個函數func,用戶設置的options基本就在這里處理。
    其次,需要設一個func.prototype.apply函數。這個函數是提供給webpack運行時調用的。webpack會在這里注入compiler對象。
    輸出complier對象,你會看到這一長串的內容,初步一看,我看出了兩大類(有補充的可以告訴我)。一個webpack運行時的參數,例如_plugins,這些數組里的函數應該是webpack內置的函數,用於在compiltion,this-compilation和should-emit事件觸發時調用的。另一個是用戶寫在webpack.config.js里的參數。隱約覺得這里好多未來都可能會是webpack暴露給用戶的介面,使webpack的定製化功能更強大。
    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107

    Compiler {
    _plugins:
    { compilation: [ [Function], [Function], [Function], [Function] ],
    'this-compilation': [ [Function: bound ] ],
    'should-emit': [ [Function] ] },
    outputPath: '',
    outputFileSystem: null,
    inputFileSystem: null,
    recordsInputPath: null,
    recordsOutputPath: null,
    records: {},
    fileTimestamps: {},
    contextTimestamps: {},
    resolvers:
    { normal: Tapable { _plugins: {}, fileSystem: null },
    loader: Tapable { _plugins: {}, fileSystem: null },
    context: Tapable { _plugins: {}, fileSystem: null } },
    parser:
    Parser {
    _plugins:
    { 'evaluate Literal': [Object],
    'evaluate LogicalExpression': [Object],
    'evaluate BinaryExpression': [Object],
    'evaluate UnaryExpression': [Object],
    'evaluate typeof undefined': [Object],
    'evaluate Identifier': [Object],
    'evaluate MemberExpression': [Object],
    'evaluate CallExpression': [Object],
    'evaluate CallExpression .replace': [Object],
    'evaluate CallExpression .substr': [Object],
    'evaluate CallExpression .substring': [Object],
    'evaluate CallExpression .split': [Object],
    'evaluate ConditionalExpression': [Object],
    'evaluate ArrayExpression': [Object],
    'expression Spinner': [Object],
    'expression ScreenMod': [Object] },
    options: undefined },
    options:
    { entry:
    {
    'index': '/Users/mac/web/src/page/index/main.js' },
    output:
    { publicPath: '/homework/features/model/',
    path: '/Users/mac/web/dist',
    filename: 'js/[name].js',
    libraryTarget: 'var',
    sourceMapFilename: '[file].map[query]',
    hotUpdateChunkFilename: '[id].[hash].hot-update.js',
    hotUpdateMainFilename: '[hash].hot-update.json',
    crossOriginLoading: false,
    hashFunction: 'md5',
    hashDigest: 'hex',
    hashDigestLength: 20,
    sourcePrefix: '\t',
    devtoolLineToLine: false },
    externals: { react: 'React' },
    mole:
    { loaders: [Object],
    unknownContextRequest: '.',
    unknownContextRecursive: true,
    unknownContextRegExp: /^\.\/.*$/,
    unknownContextCritical: true,
    exprContextRequest: '.',
    exprContextRegExp: /^\.\/.*$/,
    exprContextRecursive: true,
    exprContextCritical: true,
    wrappedContextRegExp: /.*/,
    wrappedContextRecursive: true,
    wrappedContextCritical: false },
    resolve:
    { extensions: [Object],
    alias: [Object],
    fastUnsafe: [],
    packageAlias: 'browser',
    molesDirectories: [Object],
    packageMains: [Object] },
    plugins:
    [ [Object],
    [Object],
    [Object],
    [Object],
    NoErrorsPlugin {},
    [Object],
    [Object] ],
    devServer: { port: 8081, contentBase: './dist' },
    context: '/Users/mac/web/',
    watch: true,
    debug: false,
    devtool: false,
    cache: true,
    target: 'web',
    node:
    { console: false,
    process: true,
    global: true,
    setImmediate: true,
    __filename: 'mock',
    __dirname: 'mock' },
    resolveLoader:
    { fastUnsafe: [],
    alias: {},
    molesDirectories: [Object],
    packageMains: [Object],
    extensions: [Object],
    moleTemplates: [Object] },
    optimize: { occurenceOrderPreferEntry: true } },
    context: '/Users/mac/web/' }

    除此以外,compiler還有一些如run, watch-run的方法以及compilation, normal-mole-factory對象。我目前用到的,主要是compilation。其它的等下一篇有機會再說。
    對比起compiler還有compiler.plugin函數。這個相當於是插件可以進行處理的webpack的運行中的一些任務點,webpack就是完成一個又一個任務而完成整個打包構建過程的。如make是最開始的起點, complie就是編譯任務點,after-complie是編譯完成,emit是即將准備生成文件,after-emit是生成文件之後等等,前面幾個都是比較生動形象的任務點。
    至於compilation,它繼承於compiler,所以能拿到一切compiler的內容(所以你也會看到webpack的options),而且也有plugin函數來接入任務點。在compiler.plugin('emit')任務點輸出compilation,會得到大致下面的對象數據,因為實在太長,我只保留了最重要的assets部份:
    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57

    assetsCompilation {
    assets:
    { 'js/index/main.js':
    CachedSource {
    _source: [Object],
    _cachedSource: undefined,
    _cachedSize: undefined,
    _cachedMaps: {} } },
    errors: [],
    warnings: [],
    children: [],
    dependencyFactories:
    ArrayMap {
    keys:
    [ [Object],
    [Function: MultiEntryDependency],
    [Function: SingleEntryDependency],
    [Function: LoaderDependency],
    [Object],
    [Function: ContextElementDependency],
    values:
    [ NullFactory {},
    [Object],
    NullFactory {} ] },
    dependencyTemplates:
    ArrayMap {
    keys:
    [ [Object],
    [Object],
    [Object] ],
    values:
    [ ConstDependencyTemplate {},
    {},
    NullDependencyTemplate {},
    {},
    {},
    AMDRequireDependencyTemplate {},
    {},
    {},
    {},
    AMDRequireDependencyTemplate {},
    LocalMoleDependencyTemplate {},
    MoleDependencyTemplateAsId {},
    {},
    MoleDependencyTemplateAsId {},
    ContextDependencyTemplateAsId {},
    {},
    {} ] },
    fileTimestamps: {},
    contextTimestamps: {},
    name: undefined,
    _currentPluginApply: undefined,
    fullHash: '',
    hash: 'f4030c2aeb811dd6c345',
    fileDependencies: [ '/Users/mac/web/src/js/index/main.js' ],
    contextDependencies: [],
    missingDependencies: [] }

    assets部份重要是因為如果你想藉助webpack幫你生成文件,你需要像官方教程how to write a plugin在assets上寫上對應的文件信息。
    除此以外,compilation.getStats()這個函數也相當重要,能得到生產文件以及chunkhash的一些信息,如下:
    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65

    assets{ errors: [],
    warnings: [],
    version: '1.12.9',
    hash: '5a5c71cb2accb8970bc3',
    publicPath: 'xxxxxxxxxx',
    assetsByChunkName: { 'index/main': 'js/index/index-4c0c16.js' },
    assets:
    [ { name: 'js/index/index-4c0c16.js',
    size: 453,
    chunks: [Object],
    chunkNames: [Object],
    emitted: undefined } ],
    chunks:
    [ { id: 0,
    rendered: true,
    initial: true,
    entry: true,
    extraAsync: false,
    size: 221,
    names: [Object],
    files: [Object],
    hash: '4c0c16e8af4d497b90ad',
    parents: [],
    origins: [Object] } ],
    moles:
    [ { id: 0,
    identifier: 'multi index/main',
    name: 'multi index/main',
    index: 0,
    index2: 1,
    size: 28,
    cacheable: true,
    built: true,
    optional: false,
    prefetched: false,
    chunks: [Object],
    assets: [],
    issuer: null,
    profile: undefined,
    failed: false,
    errors: 0,
    warnings: 0,
    reasons: [] },
    { id: 1,
    identifier: '/Users/mac/web/node_moles/babel-loader/index.js?presets[]=es2015⪯sets[]=react!/Users/mac/web/src/js/main/index.js',
    name: './src/js/index/main.js',
    index: 1,
    index2: 0,
    size: 193,
    cacheable: true,
    built: true,
    optional: false,
    prefetched: false,
    chunks: [Object],
    assets: [],
    issuer: 'multi index/main',
    profile: undefined,
    failed: false,
    errors: 0,
    warnings: 0,
    reasons: [Object],
    source: '' // 具體文件內容}
    ],
    filteredMoles: 0,
    children: [] }

    這里的chunks數組里,是對應會生成的文件,以及md5之後的文件名和路徑,裡面還有文件對應的chunkhash(每個文件不同,但如果你使用ExtractTextPlugin將css文件獨立出來的話,它會與require它的js入口文件共享相同的chunkhash),而assets.hash則是統一的hash,對每個文件都一樣。值得關注的是chunks里的每個文件,都有source這一項目,提供給開發者直接拿到源文件內容(主要是js,如果是css且使用ExtractTextPlugin,則請自行列印出來參考)。
    例子
    接下來,會以最近我寫的一個插件 html-res-webpack-plugin 作為引子,來介紹基本的寫插件原理。插件的邏輯就寫在index.js里。
    首先,將用戶輸入的參數在定好的函數中處理,HtmlResWebpackPlugin。
    然後,新增apply函數,在裡面寫好插件需要切入的webpack任務點。目前HtmlResWebpackPlugin插件只用到emit這個任務點,其它幾個僅作為演示。
    第三步,調用addFileToWebpackAsset方法,寫compilation.assets,藉助webpack生成html文件。
    第四步,在開發模式下(isWatch = true),直接生成html,但在生產模式下(isWatch = true),插件會開始對靜態資源(js,css)進行md5或者內聯。
    第五步,調用findAssets方法是為了通過compilation.getStats()拿到的數據,去匹配對應的靜態資源,還有找到對應的哈希(是chunkhash還是hash)。
    最六步,調用addAssets方法,對靜態資源分別做內聯或者md5文件處理。內聯資源的函數是inlineRes,你會看到我使用了compilation.assets[hashFile].source() 及 compilation.assets[hashFile].children[1]._value。前者是針對於js的,後者是針對使用了ExtractTextPlugin的css資源。
    最後一步,即是內聯和md5完成後,再更新一下compilation.assets中對應生成html的source內容,才能正確地生成內聯和md5後的內容。
    後記
    有興趣可以試用一下 html-res-webpack-plugin 這個插件(為什麼要寫一個新的html生成插件,我在readme里寫了,此處不贅述),看看有哪些用得不爽之處。目前只是第一版,還不適合用於生產環境。希望第二版的時候能適用於更多的場景,以及性能更好。到是,我也會寫第二篇插件開發文章,將本文還沒提到的地方一一補充完整。也歡迎大家在這里發貼,或者指出本人的謬誤之處。

熱點內容
qq怎麼上傳相冊圖片 發布:2024-10-27 22:53:21 瀏覽:814
差額及演算法 發布:2024-10-27 22:36:44 瀏覽:290
解壓番茄球有毒嗎 發布:2024-10-27 22:36:43 瀏覽:861
動態密碼在哪裡獲得 發布:2024-10-27 22:36:42 瀏覽:183
ios9照片加密 發布:2024-10-27 22:18:29 瀏覽:49
pythonyaml安裝 發布:2024-10-27 22:06:32 瀏覽:585
php5升級到php7 發布:2024-10-27 21:46:06 瀏覽:737
安卓機都在哪裡下載游戲 發布:2024-10-27 21:23:57 瀏覽:647
伺服器里的視頻怎麼做成鏈接 發布:2024-10-27 21:23:19 瀏覽:383
資料庫還原出錯 發布:2024-10-27 21:23:14 瀏覽:379