﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-工具</title><link>http://www.cppblog.com/woaidongmao/category/8872.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Sun, 19 Apr 2009 15:53:53 GMT</lastBuildDate><pubDate>Sun, 19 Apr 2009 15:53:53 GMT</pubDate><ttl>60</ttl><item><title>PowerDesigner与Rose详解对比</title><link>http://www.cppblog.com/woaidongmao/archive/2009/03/26/77999.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 26 Mar 2009 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/03/26/77999.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/77999.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/03/26/77999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/77999.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/77999.html</trackback:ping><description><![CDATA[<p></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">一、 二者的出身<span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　作为世界最著名的两大<span lang="EN-US">CASE</span>工具，<span lang="EN-US">Rational Rose</span>和<span lang="EN-US">PowerDesigner</span>的名声可谓如雷贯耳。<span lang="EN-US">Rose</span>是当时全球最大的<span lang="EN-US">CASE</span>工具提供商<span lang="EN-US">Rational</span>的拳头产品，<span lang="EN-US">UML</span>建模语言就是由<span lang="EN-US">Rational</span>公司的三位巨头<span lang="EN-US">Booch</span>、<span lang="EN-US">Rumbaugh</span>和<span lang="EN-US">Jacobson</span>发明的，后来<span lang="EN-US">Rational</span>被<span lang="EN-US">IBM</span>收购，所以<span lang="EN-US">Rose </span>可谓出身名门，嫁入豪族。而<span lang="EN-US">PowerDesigner</span>也有一段好玩的历史，作者王晓昀是一位中国人，在法国<span lang="EN-US">SDP</span>软件公司工作时，由于苦觅一个好用的<span lang="EN-US">CASE</span>工具未果，干脆自由开搞，整了个<span lang="EN-US">AMC*Designor</span>出来，居然一炮打响，在法国卖得个<span lang="EN-US">“</span>巴黎纸贵<span lang="EN-US">”</span>，后来<span lang="EN-US">SDP</span>被<span lang="EN-US">Powersoft</span>公司收购，同年<span lang="EN-US">Sybase</span>这只大黄雀又吃下了<span lang="EN-US">Powersoft</span>这只螳螂，所以<span lang="EN-US">PowerDesigner</span>也是惊艳出场，星光四射。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　但两者所走的明星路线却很不相同，<span lang="EN-US">Rose</span>出道是时，走的是<span lang="EN-US">UML</span>面向对象建模，而后再向数据库建模发展，而<span lang="EN-US">PowerDesigner</span>则反其道而行之，它先是一个纯粹的数据库建模工具，后来才向面向对象建模，业务逻辑建模及需求分析建模进军，最终变成<span lang="EN-US">“</span>演视歌三栖<span lang="EN-US">”</span>明星。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　由于第一印象的影响，所以<span lang="EN-US">Rose</span>常常给人的印象还是只是面向对象分析设计的工具，而<span lang="EN-US">PowerDesigner</span>给人的印象则还停留在数据库建模工具上。其实，现在的<span lang="EN-US">Rose</span>和<span lang="EN-US">PowerDesigner</span>都即可以进行数据库建模，也可以进行面向对象建模，只是存在支持上的偏重而已。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">二、 二者区别概述<span lang="EN-US"><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>和<span lang="EN-US">PowerDesigner</span>虽然在项目分析设计领域已经成为被高度聚光的明星，但是在具体使用哪款工具的问题上，不同的公司，不同的人，出于成本，习惯抑或个人喜好，往往有自己的判断。由于笔者在不同的公司中被分别要求使用<span lang="EN-US">Rose</span>或<span lang="EN-US">PowerDesigner</span>进行分析设计工作，所以对二者有着较为细致的体验。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>走大而全，一站式的策略，它没有将数据库设计和面向对象设计清晰地分开，仅以不同的目录来区分。而<span lang="EN-US">PowerDesigner</span>将两者划分到独立的模型文件中，分别对应不同的设计环境，并通过模型之间的转换工具建立各模型的关联。即使对于数据库设计模型，<span lang="EN-US">PowerDesigner</span>也需要你选择一个具体的数据库产品及其版本，以便工作环境对具体数据库敏感。所以<span lang="EN-US">Rose</span>显得大而化之，而<span lang="EN-US">PowerDesigner</span>则比较精细和具体化。<span lang="EN-US">Rose</span>的逆向工程，文档输出，代码生成等输入输出功能上表现得比较生硬单调，<span lang="EN-US">PowerDesigner</span>在逆向工程，特别是文档输出和代码生成这些功能上提供了精细的控制，让用户拥有高度的自由度。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>在操作体验上存在很多需要改进的地方，<span lang="EN-US">Rose</span>偏向于让用户用鼠标进行操作，对键盘操作支持不好。而<span lang="EN-US">PowerDesigner</span>在用户体验上得分很高，大部分操作都可以通过键盘完成，在充分熟悉其快捷键的前提下，<span lang="EN-US">PowerDesigner</span>将给设计者一种行云流水的感觉，用户交互上更加人性化。此外，<span lang="EN-US">Rose</span>往往占用更多的资源，容易异常退出，<span lang="EN-US">PowerDesigner</span>则显得轻便稳定。所以，我个人对两者的体验就是<span lang="EN-US">“Rose</span>笨拙，<span lang="EN-US">PD</span>利索<span lang="EN-US">”</span>。下面将具体列出<span lang="EN-US">Rose</span>和<span lang="EN-US">PowerDesigner</span>的一系列的区别，相信大家可以借由这些比较而见微知著，窥斑知豹，以资在选择工具时，提供参考。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">三、 模型组织和层次结构上的区别<span lang="EN-US"><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">1</span>、模型组织<span lang="EN-US">Rose</span>将数据库模型和对象模型放在一起，在进行数据表模型设计时，没有特性化的东西。而<span lang="EN-US">PowerDesigner</span>将两者分开，其模型组织层级关系是：工作空间<span lang="EN-US">-&gt;</span>模型类型<span lang="EN-US">-&gt;</span>具体语言<span lang="EN-US">/</span>数据库的模型<span lang="EN-US">-&gt;</span>包<span lang="EN-US">-&gt;</span>文件夹<span lang="EN-US">-&gt;Diagram-&gt;</span>设计元素。在创建模型文件时，会让你选择模型类型，选择模型类型后，还可以选择模型类型下语言及版本相关的细分类。不同设计模型对应软件工程的不同阶段，如业务模型和需求模型属于项目需求阶段，而对象模型属于概要和详细设计阶段，数据库模型属于详细设计阶段。它们之间虽然有很强的内在联系，但差异性也很明显，硬将两者放到一起，就象把猴子和猩猩关进同一个笼子，为了兼顾和平衡两者之间的考量，其结果是两者都得不到很好的支持。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="277" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image002_thumb.jpg" width="530" border="0" v:shapes="_x0000_i1025"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 1</span>新建模型窗口<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image003_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="452" alt="clip_image003" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image003_thumb.jpg" width="450" border="0" v:shapes="_x0000_i1026"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 2</span>新建模型窗口<span lang="EN-US">(Rose)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesinger</span>可以通过模型转换工具进行数据库建模和面向对象模型的相互转换。但<span lang="EN-US">Rose</span>不能将对象转换为表，也不能将表转换为对象。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">2</span>、工作空间<span lang="EN-US">PowerDesigner</span>有工作空间的概念，一个工作空间下可以同时打开多个设计模型文件<span lang="EN-US">;</span>而<span lang="EN-US">Rose</span>同时仅能打开一个设计文件，如果在设计时，需要参考其他的<span lang="EN-US">Rose</span>设计模型，则需要反复关闭现有模型，打开参考模型，显得设计上比较欠考虑。这个问题上两者的差异恰似<span lang="EN-US">Eclipse</span>和<span lang="EN-US">JBuilder</span>的区别，<span lang="EN-US">Eclipse</span>可以同时打开多个工程，而<span lang="EN-US">JBuilder</span>只能同时打开一个工程。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">3</span>、设计界面<span lang="EN-US">PowerDesigner</span>的设计界面可以左右上下移动，而<span lang="EN-US">Rose</span>只能向右，向下移动，此外。<span lang="EN-US">PowerDesigner</span>可以将模型元素放大很多倍，而<span lang="EN-US">Rose</span>只能放大到正常倍数，不过<span lang="EN-US">Rose</span>的<span lang="EN-US">Overview</span>工具可以使用户快速定位到设计区中特定的区域，有点类似于游戏界面中常用的小地图，挺不错<span lang="EN-US">;<o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image005_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="371" alt="clip_image005" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image005_thumb.jpg" width="581" border="0" v:shapes="_x0000_i1027"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 3 Overview</span>工具<span lang="EN-US">(Rose)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　而在<span lang="EN-US">PowerDesigner</span>中，你可以通过<span lang="EN-US">F8</span>快捷键查看<span lang="EN-US">Diagram</span>的总览图，不过只得通过放大操作定位到定位区域。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">四、对模型和语言的支持<span lang="EN-US"><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>对设计模型的支持力度和广度<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>对对象模型和数据库建模两者的支持力度已经大抵相等，此外，还支持概念模型、业务模型、需求模型、<span lang="EN-US">XML</span>模型、信息流模型、自由模型的分析设计。不过对后面这几个模型的支持比较初级，而且在实际的应用中，这些模型用得也比较少，<span lang="EN-US">PowerDesigner</span>的突出亮点还是在数据库建模和对象模型的设计上。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　对于数据库模型，<span lang="EN-US">PowerDesigner</span>支持<span lang="EN-US">20</span>余种数据库，对于同一数据库的不同版本还提供单独的支持，以便在设计数据库模型时，提供数据库和版本相关的设计。对于面向对象模型，<span lang="EN-US">PowerDesigner</span>支持<span lang="EN-US">11</span>种主流语言，为对<span lang="EN-US">Java 5.0</span>提供单独的支持。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>基本上可以说是一个对象模型设计工具，对数据库模型的支持相对粗糙，内嵌的只支持<span lang="EN-US">Oracle 8</span>数据库，对其他数据库设计的支持需要通过安装插件的方式获得，且对数据库物理存储参数等较细粒度的内容支持得比较粗糙。<span lang="EN-US">Rose</span>的对象模型主要支持<span lang="EN-US">Java</span>、<span lang="EN-US">VC</span>和<span lang="EN-US">VB</span>三种语言。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>对<span lang="EN-US">Java</span>语言的支持<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>对<span lang="EN-US">Java</span>语言的支持更好，不但为不同版本的<span lang="EN-US">JDK</span>提供了支持<span lang="EN-US">(</span>不过<span lang="EN-US">Rose 2003</span>还不支持<span lang="EN-US">JDK 5.0)</span>，还为<span lang="EN-US">Java</span>具体产品及设计模式<span lang="EN-US">(</span>如<span lang="EN-US">EJB</span>、<span lang="EN-US">Corba</span>、<span lang="EN-US">Servlet</span>，<span lang="EN-US">GOF</span>设计模式等<span lang="EN-US">)</span>提供了内嵌性的支持，这些支持直接反应在<span lang="EN-US">Rose</span>的主菜单上。正因为如此，使<span lang="EN-US">Rose</span>背上的沉重的历史负担，如<span lang="EN-US">EJB</span>和<span lang="EN-US">Corba</span>这种语言级的东西是易变且不断更新的，如何在这些具体产品的地位和影响已经降低时，对其作出割舍而又保证版本的兼容性，是摆在设计者面前的难题。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>仅提供语言级对象设计的支持，不涉及语言内部的具体产品。其次因为它的设计工作区是和具体的模型类型及语言细分类相关的，而非在主菜单中直接提供支持，所以<span lang="EN-US">PowerDesigner</span>在升级时显得更加从容一些。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　这也是为什么<span lang="EN-US">PowerDesigner</span>能以每年一个版本的速度升级，而<span lang="EN-US">Rose</span>在<span lang="EN-US">2003</span>版本后，新版本还迟迟投入市场的内在原因，否则以<span lang="EN-US">IBM</span>的财力，研发能力不至于对市场反应如果缓慢。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">五、输入和输出功能的比较<span lang="EN-US"><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>反向工程<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　从将程序代码转换为设计模型的逆向工程功能上看，<span lang="EN-US">Rose</span>更象一个<span lang="EN-US">IDE</span>，它会对需要逆向工程操作的程序代码进行深度语义检查，如果存在诸如程序代码引用了类库之外的类，反向工程将失败，而且在报告失败之前，窗口会陷入长时间无响应状态。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>仅对需逆向工程的程序代码进行浅度语法检查，这种浅度语法检查不涉及包，类之间的关联，仅对诸如类名是否和类文件名匹配，是否少了<span lang="EN-US">“}” </span>等语法性的内容进行检查。即便存在错误，<span lang="EN-US">PowerDesigner</span>也允许你忽略错误，继续进行逆向工程操作，这种宽松的限制带来了很大的便利。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image006_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="131" alt="clip_image006" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image006_thumb.jpg" width="388" border="0" v:shapes="_x0000_i1028"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 4</span>逆向工程失败选择三种选择<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　忽略错误后，<span lang="EN-US">PowerDesigner</span>会尽量修补错误，例如代码中少了对应的<span lang="EN-US">“}”</span>，它将会补上，类名和文件名不一致，将忽略类文件名保持类名不变。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>一直宣扬的理念是<span lang="EN-US">IDE</span>和设计工程进行双向互通：在<span lang="EN-US">Rose</span>中完成模型设计后导出为<span lang="EN-US">IDE</span>所用的代码，<span lang="EN-US">IDE</span>编码调整后又逆向工程到<span lang="EN-US">Rose</span>。理念很美，深具吸引力，但是在实现中，往往很少有开发团队会这样做。一般<span lang="EN-US">CASE</span>工具只是在分析设计阶段使用，甚至很大比例的设计师仅把它当成画图的工具。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　真正进入编码开发阶段后，将加入大量设计时不涉及的类和方法，如果将这些非骨架性的东西<span lang="EN-US">Reverse</span>到<span lang="EN-US">CASE</span>工具中，反而会使原来清晰的设计变得雾里花，水中月。所以即使编码时，需要对原分析模型进行调整，一般也是手工去调整设计模型，而不是通过逆向工程去同步，毕竟分析设计是骨架性的，而编码是血肉性的，两者有属性上的区别。如果真的需要频繁进行的代码和<span lang="EN-US">UML</span>转换，最好使用类似于<span lang="EN-US">Together</span>一样的工具，它嵌入到<span lang="EN-US">IDE</span>中，使代码和模型转换方便快捷。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>文档导出功能<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>对文档导出提供了精细的控制，你不但可以对文档所包含的内容项进行设置，还可以对内容项的格式进行设置。如导出的表结构是否包括名称、数据类型、备注等项目，这些项目在表栏中的宽度占比，颜色，字号等等，不一而足。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesinger 12.0 </span>还新增了一个多模型文档整合导出的<span lang="EN-US">Milti-Model Report</span>模型，允许你以多个模型作为输入生成为统一文档，实现模型设计按阶段分开，文档又统一整合的目的。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　由于<span lang="EN-US">PowerDesigner</span>文档导出的设置非常精细，所以要设置好一个文档导出模式实非不易。有鉴于此，<span lang="EN-US">PowerDesinger</span>提供了三种常用的导出模板，用户也可以自己定义模板。通过模板可以迅速完成设计模型文档的导出工作。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　而<span lang="EN-US">Rose</span>没有导出模板的概念，更不能对导出项和格式进行设置，你只能按<span lang="EN-US">Rose</span>的系统内置的方式进行模型文档的发布。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>代码导出<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　在导出设计模型的代码时，<span lang="EN-US">PowerDesigner</span>提供了精细的控制，不但可以进行对象级别，还可以进行代码级别的控制<span lang="EN-US">(</span>如是否要生成字段备注的代码，外键代码在表体代码内声明还是在表体外部声明等<span lang="EN-US">)</span>，而<span lang="EN-US">Rose</span>没有提供代码导出的控制，也只能按其系统内部设置的方式导出代码。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image007_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="367" alt="clip_image007" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image007_thumb.jpg" width="588" border="0" v:shapes="_x0000_i1029"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 5 </span>数据库模型导出设置<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">?<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　生成测试数据<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>可为数据表生成批量的测试数据，而且你还可以制定测试数据的生成规则。这个功能给初期项目的开发测试带来很大的便利。<span lang="EN-US">Rose</span>中没有提供类似的功能。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">1 {$ page title=</span>易用性上的比较<span lang="EN-US">}<o:p></o:p></span></span></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">六、 易用性上的比较<span lang="EN-US"><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.1</span>、元素显示属性调整<span lang="EN-US">Rose</span>调整元素的显示属性<span lang="EN-US">(</span>如类图的显示样式，方法入参是否显示等内容<span lang="EN-US">)</span>的设置时，新设置仅对新创建的元素起作用，如需调整已有元素的显示属性，只得在设计<span lang="EN-US">Diagram</span>中，逐一通过右键的方式一个个调整，做法有点刀耕火种的味道。<span lang="EN-US"> PowerDesigner</span>在这点上显得很人性化，在调整完元素显示设置后，<span lang="EN-US">PowerDesigner</span>弹出一个窗口，提供三个应用新设置的选择：<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image008_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="216" alt="clip_image008" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image008_thumb.jpg" width="307" border="0" v:shapes="_x0000_i1030"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 6</span>元素显示设置调整后应用范围<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　其一，应用到所有元素<span lang="EN-US">;</span>其二，应用到当前选择的元素，其三，应用到新创建的元素。此外，<span lang="EN-US">PowerDesigner</span>对每一类元素<span lang="EN-US">(</span>如类图，序列图，表图，引用等<span lang="EN-US">)</span>的构成项<span lang="EN-US">(</span>如表名，字段名，主键列，索引列等<span lang="EN-US">)</span>均可以提供单独的显示属性设置，比<span lang="EN-US">Rose</span>的控制要精细很多。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.2</span>、<span lang="EN-US">Undo</span>操作<span lang="EN-US">Rose</span>的<span lang="EN-US">Undo</span>操作只能回退一步，有时甚至连一步都不能回退，假设你不小心删除了一个精心设计的模型元素，如果不及时<span lang="EN-US">Undo</span>，就只得重头再来了。<span lang="EN-US">Rose</span>不给设计者后悔的机会，这种一厢情愿的呆瓜式设计有时真让人捶胸跺足，所以你在删除或调整元素时，往往得战战兢兢，如履薄冰。相比之下，<span lang="EN-US">PowerDesigner</span>则显得宽宏大量，允许你<span lang="EN-US">Undo</span>几十步，自动地进行工作场景的回溯，所以在<span lang="EN-US">PowerDesigner</span>下工作，会比较轻松自如，因为你不用为误操作而付出代价。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.3</span>、查询功能<span lang="EN-US">PowerDesigner</span>的查询功能比较强大，可以按模型类型，元素类型限定查询范围<span lang="EN-US">;</span>还可以使用复合条件进行精确搜索。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image009_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="300" alt="clip_image009" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image009_thumb.jpg" width="489" border="0" v:shapes="_x0000_i1031"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 7</span>高级搜索窗口<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　在元素查询结果列表中，可以选择定位到导航树，<span lang="EN-US">Diagram</span>或者属性设计窗口，非常方便<span lang="EN-US">;</span>而<span lang="EN-US">Rose</span>只能按名称进行搜索，且从搜索结果列表只能定位到元素所在的<span lang="EN-US">Diagram</span>中。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image010_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="337" alt="clip_image010" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image010_thumb.jpg" width="509" border="0" v:shapes="_x0000_i1032"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 8 </span>搜索窗口<span lang="EN-US">(Rose)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.4</span>、默认字体的问题<span lang="EN-US">PowerDesigner</span>有一个比较让人讨厌的东西，就是字体大小的系统默认值是<span lang="EN-US">8</span>号字，对于中文来说这个字号太小了，需要<span lang="EN-US">9</span>号字才比较适合。所以在设计元素时，需要分别调整字体的大小，或者去改变每种元素的默认字体设置，相对来说比较麻烦。而<span lang="EN-US">Rose</span>在这点中做得不错，系统默认的中文字体大小的默认值刚好适合。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.5</span>、元素布局调整<span lang="EN-US">PowerDesigner</span>对<span lang="EN-US">Diagram</span>中元素的布局提供了更多的支持，如元素对齐排列，元素的上下图层关系等，并提供了相应的快捷键，操作起来很顺手。而<span lang="EN-US">Rose</span>仅支持自动布局<span lang="EN-US">(Auto Layout)</span>功能，毫无二致地将选择的元素水平中心对齐，也没有图层前后移动的功能。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.6</span>、用鼠标进行元素选取的策略在<span lang="EN-US">Diagram</span>中选择模型元素时，<span lang="EN-US">PowerDesigner</span>采取<span lang="EN-US">“</span>完全包含选取策略<span lang="EN-US">”</span>，而<span lang="EN-US">Rose</span>采取<span lang="EN-US">“</span>部分包含选取策略<span lang="EN-US">”</span>。在<span lang="EN-US">“</span>完全包含选取策略<span lang="EN-US">”</span>下，<span lang="EN-US">Diagram</span>中的元素需要完全被鼠标选择的矩形区域包含后，才被选中<span lang="EN-US">;</span>而在<span lang="EN-US">“</span>部分包含选取策略<span lang="EN-US">”</span>下，只要元素的部分区域被鼠标选择的矩形区域包含，就被选中。依个人的使用经验，觉得<span lang="EN-US">“</span>完全包含选取策略<span lang="EN-US">”</span>是更适合些，<span lang="EN-US">Microsoft</span>的产品也采用这种策略。因为在<span lang="EN-US">“</span>部分包含选取策略<span lang="EN-US">”</span>下，只要一擦边，元素就被选择了，其结果往往是选择了很多不希望选取的东西，如连线，周边元素图形等。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.7</span>、代码预览功能<span lang="EN-US"> PowerDesigner</span>可以在属性窗口中预览模型元素<span lang="EN-US">(</span>如类、接口、表、视图等<span lang="EN-US">)</span>对应的代码。在类图的属性窗口中，甚至还可以直接编辑预览的代码来进行模型元素的设计，就象<span lang="EN-US">Together</span>一样。在设计诸如类，接口的模型元素的方法时，对于有着丰富编程经验的设计师来说，有时与其通过一个又一个弹出对话框，还不如直接通过编写代码来得方便，<span lang="EN-US">PowerDesigner</span>的这种设计充分地考虑到了分析设计人员同时也是开发人员出身的特点，由此带来很大的便利，提高了效率。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image011_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="420" alt="clip_image011" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image011_thumb.jpg" width="527" border="0" v:shapes="_x0000_i1033"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 9</span>类设计属性窗口<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　而在<span lang="EN-US">Rose</span>中，模型元素没有代码预览功能，更不能通过代码进行反向设计，只有通过导出代码的功能才能看到模型元素的代码。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.8</span>、同类型元素统一管理窗口<span lang="EN-US">PowerDesigner</span>为每一类型元素<span lang="EN-US">(</span>如字段，表，对象，索引，主键等<span lang="EN-US">)</span>提供了集中管理窗口，可以在该列表中对同类元素进行统一管理。如在设计数据库模型时，希望将所有的索引存储到一个指定的表空间中，你可以打开索引的集中管理窗口：<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image012_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="341" alt="clip_image012" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image012_thumb.jpg" width="620" border="0" v:shapes="_x0000_i1034"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 10 </span>索引属性列表框<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　在此管理窗口中调整所有索引的<span lang="EN-US">Options</span>设置就可以了。如果没有这样的集中管理窗口，就需要在每个表的属性窗口中分别独自地设置表索引的<span lang="EN-US">Options</span>属性，操作繁琐暂且不提，如何去保证每个索引都得到正确的设置就够让人伤脑筋了。而在<span lang="EN-US">Rose</span>下，你就得逐门逐户查户口式的一个个去设置，没有捷径可走。<span lang="EN-US">PowerDesigner</span>的这种分散设计，集中管理的设计思路体现对立统一的哲学思想的完好运用，因为事物有其独特性，也有其统一性，需要兼顾两者而不可偏废。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">6.9</span>、批量编辑操作<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>的批量编辑操作能够大大提高的工作效率，这些批量编辑操作包括同时选中多个元素项目，同时编辑选中项的相同属性值，调整顺序等。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">1<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">{$ page title=</span>资源占用和运行稳定性<span lang="EN-US">}<o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image014_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="473" alt="clip_image014" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image014_thumb.jpg" width="615" border="0" v:shapes="_x0000_i1035"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 11</span>批量编辑操作<span lang="EN-US">(PD)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>不支持批量编辑和批量顺序调整等操作，需要逐一编辑：<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image015_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="405" alt="clip_image015" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image015_thumb.jpg" width="524" border="0" v:shapes="_x0000_i1036"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 12 </span>不支持批量编辑<span lang="EN-US">(Rose)<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>元素快捷图示<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>可以创建模型元素的快捷图示，它相当于是元素视图层上的多份拷贝，使同一个物理元素对应多个逻辑的图示。这对于大型复杂系统的分析设计特别有好处，因为一个模型元素会在多个地方被引用，这时你就可以通过<span lang="EN-US">Ctrl+C</span>和<span lang="EN-US">Ctrl+K</span>的方式来创建模型元素的快捷图示，在多个地方使用它，甚至在同一个<span lang="EN-US">Diagram</span>中使一个元素在不同的地方出现多次，防止大距离的关系连线导致蜘蛛网式的设计图。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>也可以创建快捷图示，即通过<span lang="EN-US">Ctrl+C</span>和<span lang="EN-US">Ctrl+V</span>创建，但却不能复制一个现有的元素，<span lang="EN-US">Ctrl+C</span>和<span lang="EN-US">Ctrl+V</span>在<span lang="EN-US">PowerDesigner</span>中是创建一个复制的元素。此外，在同一个<span lang="EN-US">Diagram</span>中，同一元素的不同快捷图示，<span lang="EN-US">Rose</span>是表现为相同的名字，而<span lang="EN-US">PowerDesigner</span>则会添加数字后缀，以示区分。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">?<o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　属性窗口大小调整<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>的编辑属性窗口没有放大，缩小按钮，需要手工拖动鼠标调整大小，一直不明白为什么如此简单的功能，<span lang="EN-US">Rose</span>也要吝啬不提供。<span lang="EN-US">PowerDesinger</span>的属性窗口则没有这个限制。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image016_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="405" alt="clip_image016" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image016_thumb.jpg" width="346" border="0" v:shapes="_x0000_i1037"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 13</span>属性窗口<span lang="EN-US">(Rose)<o:p></o:p></span></span></p> <p style="line-height: 150%"><b style="mso-bidi-font-weight: normal"><span style="color: black; mso-bidi-font-family: arial">七、资源占用和运行稳定性<span lang="EN-US"><o:p></o:p></span></span></b></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>资源占用<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>在进行面向对象的设计时，由于要加载大量的类库，导致内存资源占用很大，往往达<?xml:namespace prefix = st1 /><st1:chmetcnv w:st="on" unitname="m" sourcevalue="300" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US">300M</span></st1:chmetcnv>以上，<span lang="EN-US">PowerDesinger</span>的资源的占用则小得多。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image017_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="430" alt="clip_image017" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/PowerDesignerRose_140B6/clip_image017_thumb.jpg" width="574" border="0" v:shapes="_x0000_i1038"></a><o:p></o:p></span></span></p> <p style="line-height: 150%; text-align: center" align="center"><span style="color: black; mso-bidi-font-family: arial">　　图<span lang="EN-US"> 14 </span>资源占用率<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">? </span>稳定性上<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">Rose</span>常有窗口<span lang="EN-US">“</span>抽筋<span lang="EN-US">”</span>的反应<span lang="EN-US">(</span>窗口变白，不接受任何响应<span lang="EN-US">)</span>，甚至毫无征兆地异常退出，容错性也不太好。如在逆向工程时，如果代码存在错误，甚至仅仅对一个存在错误的类进行逆向工程，窗口也会出现<span lang="EN-US">“</span>抽筋<span lang="EN-US">”</span>现象。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%"><span style="color: black; mso-bidi-font-family: arial">　　<span lang="EN-US">PowerDesigner</span>显得灵活快捷，很少出现窗口<span lang="EN-US">“</span>抽筋<span lang="EN-US">”</span>和意外退出的现象。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; color: black; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/77999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-03-26 23:02 <a href="http://www.cppblog.com/woaidongmao/archive/2009/03/26/77999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code::Blocks</title><link>http://www.cppblog.com/woaidongmao/archive/2009/03/17/76940.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 17 Mar 2009 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/03/17/76940.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/76940.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/03/17/76940.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/76940.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/76940.html</trackback:ping><description><![CDATA[<h4>介绍</h4>　　Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. <p>　　相比于基于Delphi的Dev-C++共享C++IDE，Code::Blocks是开放源码软件。Code::Blocks由纯粹的C++语言开发完成，它使用了蓍名的图形界面库wxWidgets(2.6.2　unicode)版。对于追求完美的C++程序员，再也不必忍受Eclipse的缓慢，再也不必忍受VS.NET的庞大和高昂的价格。 <p>　　虽然Code::Blocks从一开始就追求跨平台目标，但是最初的开发重点是Windows系统下的版本，从06年3月21日版本：1.0 revision 2220开始，Code::Blocks在它的每日构建中正式提供Linux版本（分两个版本：ubuntu.deb和fc4.rpm）。这样 Code::Blocks在1.0发布时就会是跨越平台的C/C++IDE，它将支持Windows和Linux的主要版本。长期以来C++开发员在Linux没有好用、通用的C++ IDE的局面就要结束。而这个IDE对于Windows下的用户同样重要，由于它开放源码的特点，Windows用户可以不依赖于VS.NET，编写跨平台C++应用。 <p>　　Code::Blocks提供了许多工程模板，这包括：控制台应用、DirectX应用、动态连接库、FLTK应用、GLFW应用、Irrlicht工程、OGRE应用、OpenGL应用、QT应用、SDCC应用、SDL应用、SmartWin应用、静态库、Win32 GUI应用、wxWidgets应用、wxSmith工程，另外它还支持用户自定义工程模板。在wxWidgets应用中选择UNICODE支持中文。 <p>　　Code::Blocks支持语法彩色醒目显示，支持代码完成（目前正在重新设计过程中）支持工程管理、项目构建、调试。 <p>　　Code::Blocks支持插件，目前的插件包括代码格式化工具AStyle；代码分析器；类向导；代码补全；代码统计；编译器选择；复制字符串到剪贴板；调试器；文件扩展处理器；Dev-C++ DevPak更新/安装器；DragScroll，源码导出器，帮助插件，键盘快捷键配置，插件向导；To-Do列表；wxSmith；；wxSmith MIME插件；wsSmith工程向导插件；WindowsXP外观。 <p>　　Code::Blocks具有灵活而强大的配置功能，除支持自身的工程文件、C/C++文件外，还支持AngelScript、批处理、CSS文件、D语言文件、Diff/Patch文件、Fortan77文件、GameMonkey脚本文件、Hitachi汇编文件、Lua文件、MASM汇编文件、Mathlab文件、NSIS开源安装程序文件、Ogre Compositor脚本文件、Ogre Material脚本文件、OpenGL Shading语言文件、Python文件、Windows资源文件、XBase文件、XML文件、nVidia cg文件。识别Dev-C++工程、MS VS 6.0-7.0工程文件，工作空间、解决方案文件。 <p>　　Code::Blocks基于wxWidgets开发，正体现了wxWidgets的强大。以前Borland C++ Builder X宣称基于wxWidgets开发跨平台、兼容性好、最优秀的C++ IDE环境，但没有实现；现在Code::Blocks+GNU GCC正在实现这个理想。让我们拭目以待。国内的Code::Blocks爱好者和跨平台开发员应该尽快建立中文Code::Blocks网站，提供Code::Blocks中文化支持，促进Code::Blocks在国内的发展。  <h4> <p>[<a href="http://baike.baidu.com/edit/id=1562377&amp;dl=2">编辑本段</a>] <p><a name="2"></a>安装</h4>　　2.1安装Code::Blocks发行版 8.02 <p>　　8.02版是必须安装的，然后才能升级。  <p>　　2.11 下载安装文件 <p>　　Code::Blocks的发行版版本号就是它的发行年月，所以8.02版，就是08年2月份发布的，其实地相当于1.0版。 <p>　　Code::Blocks网站：www.codeblocks.org 其下载页面（http://www.codeblocks.org/downloads/5）提供了windows,Linux(多个发行版)，及Mac OS X 的安装文件或源文件包。 不过我们暂时只讲Windows下的安装。所以您可以将下面的链接，复制到迅雷之类的工具下载。 <p>　　http://download.berlios.de/codeblocks/codeblocks-8.02mingw-setup.exe  <p>　　或者 http://download2.berlios.de/codeblocks/codeblocks-8.02mingw-setup.exe <p>　　2.12 卸载可能的mingw32先前版本 <p>　　Code::Blocks支持多种编译器，但我们主要讲Windows下的mingw32 g++编译器。因此需要安装mingw32。前面下载的安装程序已经自带有完整的mingw32环境。mingw32是g++环境在windows下的一个实现。为了避免版本与路径冲突，最好不要在一台机器上安装两个mingw32。所以本步要求检查一下。 <p>　　如果您以前有用过Dev C++之类也采用mingw32的IDE，那您最好先卸载了它们。如果您不懂什么叫mingw32,那估计你的机器就是没能安装过吧。那这一步跳过。 <p>　　2.13 开始安装  <p><a href="http://imgsrc.baidu.com/baike/pic/item/0d968f23f146515cad34de91.jpg"><img title="" src="http://imgsrc.baidu.com/baike/abpic/item/0d968f23f146515cad34de91.jpg"></a> <p>　　双击下载的文件，就可以开始完装了，主要就两个注意点： <p>　　第一、选择“Full/完整”安装，免得一些插件没有被安装上。 <p>　　第二、安装目录最好不要带有空格或汉字。 <p>　　这一点并不是Code::Blocks的限制，而是因为mingw32里的一些命令行工具，似乎对长目录或带空格的目录支持有点小问题，我估计汉字目录也会出问题，但没试过。一句话，就装在根目录下的X:\CodeBlocks即可。比如我是安装在E:\CodeBlocks下。 <p>　　2.2 升级Code::Blocks到最新svn版 <p>　　Code::Blocks是开源的软件，它们源代码管理采用subversion管理，因此它的编译版本就直接采用svn的版本了。 <p>　　code::blocks的网站看不去不怎么更新，其实程序的主要都在它的BBS（http://forums.codeblocks.org/）的nightly builds子论坛中更新。 <p>　　2.2.1 下载升级文件，并覆盖原有文件  <p>　　这里给出同样给出截至今天（北京时间2008年7月20日半夜3点）的最新升级包下载地址： <p>　　http://download.berlios.de/codeblocks/CB_20080719_rev5142_win32.7z <p>　　或者： http://download2.berlios.de/codeblocks/CB_20080719_rev5142_win32.7z。  <p>　　下载的是.7zip的文件，可以用WinRAR或开源7zip软件解压全部文件，覆盖原目录下的文件，比如，我需要把它们解压:E:\CodeBlocks\ 目录下。 <p>　　要持续跟踪最新版本，请关注本网站，或者直接到前述官方论坛查看。 <p>　　2.2.2 试运行 <p>　　双击桌面上的Code::Blocks启动图标——如果没有，那就到开始菜单里找找。启动时，能看到一个启动界面，右  <p><a href="http://imgsrc.baidu.com/baike/pic/item/6648d73dca6fcbdf9f3d629e.jpg"><img title="" src="http://imgsrc.baidu.com/baike/abpic/item/6648d73dca6fcbdf9f3d629e.jpg"></a> <p>下若有显示“svn 5142”,那就说明安装及升级成功了。 <p>　　当然，你也可以在启动完成后，像其他软件一样，到“Help”菜单下找“About”查看详细版本信息。 <p>　　现在Code::Blocks还是英文界面的，接下来我们谈谈如何安装它的语言包。 <p>　　2.3 使用本地语言包 <p>　　首先，请在 X:\CodeBlocks\share\CodeBlocks\ 建立一个子文件夹：locale，注意 locale 全为小写字母。 <p>　　我对简体汉字的语言包做了较大改进，不过仍然没改完，另外，一些插件在当前版本本来就无法汉化的，所以还有一部分内容是英语的。繁体部分我没有改动。  <p><a href="http://imgsrc.baidu.com/baike/pic/item/7d989310774ac919213f2e99.jpg"><img title="" src="http://imgsrc.baidu.com/baike/abpic/item/7d989310774ac919213f2e99.jpg"></a> <p>　　d2school版Code::Blocks语言包下载。 <p>　　下载后，请解压到前述的locale目录下，则locale目录下，应出现zh_CN和zh_TW两个子目录。 <p>　　重新启动Code::Blocks，点击主菜单的“Settings”，选择“Enviornment”。出现的对话框中，左边选中“View”，右边打勾“Internationalization (needs restart)”，并在后面的复合框中选中“Chinese (Simplified)”。确认退出本对话框。 <p>　　重启Code::Blocks。再看到的应该是中文简体界面了。 <p>　　2.4 基本配置 Code::Blocks <p>　　一款编程用的IDE，一定要不断根据自己的需要进行配置，才会变得好用起来。不过本文仅仅讲那些必选项。也就是如果没配置好，这个Code::Blocks就干不了活的选项。有关其它的选项，因为太多，我不可能现在就开始写，以后我会慢慢整理一些放在本站。需要的人，请多关注www.d2school.com。主要会是一些常用的快捷键等配置，给不熟悉的人带个头，最终还是靠自己去配置。 <p>　　2.41 配置g++编译器及调试器  <p><a href="http://imgsrc.baidu.com/baike/pic/item/e1bf87252997ac7835a80f64.jpg"><img title="" src="http://imgsrc.baidu.com/baike/abpic/item/e1bf87252997ac7835a80f64.jpg"></a> <p>　　请大家首先到 X:\CodeBlocks\MinGW\bin下，检查一下有没有以下文件： <p>　　mingw32-gcc.exe 这是C的编译器。 <p>　　mingw32-g++.exe 这是C＋＋的编译器，同是地DLL（动态库）的连接器。 <p>　　ar.exe 这是静态库的连接器。 <p>　　gdb.exe 这里调试器。 <p>　　windres.exe windows下资源文件编译器。 <p>　　mingw32-make.exe 制作程序。 <p>　　都没有问题，请点击c::b主菜单“设置”（汉化前的"Settings"），这次选中“编译器和调试器设置...”。，出现的对话框中，右边选中“全局编译器设置”，然后对照下图，检查左边配置是否正确无误： <p>　　现在我们就可以拿Code::Blocks来写课程里的很多C++代码了。 <p>　　对于Linux的使用者，由于GCC原生于Linux, 所以只需下载Code::Blocks网站的.tar.gz即可。Code::Blocks对Debian系提供了更好的支援。  <p><a href="http://imgsrc.baidu.com/baike/pic/item/b6045da9fc2ba3e21e17a209.jpg"><img title="Code::Bolcks在Linux下运行" src="http://imgsrc.baidu.com/baike/abpic/item/b6045da9fc2ba3e21e17a209.jpg"></a> <h5>Code::Bolcks在Linux下运行</h5><img src ="http://www.cppblog.com/woaidongmao/aggbug/76940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-03-17 23:02 <a href="http://www.cppblog.com/woaidongmao/archive/2009/03/17/76940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>visual studio 2008 试用版评估期已结束的解决方法</title><link>http://www.cppblog.com/woaidongmao/archive/2009/03/12/76306.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 12 Mar 2009 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/03/12/76306.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/76306.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/03/12/76306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/76306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/76306.html</trackback:ping><description><![CDATA[<p>启动visual studio 2008后显示对话框：visual studio的试用版评估期已结束。<br>下面有两个按钮，点第一个链接到微软网页，第二个直接关闭。虽然大多数高手已经知道如何解决，但对菜鸟来说还是有用的。 解决方法如下：
<p>VS2008中英文正式版序列号<br>1.Visual Studio 2008 Professional Edition:<br>XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT<br>2.Visual Studio 2008 Team Test Load Agent:<br>WPX3J-BXC3W-BPYWP-PJ8CM-F7M8T<br>3.Visual Studio 2008 Team System:<br>PYHYP-WXB3B-B2CCM-V9DX9-VDY8T<br>4.Visual Studio 2008 Team Foundation Server:<br>WPDW8-M962C-VJX9M-HQB4Q-JVTDM<br>-----------------------------------------------------------------<br>把90天试用版改为正式版，二种方法:<br>1. 把Setup\setup.sdb文件中的<br>&nbsp;&nbsp;&nbsp; [Product Key]<br>&nbsp;&nbsp;&nbsp; T2CRQGDKBVW7KJR8C6CKXMW3D<br>&nbsp; 改成<br>&nbsp;&nbsp;&nbsp; [Product Key]<br>&nbsp;&nbsp;&nbsp; PYHYPWXB3BB2CCMV9DX9VDY8T<br>2.安装完成后，在&#8220;控制面板&#8221;中启动&#8220;添加删除程序&#8221;,选中Vs2008，点击&#8220;更改、删除&#8221;，<br>输入序列号:<font color=#ff0000>PYHYP-WXB3B-B2CCM-V9DX9-VDY8T</font></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/76306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-03-12 10:43 <a href="http://www.cppblog.com/woaidongmao/archive/2009/03/12/76306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CrashFinder，找到崩溃代码行</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67288.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 19 Nov 2008 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67288.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/67288.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/19/67288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/67288.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/67288.html</trackback:ping><description><![CDATA[<p>1、CrashFinder需要PDB才可以工作；</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="535" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_thumb.png" width="772" border="0"></a> </p> <p>2、对于Release版本程序，需要设置产生program database 和generate debuginfo，才可以使用crash finder找到崩溃代码行,Debug版本是默认产生的；</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="457" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_thumb_1.png" width="681" border="0"></a> </p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="457" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_thumb_2.png" width="681" border="0"></a> </p> <p>3、Generate Debug Info的程序会比Don't Generate Debug Info的大20%左右，如下</p> <p>Generate Debug Info:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,503,297<br>Don't Generate Debug Info:&nbsp;&nbsp;&nbsp; 1,212,416<br>rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80.65%  <p>&nbsp; <p>4、在Generate Debug Info生成的exe最后，会有PDB的绝对目录位置；</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="263" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_thumb_3.png" width="688" border="0"></a> </p> <p>5、使用Crash Finder时，需要把对应的PDB放到绝对目录位置里面，才可以找得到调试信息；</p> <p>&nbsp;</p> <p>6、每次发布程序之后，要保留代码(.h, .cpp)，exe和对应的PDB，下面是一个组织形式。</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_10.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="79" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_thumb_4.png" width="515" border="0"></a>&nbsp;</p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="209" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/CrashFinder_D227/image_thumb_5.png" width="596" border="0"></a> </p> <p>&nbsp;</p> <p>&nbsp;</p> <p><font color="#0000ff">crash finder下载</font></p> <p><a title="http://www.cppblog.com/Files/woaidongmao/CrashFinder.rar" href="http://www.cppblog.com/Files/woaidongmao/CrashFinder.rar">http://www.cppblog.com/Files/woaidongmao/CrashFinder.rar</a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/67288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-19 15:13 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/19/67288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EmEditor 的搜索提取宏</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/02/65720.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 01 Nov 2008 18:49:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/02/65720.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/65720.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/02/65720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/65720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/65720.html</trackback:ping><description><![CDATA[<p>1、将最下文本保存为 EmCommnMarco.jsee；</p>
<p>&nbsp;</p>
<p>2、 宏-〉自定义-〉新建-〉选择 EmCommnMarco.jsee；</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_2.png"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=321 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_thumb.png" width=403 border=0></a></p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_4.png"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=342 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_thumb_1.png" width=432 border=0></a>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_6.png"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=342 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_thumb_2.png" width=432 border=0></a> </p>
<p>&nbsp;</p>
<p>3、宏-〉设置为当前宏</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_8.png"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=307 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_thumb_3.png" width=346 border=0></a> </p>
<p>&nbsp;</p>
<p>4、按下F4就运行宏了</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_10.png"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=467 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/EmEditor_264D/image_thumb_4.png" width=536 border=0></a> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>/** <br>* 根据输入的正则表达式，提取与之匹配的字符串，并新建一个文档显示所有匹配的字符串， <br>* 显示时每个匹配项占一行 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function getText() <br>{ <br>&nbsp;&nbsp;&nbsp; var _regex=prompt("本程序用来提取正则表达式匹配的字符串，请输入正则表达式",""); <br>&nbsp;&nbsp;&nbsp; if(_regex==""||_regex==null) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("输入为空，请重新输入"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; var regex=new RegExp(_regex,"gim"); <br>&nbsp;&nbsp;&nbsp; document.selection.SelectAll(); <br>&nbsp;&nbsp;&nbsp; var textInCurrentDocument=document.selection.Text; <br>&nbsp;&nbsp;&nbsp; var matchResultArray=textInCurrentDocument.match(regex); <br>&nbsp;&nbsp;&nbsp; if(matchResultArray) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var len=matchResultArray.length; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.NewFile(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;len;i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.writeln(matchResultArray[i]); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("没有找到匹配的字符串"); <br>&nbsp;&nbsp;&nbsp; } <br>}
<p>/** <br>* 拷贝正在编辑的文档的完整路径(含文件名和扩展名)到剪贴板 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function copyFullName() <br>{ <br>&nbsp;&nbsp;&nbsp; if(document.Saved) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.CopyFullName(); <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("请保存文件后再执行此命令"); <br>&nbsp;&nbsp;&nbsp; } <br>}
<p>/** <br>* 拷贝正在编辑的文档的路径(不含文件名和扩展名)到剪贴板 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function copyPath() <br>{ <br>&nbsp;&nbsp;&nbsp; if(document.Saved) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.CopyPath(); <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("请保存文件后再执行此命令"); <br>&nbsp;&nbsp;&nbsp; } <br>}
<p>/** <br>* 删除当前正在编辑文档的行首的所有空格(包含Tab键) <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function deleteLineStartBlank() <br>{ <br>&nbsp;&nbsp;&nbsp; document.selection.Replace("^\\s*","",eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>}
<p>/** <br>* 删除当前正在编辑文档的行尾的所有空格(包含Tab键) <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function deleteLineEndBlank() <br>{ <br>&nbsp;&nbsp;&nbsp; document.selection.Replace("\\s*$","",eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>}
<p>/** <br>* 为当前正在编辑文档的每一行的行首添加n个空格 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function addBlank2LineStart() <br>{ <br>&nbsp;&nbsp;&nbsp; var string_n=prompt("请问您要给行首添加几个空格呢？","1"); <br>&nbsp;&nbsp;&nbsp; if(isN(string_n)) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var s=""; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var int_n=parseInt(string_n); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;int_n;i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=" "; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+="\\0"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.selection.Replace("^.",s,eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.HighlightFind=false; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("您输入的不正确，请重新输入"); <br>&nbsp;&nbsp;&nbsp; } <br>}
<p>/** <br>* 为当前正在编辑文档的每一行的行尾添加n个空格 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function addBlank2LineEnd() <br>{ <br>&nbsp;&nbsp;&nbsp; var string_n=prompt("请问您要给行尾添加几个空格呢？","1"); <br>&nbsp;&nbsp;&nbsp; if(isN(string_n)) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var s=""; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+="\\0"; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var int_n=parseInt(string_n); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;int_n;i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=" "; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.selection.Replace(".$",s,eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.HighlightFind=false; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("您输入的不正确，请重新输入"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br>&nbsp;&nbsp;&nbsp; } <br>}
<p>/** <br>* 将当前正在编辑文档中的所有&gt;=两个的相连空格替换成一个，只支持英文半角空格 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function replace2MoreBlank() <br>{ <br>&nbsp;&nbsp;&nbsp; document.selection.Replace(" {2,}"," ",eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>}
<p>/** <br>* 将当前正在编辑文档中的所有&gt;=两个的相连空行替换成一个 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function replace2MoreNewLine() <br>{ <br>&nbsp;&nbsp;&nbsp; return; <br>}
<p>/** <br>* 为当前正在编辑文档中的所有行的行首添加特定的字符串 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function addString2LineStart() <br>{ <br>&nbsp;&nbsp;&nbsp; var s=prompt("请问您要在行首添加什么字符串呢？","在这里输入要添加的字符串"); <br>&nbsp;&nbsp;&nbsp; if(s==""||s==null) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; var t="\\0"; <br>&nbsp;&nbsp;&nbsp; document.selection.Replace("(^.)|(^\\n)",s+t,eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>&nbsp;&nbsp;&nbsp; document.HighlightFind=false; <br>}
<p>/** <br>* 为当前正在编辑文档中的所有行的行尾添加特定的字符串 <br>* <br>* @author Guapo <br>* @version v1.0 <br>*/ <br>function addString2LineEnd() <br>{ <br>&nbsp;&nbsp;&nbsp; var s=prompt("请问您要在行尾添加什么字符串呢？","在这里输入要添加的字符串"); <br>&nbsp;&nbsp;&nbsp; if(s==""||s==null) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; var t="\\0"; <br>&nbsp;&nbsp;&nbsp; document.selection.Replace("(.$)|(^\\n$)",t+s,eeFindNext | eeReplaceAll | eeFindReplaceRegExp); <br>&nbsp;&nbsp;&nbsp; document.HighlightFind=false; <br>}
<p>function isN(s) <br>{ <br>&nbsp;&nbsp;&nbsp; if(s==null||s=="") <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; var array=s.match(/\d+/); <br>&nbsp;&nbsp;&nbsp; if(array) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s==array[0]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br>&nbsp;&nbsp;&nbsp; } <br>}
<p>mainMenu=CreatePopupMenu();
<p>mainMenu.Add("拷贝路径(不含文件名)",1); <br>mainMenu.Add("拷贝完整路径(含文件名)",2); <br>mainMenu.Add( "", 0, eeMenuSeparator ); <br>mainMenu.Add("利用正则表达式提取字符串",3); <br>mainMenu.Add( "", 0, eeMenuSeparator ); <br>mainMenu.Add("删除行首所有空格",4); <br>mainMenu.Add("删除行尾所有空格",5); <br>mainMenu.Add("行首添加n个空格",6); <br>mainMenu.Add("行尾添加n个空格",7); <br>mainMenu.Add( "", 0, eeMenuSeparator ); <br>mainMenu.Add("将&gt;=两个的相连空格替换成一个",8); <br>mainMenu.Add("将&gt;=两个的相连空行替换成一行",9); <br>mainMenu.Add( "", 0, eeMenuSeparator ); <br>mainMenu.Add("在行首添加特定的字符串",10); <br>mainMenu.Add("在行尾添加特定的字符串",11); <br>mainMenu.Add( "", 0, eeMenuSeparator ); <br>mainMenu.Add("关于",100); <br>var witchItem=mainMenu.Track();
<p>switch(witchItem) <br>{ <br>&nbsp;&nbsp;&nbsp; case 1: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copyPath(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 2: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copyFullName() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 3: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getText(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 4: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteLineStartBlank(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 5: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteLineEndBlank(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 6: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addBlank2LineStart(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 7: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addBlank2LineEnd(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 8: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replace2MoreBlank(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 9: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replace2MoreNewLine(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 10: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addString2LineStart(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 11: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addString2LineEnd(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; case 100: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("Author:Guapo\nEmail:yangshuai@gmail.com"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; default: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>}</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/65720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-02 02:49 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/02/65720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Live Writer写博客，体验一下</title><link>http://www.cppblog.com/woaidongmao/archive/2008/04/15/47166.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 15 Apr 2008 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/04/15/47166.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/47166.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/04/15/47166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/47166.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/47166.html</trackback:ping><description><![CDATA[<p>似乎还不错，发上去看看。效果好象还可以，比在网上写爽多了。本文由Woindows Live Write 撰写。</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WindowsLiveWriter_1421A/image_2.png"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=447 alt=image src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WindowsLiveWriter_1421A/image_thumb.png" width=732 border=0></a></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/47166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-04-15 22:54 <a href="http://www.cppblog.com/woaidongmao/archive/2008/04/15/47166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>