当前位置:首页 » 操作系统 » 打印控件源码

打印控件源码

发布时间: 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里写了,此处不赘述),看看有哪些用得不爽之处。目前只是第一版,还不适合用于生产环境。希望第二版的时候能适用于更多的场景,以及性能更好。到是,我也会写第二篇插件开发文章,将本文还没提到的地方一一补充完整。也欢迎大家在这里发贴,或者指出本人的谬误之处。

热点内容
vs2017编译技巧 发布:2024-10-27 21:01:14 浏览:49
21款四缸英朗和雷凌哪个配置高 发布:2024-10-27 20:59:43 浏览:83
布什访问华 发布:2024-10-27 20:48:23 浏览:957
安卓转苹果王者怎么选区 发布:2024-10-27 20:36:44 浏览:120
wps快速访问工具栏 发布:2024-10-27 20:30:38 浏览:17
android手机截屏 发布:2024-10-27 20:20:17 浏览:441
手机外置存储卡 发布:2024-10-27 20:02:12 浏览:338
哪里有手机版安卓软件 发布:2024-10-27 19:48:45 浏览:253
百度云磁盘缓存 发布:2024-10-27 19:48:44 浏览:913
java查看源码工具 发布:2024-10-27 19:46:04 浏览:412