<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fruanqizhen.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>LabVIEW</title><description>Q^Q 是我的眼镜</description><link>http://ruanqizhen.spaces.live.com/</link><language>en-US</language><pubDate>Wed, 23 Jul 2008 13:45:10 GMT</pubDate><lastBuildDate>Wed, 23 Jul 2008 13:45:10 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>6364383383296229302</live:id><live:alias>ruanqizhen</live:alias></live:identity><image><title>LabVIEW</title><url>http://byfiles.storage.live.com/y1pR4v5pECW0IKVo1Vdc-0YF0j6LEikw2S0E-AzSb0GBtk04TGSKVa-rw</url><link>http://ruanqizhen.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>如何学习 LabVIEW</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3397.entry</link><description>&lt;p&gt;    根据我自己的观察，学习LabVIEW一般有以下三种方式：系统型学习方法、探索型学习方法和目标驱动型学习方法。这三种方法之间并不矛盾，可以在不同的时段使用不同的方法。每个人可以根据自己的个性特点和所处环境选择一个适合自己的学习方案。 &lt;p&gt;    系统型学习方案是传统的学习方法，学生学习多是按此方法。它是指按照别人制定好的学习方案一步一步学习掌握一门知识。学习效果如何，主要取决于教师和教材的水平。若选此方案学习LabVIEW，最高效的方法莫过于参加NI公司的LabVIEW培训课程。基本上，完全没接触过LabVIEW的学员可以在一星期的时间内达到编写简单程序的程度。此外，现在很多大学都开有LabVIEW课程，方便了在校生学习。&lt;br&gt;    自学也可以采用此方案。找一本教程类的书籍，按照书中指导一步一步学习。教程类的书籍应当侧重于解释LabVIEW的编程思想以及原理；有些书仅偏重于罗列LabVIEW中每个函数或VI的功能，则不适合用于此种学习方案。 &lt;p&gt;    探索型学习方法适合喜好自己钻研的人。同样一个技巧，如果是自己发现的，比从他人那里的来会更有成就感。任何一个教程都不可能覆盖到LabVIEW的全部功能，有心得学员不妨自己打开书中未曾介绍到的那些菜单或者函数选板，尝试一下它们都是做什么用的。在真正动手摆弄每个新东西之前，打开LabVIEW的即时帮助窗口，阅读一下相关说明可以大大加快学习过程。&lt;br&gt;    比如，打开“应用程序控制”函数选板，发现这里有一项“选板编辑”。好像没有任何一本书里介绍过这个功能嘛，这是干啥用的呢？如果没任何提示，也是无从下手去尝试的。打开LabVIEW的及时帮助，可以看到它对这个功能的简单介绍。进入“详细帮助信息”，会得到更全面的说明。再自己动手实践一下，就基本可以掌握此功能了。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pVMgs8msqIq1oWXEguCP-H2svrsrLrk742A-y0Z_-4Qkqx858AQyMk1A1E56KYnwF?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=206 alt=image src="http://byfiles.storage.msn.com/y1pNnEfKP1JXzkLqHxU0ibJ15gWHyRCHDHpAGRlEE_wwYjmXI865luqHtk9htXhOHDW?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p align=left&gt;    阅读他人代码也是一个很好的学习方法。自己的探索总是有思维局限性的，他人解决问题的方法可以大大拓宽自己思路。我介绍过的编程经验中，很大一部分都不是我自己凭空想出来的，而是借鉴与别人的LabVIEW代码。 &lt;p&gt;    目标驱动型学习方法是公司员工中最常见的学习方式了。工作后，如果不是个人有兴趣，多数人不会浪费时间去学习工作中用不到的知识。等老板布置了具体项目或者工作任务后再学习相关知识，效率更高。学也只要够解决眼前问题就行了。针对这种情况，请教身边牛人或者公司前辈是最好的学习方法。如果周围的人不能解决问题，到论坛上发贴，寻求更广泛的帮助。&lt;br&gt;    推荐一个论坛。首先是&lt;a href="http://forums.ni.com/ni/board?board.id=2170"&gt;NI的官方论坛&lt;/a&gt;，这里会有NI的技术支持和研发工程师来回答问题。如果英文够好，最好是到它的英文版面去提问，英文讨论区人气更旺，容易找到答案。&lt;a href="http://forums.lavag.org/index.php?act=idx"&gt;LAVA&lt;/a&gt; 是官方之外最大的LabVIEW社区，也是寻求帮助的好地方。如果平时用Windows Live Messenger，可以加入 &lt;a href="mailto:msngroup7773@hotmail.com"&gt;msngroup7773@hotmail.com&lt;/a&gt;，这是个msn讨论LabVIEW 的群。在它上面讨论问题最大的好处是可以及时得到回应。&lt;br&gt;    我见过几个工程师在项目中遇到了难题，于是来报名参加LabVIEW的培训课程，以为上完课可以解决自己的问题。但实际上完全误解了培训课程的意义，培训课程是为了帮助那些想要系统学习LabVIEW知识的人，而不专注于任何一个具体问题。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%a6%82%e4%bd%95%e5%ad%a6%e4%b9%a0+LabVIEW&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3397.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3397.entry</guid><pubDate>Sun, 20 Jul 2008 10:31:44 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3397/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3397.entry#comment</wfw:comment><dcterms:modified>2008-07-20T10:31:44Z</dcterms:modified></item><item><title>开发 XControl 2 - 创建</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3391.entry</link><description>&lt;p&gt;    在项目浏览器上，点击鼠标右键，选择“新建-&amp;gt;XControl”，就可以创建一个新的XControl。 &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pgonn4ERzroWjqeGbnYShgcr5c8SL11jPS2IwcID4vSIYy4WkfT_WYGBv1lPZD7QX?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pyjVe9BuNpJVAbpAFXWjp3lF9grbWSOnAB2IuQUg95B0chtGOGhQfUjlJCLfQcWxf?PARTNER=WRITER" width=241 border=0&gt;&lt;/a&gt;  &lt;p&gt;    XControl 在结构上是一种特殊的库，他包含一些特定的更能VI，和一些可选的属性、方法VI及其它相关文件。在新建的 XControl 上已经包含了4个必须的功能VI（控件）：数据、状态、外观、初始化。XControl 还有两个可选的功能VI：反初始化和转换状态以保存。&lt;br&gt;    简要介绍这几个功能VI的功能是：&lt;br&gt;    数据：用来定义XControl的数据类型。&lt;br&gt;    状态：定义所有XControl内部使用到的数据。&lt;br&gt;    外观：这是XControl中最主要的功能VI，用以实现XControl的界面和界面上的行为。&lt;br&gt;    初始化：设置XControl的初始状态。&lt;br&gt;    反初始化：负责清理工作。&lt;br&gt;    转换状态以保存：用于把XControl内部的某些数据保存在使用它的VI中。 &lt;p&gt;    下面对XControl做一些基础的设置，比如修改它的图标、版本号等，然后保存。&lt;br&gt;    XControl功能VI的文件名并不一定与其功能名相同。比如，为了方便更多人使用，我使用了英文名称来保存我的XControl： &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pg8LNx_a8wSN9TeVLdl2ujiY3wnkiiVAIF58gSEhvKX-cR7mFwYUS96ThKy8OTEcT?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=215 alt=image src="http://byfiles.storage.msn.com/y1pEkezIhPI_SRwtAsD5UWio8u4vVBi8c-vIT75EcxbR4b_mXJ7svyRqQbf5B_eflQ4?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%bc%80%e5%8f%91+XControl+2+-+%e5%88%9b%e5%bb%ba&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3391.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3391.entry</guid><pubDate>Wed, 16 Jul 2008 12:51:34 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3391/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3391.entry#comment</wfw:comment><dcterms:modified>2008-07-16T13:02:04Z</dcterms:modified></item><item><title>开发 XControl 1 - 设计</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3382.entry</link><description>&lt;p&gt;    XControl 是 LabVIEW 8 开始出现的一个制作 LabVIEW 控件的工具。与之前的用户自定义控件相比，用户自定义控件只能定义控件的界面，而 XControl 还允许通过编写代码来定义控件的行为。因此 XControl 功能更加强大。&lt;br&gt;    XControl 的主要优点是可以把界面元素与相关的代码封装在一起，从而方便发布和重用这些界面组件。&lt;br&gt;    XControl 也有比用户自定义控件不足的地方，它开发起来更加困难；设计不合理的XControl会导致程序更加严重的问题。 &lt;p&gt;    需要开发一个新的控件之前，首先要考虑一下以何种方式实现这个控件。&lt;br&gt;    如果这个控件极为特殊，只会用在某个特定的程序中，那么也许没有必要将其作为单独的控件；&lt;br&gt;    如果这个控件需要被多次使用，那么就应该考虑把它做成可重用的独立控件。这个控件也许不包含任何特殊行为，比如一个用于表示坐标位置的控件由两个数值控件组成，程序只是使用它的值就可以了；或者一个新型按钮，进外观与旧按钮不同，其它行为都与传统的按钮一模一样。这样的控件适合使用用户自定义控件来制作。&lt;br&gt;    如果新的控件需要重用，行为与已有其它控件又有较大差别，那么就要考虑XControl了。比如：制作一个新按钮，但它比传统按钮多一个状态；或者它的界面带有动画效果；制作数值类控件但是用中国本土度量单位；基于图片控件，专用于绘制某种特殊曲线等。 &lt;p&gt;    我们前面提到的&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3315.entry"&gt;黑白棋的控件&lt;/a&gt;，既有特殊界面，又有特殊行为，又可以应用于不同软件中，非常适合做成XControl。我们先来具体设计一下这个XControl所需的界面和行为。&lt;br&gt;    它的界面部分前面已经设计好了，直接拿来用就可以了。不过在前文提到的几个设计方案中，我个人觉得 Pict Ring 数组控件的那个解决方案，最能简化编程代码，所以我们采用这个界面方案。&lt;br&gt;    XControl 在应在程序框图上的端点的输入输出数据应该是应用程序最经常需要与XControl交互的数据。本例中，应用程序最常使用的数据就是棋盘的布局信息。因此，这个XControl的数据应当是一个8×8的整型数组，表示棋盘上棋子的布局。&lt;br&gt;    黑白棋控件的属性应当包括：当前该下什么颜色的子、可落子的位置、盘面上每种颜色的子数、上次落子的位置。&lt;br&gt;    它的方法有：落下一子（这个方法需要包含以下具体的操作：在新位置放置一个棋子；翻转被吃掉的棋子；更新数据和所有属性的值）。&lt;br&gt;    它还要在当用户在交互界面上摆下一子之后，发个事件通知应用程序。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%bc%80%e5%8f%91+XControl+1+-+%e8%ae%be%e8%ae%a1&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3382.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3382.entry</guid><pubDate>Tue, 15 Jul 2008 13:20:06 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3382/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3382.entry#comment</wfw:comment><dcterms:modified>2008-07-15T13:20:06Z</dcterms:modified></item><item><title>界面编程技巧 5 - 使用绘图控件</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3379.entry</link><description>&lt;p&gt;    有时候需要画一个比较复杂图形或曲线，而 LabVIEW 没有提供相应的控件。可以借用 LabVIEW 已有的基本功能的控件，配上一些代码，实现一个具有特定功能的控件。&lt;br&gt;    常被用来做这种基本控件有 XY Graph、3D Picture Control、Picture 控件等。&lt;br&gt;    例如需要做一个绘制极坐标函数曲线的控件，就可以在 XY Graph 的基础上改造。一共一个转换用的VI，把点的极坐标转换成直角坐标系下的值，在 XY Graph 上绘制出来就可以了。需要某个支持某种特定三维绘图方式的控件，可以通过改造 3D Picture Control 得到。&lt;br&gt;    Picture 控件是个更为基础的控件，很多具有特殊效果的界面元素都可以利用 Picture 控件制作。比如，需要制作带图标的菜单，或类似LabVIEW函数选板的菜单等。LabVIEW没有为它们提供现成的控件，就可以在Picture控件上自己把这些效果都画出来。我们前面介绍的棋盘棋子界面也可以使用Picture控件来制作。 &lt;p&gt;    下面介绍一下实现这个界面的具体过程。&lt;br&gt;    第一步，创建一个空白的Picture控件，针对Picture控件的常用操作都在Picture Functions 函数选板中。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pH0VcgIb1sWGLu59K1DUk_nNSTIcx57nufIMMnPymPqIYzdLqG-U_KNCpbMoKXerh?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=197 alt=image src="http://byfiles.storage.msn.com/y1pPji0PSq_6A109-e6Bzo6Yj527lmkk1vbZOTOyyCCmZNpB8hJ_EbPj5kFDr5P6KjU?PARTNER=WRITER" width=179 border=0&gt;&lt;/a&gt;  &lt;a href="http://byfiles.storage.msn.com/y1pOkWbdEW_TzSp-ZjtqVKskxJ434YIb_HoVOjnYamt-GZTW7oo9u8YqYZzVv8XFNOS?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=196 alt=image src="http://byfiles.storage.msn.com/y1pG8ysR5SUJEVsmPw-dUOI3AEYEw7LRhD0nFP_-DkltnShhIEftfYtmpl8-88lHKba?PARTNER=WRITER" width=269 border=0&gt;&lt;/a&gt;  &lt;p&gt;    与前面介绍的方法不同，使用Picture控件制作棋盘棋子的过程，不是在VI编辑状态下进行的，而是需要在程序运行时绘制。所以下面的界面设计工作都要通过编程来完成了。先介绍一下Picture控件的Erase First属性，它有3个值：0表示从不擦除，也就是说每次传一个数据给这个控件，比如一个圆环图案，Picture上显示的并非只有这个圆环，而是把圆环叠加在原本的内容之上。如果我想画一个有三个矩形组成的图案，可以分三次画，每一次传递一个矩形图案给Picture控件；2表示每次都擦除，每次传递一个图案给Picture控件，它都会将原来的图案擦掉，仅保留这一次的图形。擦除图案后Picture控件会显示默认的白色。所以，使用这种方式，用户在切换图案时会看到Picture闪烁一下。若非必要，尽量不要使用这种方式；1表示程序第一次运行时把Picture上的内容清除，等于自动帮你做了初始化工作，我们这里也使用这种方式。&lt;br&gt;    就是说，棋盘布局发生变化时，进更新发生了变动的位置。不要重绘整幅图。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1px7cp1hUTP_3K2H8P1aMHO73vvxQWXXHoj_KUi_dsAv1Bbnj48co7ZVCDZ9UkBV7m?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=120 alt=image src="http://byfiles.storage.msn.com/y1pD_AYVhfoLZATIsVfRxf8_Qc_L0PBgmUcXAxIIZdiwxQ0QTGeOVUSjengcuzQcu0h?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;    棋盘再棋子下层，所以要先画棋盘。画棋盘可以使用LabVIEW提供的划线函数，一条线一条线画出来。因为我们之前已经制作了棋盘的图片，所以可以直接把这张图片显示出来。代码如下： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pTWFXGphojoBpF5XwE4R5_ViwztiULGxRUQJe0wBv8X9y_zDXpEP2QPWjkK6dzvpZ?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=242 alt=image src="http://byfiles.storage.msn.com/y1pYnRB_L-J_bMxRR-3g89zc91LStn6-oiLzQSGPd8_cy7PjhsxK4Or2MwAuDJ-_fef?PARTNER=WRITER" width=406 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pV8fsNTXm9U9GKJnTbgVgQLB9OMl_8sMzm-ccPwAanNvKBbUJrfjGkCc83SPyFgtQ?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pGdlNY2UJDlE01NrB_bCzHztHuwXsg8dmqIBDk5u57Q_8GUimuB1VfnHt341YGDur?PARTNER=WRITER" width=230 border=0&gt;&lt;/a&gt;  &lt;p&gt;    下面再画上棋盘初始时的四个棋子。画棋子的方法与棋盘相同，可以使用画圆函数，已可以使用已经制作好的图片： &lt;p align=center&gt;&lt;a href="http://q0by9q.bay.livefilestore.com/y1p4sMIf-gp3tiMWtBuZB5ucCxyn4K1VOB_ESjuvuCYgnfDEBHKm8NNjz3p0evsF4Ixzc5tjCVfS4k?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=243 alt=image src="http://byfiles.storage.msn.com/y1pxBi3i7gtx8QGbrl9s6dXbD09othUwkZGY9QBA9pm4UqnOG6tpU0PlmeyRjEgjOoD?PARTNER=WRITER" width=478 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pllo8DK1Nt54r8JYA8u5bNshpUfAN0TD3N2BuE5qCjmTcMt15NNwRwV8NDn1GMUj3?PARTNER=WRITER"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pu0LqRPTHVPm8Gm9n--fQQqhVT6qXIV0f2iHUX1vH6hwbCD4LRI4wK2scEbfQ_nee?PARTNER=WRITER" width=230 border=0&gt;&lt;/a&gt;  &lt;p&gt;    到目前为止，界面设计的几种方法就已经介绍好了。如果能够把这个黑白棋的相关界面和操作（比如放置棋子，反转棋子等）提取出来，合成一个组件，公布出来，其他有类似需求的人就可以直接利用这个组件，不再需要自己重新设计了。&lt;br&gt;    然而，在 LabVIEW 8 之前是无法实现这一功能呢，因为控制棋子行为的代码分散在程序的各处，而棋盘棋子也是主VI的一部分，很难将它们提取出来组成独立模块。LabVIEW 8 中出现的 XControl 可以把控件的界面及行为封装在一起，成为一个既有界面，又有运行代码一个组件。 &lt;p&gt;    下面我就会重启一个先话题，讨论如何把这个黑白棋做成一个可以独立发布的组件。 &lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%95%8c%e9%9d%a2%e7%bc%96%e7%a8%8b%e6%8a%80%e5%b7%a7+5+-+%e4%bd%bf%e7%94%a8%e7%bb%98%e5%9b%be%e6%8e%a7%e4%bb%b6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3379.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3379.entry</guid><pubDate>Mon, 14 Jul 2008 13:59:38 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3379/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3379.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:01:28Z</dcterms:modified></item><item><title>在 Google Lively 上建了一个房间</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3362.entry</link><description>&lt;p&gt;欢迎大伙来我的房间做客啊:  (点击下面我房间的图片) &lt;p&gt;&lt;a href="http://www.lively.com/dr?rid=5435005350657804050"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=306 alt=image src="http://byfiles.storage.msn.com/y1pJFYPcr41lwFC3MN-Mm9IKJudgGlqUrHlIpaw88fnZyoK30RyIGBk8OlDP_af8GAh?PARTNER=WRITER" width=455 border=0&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%9c%a8+Google+Lively+%e4%b8%8a%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa%e6%88%bf%e9%97%b4&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3362.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3362.entry</guid><pubDate>Mon, 14 Jul 2008 01:30:48 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3362/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3362.entry#comment</wfw:comment><dcterms:modified>2008-07-14T01:40:10Z</dcterms:modified></item><item><title>界面设计技巧 4 - 改进界面实现方法</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3358.entry</link><description>&lt;p&gt;    到目前为止，棋盘棋子的界面已经基本成型。下面我们实现一小部分代码，来看看这个界面设计方案是否可行，是否可以改进。&lt;br&gt;    以棋盘的初始化为例，在游戏开始时，只有两黑两白四颗子，摆在期盼最中间。实现这个操作的代码和执行结果如下图所示： &lt;p&gt;&lt;a href="http://q0by9q.bay.livefilestore.com/y1poM3IxbZoTBYqK51py-_OkW7CF0gat6QniVgKL5pCyrvILODiMC5ZJ6HZuHwbdaYyNzFuVosYC6w?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=217 alt=image src="http://byfiles.storage.msn.com/y1pJfA214C_s3EIcwofVvEAo0ddiVUcF1Q8jqbi4L-UhW4ldPdhqq-3huR6AhogBqkEZiyKZfNR7wE?PARTNER=WRITER" width=405 border=0&gt;&lt;/a&gt;   &lt;a href="http://byfiles.storage.msn.com/y1p904tWVEY_j4IgvbWA2xrYXlb8t8NSQzHOAomEtNENuVpfW8A8IQXjZJ74dDrrCwAeZB8LN6S3Io?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=216 alt=image src="http://byfiles.storage.msn.com/y1ppNkWhdyhSFU2IzR6a5xhW_CqiXQi9PbqwHgQFn2vJimXRyMDiw6oQVxYKAUvvqkHpO7Oou7Wjd4?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;    代码中的子VI（Get All Chess.vi）中的代码，就是我们在第一节图8中看到的那段代码。它负责得到所有棋子的引用，并排列成二维数组。 &lt;p&gt;    这段初始化的代码并不算复杂，但是我们还是可以从中看出一些问题：棋子的布局需要用两个数组才可表达清楚，这给编程增加了负担。造成这一状况的根本原因在于：每个位置上的棋子实际上有三个状态：黑、白、无；而我们选用的灯泡控件，只有两个值：真、假。用这两个值不足以完全表达棋子的状态，所以，要两个布尔类型才能确定一个棋子的状态。&lt;br&gt;    另外，棋盘只是一张背景图片，这样，判断鼠标在棋盘哪个位置上进行的点击，也比较繁琐。一旦棋盘挪动，代码也需要做相应改动。&lt;br&gt;    改进的方法，就是使用一个有更多值的控件来表示棋子。在我们的程序中，要求每个棋子位置有多个不同图片，这正好可以使用 Pict Ring  控件。Pict Ring 控件包含三个值：空白图片、黑色棋子图片、白色棋子图片。这样即便是没有棋子的位置，Pict Ring 控件还在，可以感知用户的鼠标点击事件。 &lt;p&gt;    上面的代码还有一处不足，每个棋子都是一个独立的控件，造成界面控件太多，不好管理。对于更复杂的程序，比如围棋游戏，如果使用这种方式，界面上就有将近400个控件，这是不可接受的。&lt;br&gt;    改进的方法是使用数组控件，把所有的棋子组成一个数组。 &lt;p&gt;    具体的实现步骤如下：&lt;br&gt;    首先创建一个经典风格的 Pict Ring 控件，添加三幅图片：空白、黑棋子和白棋子。棋子采用的都是png文件格式的图片，以实现透明和阴影效果。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pRyLL9fgf2p7vvTC6Dvv6EcVRH-1OkU2HpnB08tczv5Zm_3znV6d9tNNMjARvyzmZuYUOzznJSYA?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=231 alt=image src="http://byfiles.storage.msn.com/y1pKNO09aNm5dcpbdXKrEqddVfkhSdSe_9lInoG8OYr_9o4UXAj5PCaP4z73aXkUILelSJx41HHjmg?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;在程序中，我们不希望看见 Pict Ring 控件的边框和背景。我们可以用透明画笔，把边框和背景画为透明。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pjmdbLVe5vBiODHKIGPskxl7Szrygv5auXSJlK6FGJu94HR9_kAlqAZGhHt1FYuqgDzpENlCpVsc?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=231 alt=image src="http://byfiles.storage.msn.com/y1p1Gw9NJi8kozXPDDyOL7wXlcUaFe0TtfZwgRuCPhSZiwo1g11G3uivKsxchrBFDzmxCt2jLaiCSs?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;    造一个二维数组用来放置棋子元素。由于界面上不希望看到这个数组的边框和背景，所以同样用透明画笔把它们画为透明。数组的标签、索引显示可以通过数组的右键菜单-&amp;gt;显示一项进行隐藏。&lt;br&gt;    把棋子元素放置于数组中，并把数组拉成8×8大小，放置在棋盘上放。一个棋盘棋子控件就做好了。而这种做法又大大简化了编码的复杂度，比如同样是初始化设置，只要一个赋值语句就可完成： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pJjykgy-SMk3CprwK1FfGrSpNcSUZxmjDUitKOk_LEFv_tuK-achKN5YospCpO2wS-pkK6a-Vdrc?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1p1sWoBFvgPgQn7CgolhatdnFmZSL6ZTXTsfU_FxJN5zC4rDF1_CRW-OEWCQ2YFKxUUhk3guVbpv4?PARTNER=WRITER" width=227 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pS6ciadclCcw7_w_VSpFGvybiii7U3lTQpWjUOVkHQG892jn6bMswibCKDR0JSYwjuTBO2m--xag?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=240 alt=image src="http://byfiles.storage.msn.com/y1phwbp8FnLMArj2_mK_LXkR8xgBQWqfGj4BwkKMQUMOqtSb_BJnAmHhYnQfz6f8gRIHO2RdxcUj14?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%95%8c%e9%9d%a2%e8%ae%be%e8%ae%a1%e6%8a%80%e5%b7%a7+4+-+%e6%94%b9%e8%bf%9b%e7%95%8c%e9%9d%a2%e5%ae%9e%e7%8e%b0%e6%96%b9%e6%b3%95&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3358.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3358.entry</guid><pubDate>Sun, 13 Jul 2008 03:17:53 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3358/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3358.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:04:51Z</dcterms:modified></item><item><title>界面设计技巧 3 - 用户自定义控件</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3343.entry</link><description>&lt;p&gt;    现在棋盘已经很漂亮了，相对来说，棋子似乎残留了比较多的LabVIEW控件的痕迹，与我们要编写的游戏程序风格不符。我们可以利用&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1825.entry"&gt;用户自定义控件&lt;/a&gt;来造出更漂亮的棋子。 &lt;p&gt;    制作自定义控件，可以从一个全新的ctl文件开始，也可以在某个已有的控件基础上进行修改。比如这里我们想把棋子周围一圈光效移走，右键点击一颗棋子，选择 Advanced-&amp;gt;Customized，弹出控件编辑界面。按工具栏上扳手一样的按钮，切换到自定义模式，即可修改控件上的元素。这个控件有三个元素：标签、灯泡的主体部分、和边框。选中最外面那个白色的框，即边框，删除即可。编辑完成保存，新的棋子就不再有边框了。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1plVIwJd8zRHybETN9mhC1VcDN9HPt0_iokEC0rqXI6aenx0eOQz0iKzvlvbEryve_?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=201 alt=image src="http://byfiles.storage.msn.com/y1proan66XzAtM_OrPt3FcSxWl7Ii81nf6kp9OxJLozOGW09S_A1Vl8nSdY0QxxpECL?PARTNER=WRITER" width=162 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pmB-jhOnc8Gv5NnR8V7YuXPcFGdGVIKSObX84Xn5HntLcVwtmC2tCO3YWRPBQpPKl?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=179 alt=image src="http://byfiles.storage.msn.com/y1pnDk2oL4kbyNcSDJkugnPU0a3Mdza74cNBoNWQSfSfQC_qsycw1uhw5LnOZMo7y7T?PARTNER=WRITER" width=174 border=0&gt;&lt;/a&gt;  &lt;p&gt;    自定义控件也可以贴图，布尔型控件，比如按钮一般有4个状态，可以贴上4张不同的图片，做成复杂形状的按钮。下图就是通过贴图做成的一个有阴影效果的棋子按钮。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pLdsDD11Yb5Smeckw2ZNp4BJf8AZjZJwATdDU00Xk3D14Wq1K9ks8uoSUtSoI2m8J?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=190 alt=image src="http://byfiles.storage.msn.com/y1pGMLkCn6UP7x0FDmeqZ-rKkQEU_HLWqHeSja4hRb7rscuHbypkBP2s7z_gX4kGVzO?PARTNER=WRITER" width=142 border=0&gt;&lt;/a&gt;  &lt;p&gt;    最好所有的控件都使用严格类型定义，这样以后再需要改变界面的时候，只要在类型定义ctl文件中改动，所有的棋子就都会改变。 &lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%95%8c%e9%9d%a2%e8%ae%be%e8%ae%a1%e6%8a%80%e5%b7%a7+3+-+%e7%94%a8%e6%88%b7%e8%87%aa%e5%ae%9a%e4%b9%89%e6%8e%a7%e4%bb%b6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3343.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3343.entry</guid><pubDate>Sat, 12 Jul 2008 13:47:50 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3343/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3343.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:04:12Z</dcterms:modified></item><item><title>界面设计技巧 2 - 装饰和背景图片</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3334.entry</link><description>&lt;p&gt;    现在棋子都已经摆放到位了，下面考虑如何把棋盘加上去。由于棋盘是静态不动的，所以设计起来要比棋子简单。LabVIEW 自带了这种形状的装饰组件，比如线条、方块之类的，利用这些装饰图案，很容易搭出一个棋盘来。如下图，就是由几根被画成黑色的线条搭出来的部分棋盘。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1ppkUx29OTMBm329BRM0aWyZP-of5ae_1MF4bpOyza8WbsdDkLWj60IbGTtmfEHKhB?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pNIC4p0_aO_pQIY1j3sRkDX22RS-PtoyO9sWp4TZyun1zjsbP47ilcmfqQxec8o6T?PARTNER=WRITER" width=222 border=0&gt;&lt;/a&gt;   &lt;a href="http://byfiles.storage.msn.com/y1pZLY2K6QN3YXP1-0Y0ioCURHNReskXEZzau540JDbjreQtm26l5PLNNfa1nffVRGT?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pos8gBw0I3VWChbnMRCJ3TvnTOYmhOFXM85fOj0jc1lkriz-EQORds7jZB-NEoKa7?PARTNER=WRITER" width=229 border=0&gt;&lt;/a&gt;  &lt;p align=left&gt;    在编写程序界面时，装饰最常被用来将一组相关联的控件包围起来，或把不相关的控件个离开。 &lt;p&gt;    不过呢，用LabVIEW自带的简单图形拼出来的棋盘始终是不够漂亮。我们可以先用专业的画图工具，比如画图板（也不怎么专业吗）画一个漂亮的棋盘，保存成图片文件。然后把图片贴到VI的前面板，当作背景图片。这样，就可以得到一个漂亮的多的棋盘了。&lt;br&gt;    贴图这个操作，可以用Ctrl+C，Ctrl+V，也可以直接在文件浏览器中，用鼠标把图片文件拖拽到VI前面板。&lt;br&gt;    拖拽到VI上的图片，是处在界面最上层的，覆盖住了棋子。利用Reorder工具中的“Move to Back”，把它挪到最下层。在调整好棋子和棋盘的位置，整个一个棋子棋盘界面就做好了。如下图： &lt;p align=center&gt; &lt;a href="http://byfiles.storage.msn.com/y1pjwUon7G0AnTB-ijaL33PNL6cCI7V0CjXwFzEwMkQ4xKr9Q0GRYBT8vjjlJ5QFX9b?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1p1fkATlNw6rNhBv236qNaFrUOxITfiEf33XHiY78w0Fv7UbYA7HVnkL-8s45n3x53?PARTNER=WRITER" width=236 border=0&gt;&lt;/a&gt;  &lt;p&gt;    棋盘棋子都摆好之后，它们的相对位置应该固定下来。如果需要它在界面上挪动，应该是所有的棋子和棋盘一起动。先用鼠标把棋盘和全部棋子选中，再在Reorder工具中，选择group就可以把它们设定为一组。之后他们之间的相对位置就固定下来了。 &lt;p&gt;    咱们刚刚贴上来的图片是个矩形的，可是有时候，需要背景图片是不规则形状的。这种情况下需要使用支持透明色的图片格式，比如gif格式，把不规则图片空白部分设为透明即可。还有一种常用的文件格式png格式，支持像素点透明度的设置，利用不同的透明度设置还可以给背景图片做出阴影等效果。例如下图VI界面中两个带粉色的带阴影效果的解说框，使用的就是png文件格式的图片。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pbbeESswAuTJ1Y9NpviBxzCGGpBwB4SWhr1E1bC6D3TNv3TJdWTDBk3fcf8WL-9oM?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=177 alt=image src="http://byfiles.storage.msn.com/y1p_dQ_aoS-xPocszmwlqkMGvc0c6789suG5tqLpOv8QL_clQtxdmPXPuv-s7mev1wz?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt; &lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%95%8c%e9%9d%a2%e8%ae%be%e8%ae%a1%e6%8a%80%e5%b7%a7+2+-+%e8%a3%85%e9%a5%b0%e5%92%8c%e8%83%8c%e6%99%af%e5%9b%be%e7%89%87&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3334.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3334.entry</guid><pubDate>Sat, 12 Jul 2008 02:43:03 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3334/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3334.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:03:50Z</dcterms:modified></item><item><title>界面设计技巧 1 - 利用 LabVIEW 自带控件</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3315.entry</link><description>&lt;p&gt;    我前面讲了一堆设计界面的规范和原则，下面介绍一些具体的技巧，可以让界面编写更快捷、美观。&lt;br&gt;    我们需要一个具体示例来帮助介绍这些的技巧，我打算以编写一个黑白棋游戏的界面为例。选择黑白棋是因为这个游戏的界面在常见棋类中比较简单，适合做范例。另外，它也是我最开始学习LabVIEW时的练习程序之一，比较有感情:) 黑白棋的棋盘由8×8个正方格组成，旗子为黑白两色，放置在方格中。（黑白棋游戏详细规则：&lt;a title="http://www.othello.cn/rules.htm" href="http://www.othello.cn/rules.htm"&gt;http://www.othello.cn/rules.htm&lt;/a&gt;）&lt;br&gt;    编写这样一个界面可以使用到多种不同的思路和技巧，我会按照从简到繁的顺序，分几次来介绍几个不同的方法。 &lt;p&gt;    界面设计的时候，首先要调查一下看能不能使用已有的控件。借用已有控件可以大大节省我们自己的开发时间了。我们这个游戏界面上的按钮、文本框等自然可以使用LabVIEW自带的控件；黑白棋的棋盘棋子，也可以上网去找找看有没有别人已经做好的可供使用。&lt;br&gt;    假如没有现成的棋盘棋子控件，那就要我们自己来做一个了。虽然作为整体，没有现成的东西可用，但把它细分成小的基础部分，还是有可能利用一些已有控件的。 &lt;p&gt;    比如说棋子：这个游戏的棋子为圆形，只有黑白两色，个数最多64个。这个特点很适合用 LabVIEW 中的圆形LED灯泡来表示。圆形LED灯泡控件如下图所示： &lt;p align=center&gt; &lt;a href="http://byfiles.storage.msn.com/y1pdj02yC1KFEyMVJEIZHBfcJgIFE9l8nJbacQs7CDd1TZWXqM9QE_wQcZjKYKQ9LuC?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pf0N2Ae_2XvXnKi1LfjMF6m7z2jGPNcMwL3IANGf_RGekJHynFhM4W_vb0H7SLMOc?PARTNER=WRITER" width=227 border=0&gt;&lt;/a&gt;  &lt;p&gt;    为了使它更像棋子，我们还要对他进行一下加工。首先，要把它的尺寸调大；用工具选板上的颜色画笔工具把它在“真”“假”状态下的颜色分别设置成黑色和白色；给他起一个有意义的名称-chess 0，但是在前面板上需要把这个标签隐藏起来，这个名声是为了以后编程的。改进后的棋子，如下图所示： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pDRYqVnyPUAy6Kyf0d4aaxuK1oVdzbf3HhfUmGqwz5qtInAgBFC6cHLiHJOr3x3VF?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=209 alt=image src="http://byfiles.storage.msn.com/y1pK16paY_woaBd47QUr7xacJp9BXITe4v9t_ecHrNkJeYEfrLTIbDjGO73dTfnR-Jt?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;    我们总共需要64个这样的棋子，排成8行8列。其它的棋子不需要再一个一个添加，以第一个棋子为模板，拷贝复制，就生成了第二个；再把两个棋子都选中，复制生成四个；重复这一过程，生成8、16、32、64个棋子。如下图所示： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1peGTi3XVhyZNblqHDMqNmEoGNHWDcUuJ3ppfcLusioP_c1K0yhR_WRglndHAfXQx7?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pLG6EM3DfP32UlNYSh1Zq-nD6s5Fx4frOSTg4bYJ0KewYJ9_ico9sxP1i8O4WNciY?PARTNER=WRITER" width=241 border=0&gt;&lt;/a&gt;  &lt;p&gt;    下面我们要把这些棋子排列整齐。如果有耐心，可以用鼠标一个一个的调整每个棋子的位置。LabVIEW 提供了几个小工具来帮我们整理界面控件的位置和大小，它们就是工具条上，字体调整按钮右侧的四个按钮。这四个个按钮分别用于对齐控件，调整控件间距调整控件大小和控件前后次序。这几个工具在编辑界面时会经常使用到。 &lt;p align=center&gt;&lt;a href="http://q0by9q.bay.livefilestore.com/y1pDwvBSKKJSXLH3mlva_ofVsqOXEXFACSeHFN94REoY67-zY9An2zNCLCkEvJqf5k0Cui-VLTjHa0?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=193 alt=image src="http://q0by9q.bay.livefilestore.com/y1pXDyGcTskK4FJb_Cs6rRYUxzHQXesd20DoCdZ12HJkNGbiGro-DOzLzIHC3G8j6BVCE7TGfc8luk?PARTNER=WRITER" width=639 border=0&gt;&lt;/a&gt;  &lt;p&gt;    我们先把首先利用对齐工具把首行和首列棋子对齐、再利用间距调整按钮使它们间距均匀。再利用对齐工具让其它棋子都与首行首列对齐即可。调整好的界面如下： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pyxYY-8XqhATgsWBZ_rsvuvMKFYwLqiYq8vtYt36sDmQD8U5arooazcqlgTezwb6B?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1pcYBX4p3uN1qjDP8dhxvNysIs01ICCPrSC6cPKs_-o7dQvVVuXd2cEltytGyIldo0?PARTNER=WRITER" width=241 border=0&gt;&lt;/a&gt;  &lt;p&gt;    到此为止，棋子的界面部分就完全设计好了。但是我们还要考虑一下相关的代码。棋子在程序运行过程中时发生变化的。&lt;br&gt;    64颗棋子并不都是显示在屏幕上的。游戏一开始，屏幕上只有四颗棋子，以后每走一步多一颗棋子。LabVIEW 每个控件都有一个属性“Visible”，控制控件是否在前面板上显示出来。棋盘的某个位置还没有放棋子时，可将该位置的棋子控件隐藏。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1plqc8GYrl4MqCybx3EKOzopxVaL6_3a2TvFnohyuC7p18w1wxQcRhstneEukge3so?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=40 alt=image src="http://byfiles.storage.msn.com/y1pDAJjxHx_G1-vwPAiGFBmcFIgwciehu46iEtD6eqhtl51sQRkuov2Pt5XCr_3dcgt?PARTNER=WRITER" width=80 border=0&gt;&lt;/a&gt;  &lt;p align=left&gt;    设计界面时，经常遇到有些控件只在某种特定情况下出现。这样的问题有两种最常见解决方案，一是我们刚刚提到的，可以在不需要看见某个控件时设置它的Visible属性，将其隐藏。这种方法代码编写比较简单，但是不利于界面编辑。尤其当界面某一位置需要在不同情况下出现多种不同控件的情况下。几个几个控件需要在那个位置上重叠摆放，不利于对控件进行编辑调整。&lt;br&gt;    第二种方法是通过控件的Position属性，设置它在界面上的位置。需要显示控件时，把它设定到应该出现的位置；需要隐藏它的时候，把它挪到VI前面板可视范围之外的某个位置上，这样就看不到它了。使用这种方法，始终可以在VI前面板上找到这个控件进行编辑修改。但是编程的时候相对繁琐，需要在程序中设定控件的位置。&lt;br&gt;    如果有一组控件需要同时出现或隐藏，那还可以考虑利用tab控件。把这组控件加在tab的某个页面上，然后通过调整tab的显示页面，控制控件出现与否。 &lt;p&gt;    打开程序的框图，64个控件端子排布在那里。对它们分别进行操作，程序代码将会非常杂乱难懂。为了让程序更清晰，最好把这64个控件按照在棋盘上的位置，组织成一个8×8的二维数组。之后，程序对哪个位置的棋子进行操作就一目了然了。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1p2w-XDsPmvkoB56QiArOZX70OD9oVXJlLknHf_eNVKzOXI-jCtF3tnP5D9ZL7RhOL?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=205 alt=image src="http://byfiles.storage.msn.com/y1p6k7TttRZ27QKeBkoxMaLVUGZmVxaUc68uf6vvey7vQcaHv9KvLYexN35Sar4AWZc?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;    直接把它们组成数组的方法是：为每个控件建立一个引用，然后使用 build array 函数把它们组织起来。但是对64个控件进行一一操作还是够烦的，最好可以编程解决。由于这64个棋子的名字是有规律的，因此我们可编程，按照名字一一等到这些控件的引用。再将得到的引用转换成8×8的数组。如下图所示的代码 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1phhemduc0Tv-tI04EZZVnAUyb4nENP20Cm0vUYS0-NIIApYspMufh7KXUaOJcNKDb?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=140 alt=image src="http://byfiles.storage.msn.com/y1pjDh-NqBIG2WfFI9NRCDSZ6xUKkOgIT_wvRTjB-fn-HuPggsDgGG0vdxgbGK_Bm0n?PARTNER=WRITER" width=468 border=0&gt;&lt;/a&gt; &lt;p&gt;    这里使用了一个关键的子VI，Get Control.vi。这是LabVIEW自带的一个VI（[LabVIEW]\resource\importtools\Common\VI Scripting\VI\Front Panel\Method\Get Control.vi），它用来按名称得到前面板上控件的引用。&lt;br&gt;    这段代码输出的 chess array 是一个8×8数组，包含了所有64个控件。之后程序再对棋子进行操作，从这里得到相应位置的棋子的引用即可对其进行操作了。 &lt;p&gt;    实际工作中，有些应用程序有比较复杂的界面，为了简化它的代码，对界面控件的操作被放置在子VI中完成。直观的做法也是：程序开始时为主程序的控件建立引用，把这些引用捆绑成一个簇，传递到子VI中去。但是，一旦界面发生变化，所有使用到这个簇的VI都可能需要被修改，相当不便。所以，这样的程序也可以使用上段文字介绍的方案，只把主VI的引用传递给子VI，在使用到某个主VI控件的时候，按照名字得到它的引用再对其进行操作。 &lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%95%8c%e9%9d%a2%e8%ae%be%e8%ae%a1%e6%8a%80%e5%b7%a7+1+-+%e5%88%a9%e7%94%a8+LabVIEW+%e8%87%aa%e5%b8%a6%e6%8e%a7%e4%bb%b6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3315.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3315.entry</guid><pubDate>Thu, 10 Jul 2008 07:15:29 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3315/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3315.entry#comment</wfw:comment><dcterms:modified>2008-07-15T13:23:38Z</dcterms:modified></item><item><title>用户界面设计 5 - 限制</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3294.entry</link><description>&lt;p&gt;    保障软件的可靠性是软件开发者的责任。如果用户误操作，或者提供了错误的数据给程序，稳定的程序可以组织程序继续运行并报告错误。但这毕竟是亡羊补牢的做法，更完美的解决方案应倒是从根源上就杜绝误操作和错误的输入数据。&lt;br&gt;    所以，在做界面设计时，还应考虑如何限制用户的输入数据和操作。禁止误操作出现，把输入数据都限制在合理的范围内。 &lt;p&gt;一、限制输入数据 &lt;p&gt;    LabVIEW 的某些控件本身就带有对输入数据进行限制的功能。比如数值型控件，在它的属性对话框中的 Data Entry 页，可以设置这个控件接受的数据的范围。我有一个控件用来表示选取某个通道，可供使用的合法数据为通道0至通道3，我们就可以在这一页把控件的最大最小值分别设为3和0。如下图： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1p6qLF6efA8tMeBO-d0GsWWjDywQYhp7qKEdQUJkmaRarCQFOcr75_Fa1f-8oWWKPB?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=487 alt=image src="http://byfiles.storage.msn.com/y1pmybLalV3KW-yD8mCVvdNz4-9GmSmYYwQp79Z-6m-k9Jk6d2JrTU4vKawwDwsQISo?PARTNER=WRITER" width=492 border=0&gt;&lt;/a&gt; &lt;br&gt;图1：数据范围限制 &lt;p&gt;    这样设置后，用户也许还会输入一个不合理的数值，比如99，但LabVIEW 会立即忽略这个不合理数值。&lt;br&gt;    有时，还有更好的限制方法：让用户根本没办法选择不合理的数据。比如本例，我们在设计时，可以考虑使用 Enum 或 Ring 型控件来表示通道号，这样用户只能在正确的值中选择一个。如下图： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pDRESXeopa0YhSdQJiJrJNPaf6hqhtuWMZ-zN5F0uHf6Ur7mOc0kL9S1J9ZKDkuTS?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=102 alt=image src="http://byfiles.storage.msn.com/y1pmbHL-6U0ET7JAA1PBQ6YVi_xV7CAdjnzAEqe_0u94QzAttowkJ-45m2H0UaMHG4-?PARTNER=WRITER" width=120 border=0&gt;&lt;/a&gt; &lt;br&gt;图2：枚举型数据 &lt;p&gt;    除了 Enum 或 Ring 型控件，单选按钮也可以起到同样的效果。单选按钮可以直接就在界面上显示出所有可供选择的值，并且可以附带对每个选项的详细解释。不经常被用到的对话框可以采用这种控件。比如下图，是VI属性中设置密码的页面。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1p1wiB1dtKKFrAVn1JpghWk7xgz7I0lmb5eLvC6JF-SJLggeO-zzHVBUbQaMt1MtPf?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=312 alt=image src="http://byfiles.storage.msn.com/y1por4lok8Z4Zhg7lym8WIhLaF_InstIknO8mgfxeMxTLMq92q82I3X93c8VVH3e6wU?PARTNER=WRITER" width=586 border=0&gt;&lt;/a&gt; &lt;br&gt;图3：使用选择按钮的界面 &lt;p align=left&gt;二、防止误操作 &lt;p align=left&gt;    一个简单的规则：让所有但是不应被改动的控件都失效。大家看图3中的修改密码按钮是灰色的。因为这是用户选择的是无密码，所以当时不应出现修改密码的操作出现。与其让用户判断是否可以按这个按钮，不如直接禁止它的使用，以防用户错误的按下它发生不可预期的错误。当用户有密码设置后，再允许这个按键被使用。 &lt;p align=left&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2%e8%ae%be%e8%ae%a1+5+-+%e9%99%90%e5%88%b6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3294.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3294.entry</guid><pubDate>Mon, 07 Jul 2008 07:51:56 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3294/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3294.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:10:17Z</dcterms:modified></item><item><title>怎样根据错误代码得到错误信息</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3281.entry</link><description>&lt;p&gt;    大多数 VI 都会带有错误处理机制，所以 VI 的前面板上会有 error in/error out 控件。如果发现有返回错误代码，之间在空间边缘处点击鼠标右键，选择 Explain Error 就可以看到详细的错误信息。&lt;br&gt;    在 Explain Error 对话框上改变错误代码，即可查看到任意一个错误代码的相关信息。也可以通过菜单 Help-&amp;gt;Explain Error 打开这个对话框。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1puz373G0sokfvjg6eXNjwXNFv8RwVZt2VsmvGAO9KRqejx065ah4QvKs5cgTdf01I?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1py-Uy_HztO1hRLpfEZCO2KkduP5bMNcArxUyzwwUDbCrgeQSpc85QHB69pGukXGL0?PARTNER=WRITER" width=202 border=0&gt;&lt;/a&gt; &lt;a href="http://byfiles.storage.msn.com/y1pu92eP3TvpFZqwm8KZY6BZUEnW6ZJ1puN146x2ybcHqa0DIalxXOTYp_teS7uqN2g?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=244 alt=image src="http://byfiles.storage.msn.com/y1puH18sgwegJRhklqgeRGbt3u0bTeCFyzorRIrwdklQkGuErgDipERg1VlAkdTzv9o?PARTNER=WRITER" width=366 border=0&gt;&lt;/a&gt; &lt;br&gt;图1：使用 Explain Error 对话框 &lt;p&gt;    如果是在程序当中需要动态的得到一个错误代码的信息，可以使用 [LabVIEW]\vi.lib\Utility\error.llb\Error Code Database.vi。这个 VI 可以根据输入的错误代码返回错误信息。 &lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e6%80%8e%e6%a0%b7%e6%a0%b9%e6%8d%ae%e9%94%99%e8%af%af%e4%bb%a3%e7%a0%81%e5%be%97%e5%88%b0%e9%94%99%e8%af%af%e4%bf%a1%e6%81%af&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3281.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3281.entry</guid><pubDate>Fri, 04 Jul 2008 05:32:38 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3281/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3281.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:11:01Z</dcterms:modified></item><item><title>被个小贼吓到了</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3269.entry</link><description>&lt;p&gt;    昨晚又没睡好，是因为睡觉前被个小贼吓了一大跳。&lt;p&gt;    昨晚九点左右，我和老婆在卧室里看电视。因为开了空调，就把卧室门关上了。正看着电视的时候，老婆跟我说听见客厅里有动静，其实我也听到了一些声音，但是我一项大大咧咧也没留意。在老婆的提醒下，我觉得有必要去客厅查看一下。&lt;br&gt;    在客厅里没发现任何异常。客厅没开灯，窗帘是拉上的。因为我这里楼间距比较小，这个窗帘我几乎从不拉开。我又打开厨房灯，厨房里也不对的地方。我也没急着会卧室，开始在客厅和厨房之间转悠，琢磨这声音到底是哪发出来的。&lt;br&gt;    就在这是，那个声音又出现了。这回我听的清清楚楚，声音是从客厅窗外传来的。我拉开窗帘一看，一个黑影正站在外面撬我的窗户呢。我家住在四楼，不过客厅窗外有个空调机，他就站在那上面。光线比较弱，我看不清楚那人的五官。不过感觉他是个比较年轻的男人，穿了一件深蓝色外衣，肩膀处有条型的装饰，应该是某种劳动制服。&lt;br&gt;    这肯定是遇到贼了。我朝他大喊了一声：“你干什么呢！”。接下来想到旁边厨房里有把菜刀可以防身，我有了武器，他是硬闯不进来的。又想到应该报警，于是立马抓起手机拨打110。小贼选择了逃跑，我电话还没拨通他就消失得无影无踪了。报了警，我觉得没解决什么实际问题，所以又去小区门口跟门卫反应情况。门卫还是比较负责的，跟我一起来看了一圈，后来又找来好几个巡警模样的人在周边转悠了半天。&lt;br&gt;    我这么一折腾，惊动了几个邻居。跟他们聊过才知道，我这个楼道一楼一个星期前才被盗窃过；二楼两年前也被偷过。我以前一直以为上海是中国治安最好的城市，看来这只限于市区。张江这样的郊区，外来人口又多，工地也多，治安乱的一塌糊涂。经常在张江的论坛看到说哪里又杀了人，哪里又被抢劫了等。现在真有点后悔住到张江来了，当时安家的时候忘记了考察一下治安情况。&lt;p&gt;    门卫和巡逻的走了以后，我觉得还是要自己做点什么，防止小贼再回来。据我观察，那个贼是先进入了我们楼道（我们楼道的大保险门不灵活，经常关不严），然后从楼道三四楼之间的窗户爬出去，一步就可以跨到我的空调上了。楼道内其他楼层的窗户都已被封死了，打不开，只有三四楼之间的窗户可以活动。我挺喜欢开着它通风的，可是为了安全，宁可不通风了。我在邻居的帮助下，把这扇窗户也钉死了。当然，小贼还可以把钉子撬出来，但是这样会大大增加他的犯案时间和风险。&lt;br&gt;    为了更加保险，周末我就会去安上保险窗。我最讨厌把房间弄得像笼子一样，可是在这种治安情况下也别无选择了。&lt;p&gt;    在这一切布置妥当之后，我就开始仔细思索小贼的行为。这个小贼不像是单纯来偷东西的。&lt;br&gt;    首先，作案的时间不对。晚上9点，差不多所有的人都在家，而又没睡觉。这时候偷东西最容易被发现了。&lt;br&gt;    再有，他应该清楚的知道我家里有人。我家卧室的灯是开着的；后来我走到客厅，他肯定也听到了，不然不会暂停撬窗；我又打开了厨房灯，厨房和客厅挨着，站在空调机上一眼就看到了。只要他智商高于70，肯定能够意识到一进屋就马上会被发现。&lt;br&gt;    可他还是打算继续撬窗进屋，那就只有一个解释了：只要能进来，屋里发生的事外面谁也不知道，他就可以明目张胆的抢劫。一般人在家，不会放个武器在身边，而贼有凶器在手，抢劫成功率很高的。只不过他还没进屋，就已被我发现，再要强行闯入，必然惊动四邻。于是他放弃计划，逃跑了。&lt;p&gt;    我老婆平时都住在学校，恰巧昨天比较闲，就跑回家来。要是像平时一样，只有我一个人在家，可能一不留神，就让那个贼进来了。我听说的入室抢劫，大多杀人灭口。真是越想越害怕……&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e8%a2%ab%e4%b8%aa%e5%b0%8f%e8%b4%bc%e5%90%93%e5%88%b0%e4%ba%86&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>生活随笔</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3269.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3269.entry</guid><pubDate>Wed, 02 Jul 2008 23:43:16 GMT</pubDate><slash:comments>7</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3269/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3269.entry#comment</wfw:comment><dcterms:modified>2008-07-02T23:43:16Z</dcterms:modified></item><item><title>计划书的内容</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3267.entry</link><description> 我打算主要写两部分的内容。一是 LabVIEW 初学者容易遇到问题或出错的方面，比如程序的常见错误、代码风格、界面设计、调用DLL库等。二是LabVIEW的一些高级用法，比如 VI Scripting、LvClass、XControl 等。&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e8%ae%a1%e5%88%92%e4%b9%a6%e7%9a%84%e5%86%85%e5%ae%b9&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3267.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3267.entry</guid><pubDate>Wed, 02 Jul 2008 11:24:58 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3267/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3267.entry#comment</wfw:comment><dcterms:modified>2008-07-02T11:24:58Z</dcterms:modified></item><item><title>准备把 blog 上的文章整理成书</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3260.entry</link><description>&lt;p&gt;    最近跟北航出版社的一位老师联系了几次，在他的建议和鼓励下，开始正式考虑把LabVIEW相关的内容编辑成书。&lt;p&gt;    其实我写书的想法也是由来已久的。很早以前，我爸就一直鼓励我把工作都整理出来发表些文章，或者写本书。不过当时只是粗略的考虑了一下这个建议，觉得对我没太大好处，所以就一直没有回应。当前中国的形式是这样的，在技术杂志上发表文章的主要都是为了取得学位或职称的。所以杂志主要靠作者养活，而不是读者。在这样的杂志上发文章，浪费了我的时间和金钱，而又不会被需要的读者读到，没有意义。&lt;br&gt;    而写书的工作量巨大，暂时还考虑不清楚。以我自己的经验，中国作者写作的计算机类书籍，总体水平非常差，远不能跟外国作者的比。究其原因，中国很多技术书籍以抄袭为主，甚至不是作者自己抄，而是找几个学生代工。把国外相关书籍各处翻译一下，东拼西凑就成了一本书。作者自己都不完全理解一个技术，就更别指望他向别人解释清楚了。我可不想也炮制出这么一本书来。&lt;p&gt;    真正开始仔细研究写书的可能性是大约三年前开始的。当时好友小吴和我们公司韩国分公司的一位同事联系比较多，于是知道那位同事靠撰写和翻译相关的技术书籍赚了不少外快。小吴很是动心于是找我一起商量是否我们也可以干点同样的事情，不久另一个好友小王也参与了进来。我们对当时市面上的 LabVIEW 的书籍以及它们的销售情况都进行了分析。对财政方面的分析结果，是比较令人失望的。中国的知识产权不值钱，加上 LabVIEW 用户有限，指望写 LabVIEW 的书籍发家致富是不可能的了。甚至它的投入产出比远不及我本职工作高。所以，后来再有同事跟我提起靠写书捞点外快的时候，我就建议他去跳槽，肯定比写书收益高。&lt;br&gt;    不过，除了金钱写书还有其它收益。最有吸引力的是有成就感。像我不是职业作家，也不是特高新领域的专家，这辈子出书的机会也就那么几次。那把署了自己名的书送几本给亲戚朋友，那是相当满足虚荣心的啦。出本书肯定提高自己在行业的知名度。很可能会对将来的职业发展起到帮助。写作的过程同时也是学习的过程。在我写blog的过程中，我就又仔细研究了很多以前没有仔细考虑过得技术点。&lt;br&gt;    鉴于出书的优点更多一些，我更进一步的又制定了写作的内容。然而，真正动笔开始写书的时候，才发现自己写作的速度太慢。这样子写下去，不知猴年马月才凑得成册。而两个好友，都不是搞技术的，写作上帮不了我。所以，这次写书的计划也搁浅了。虽然写书工作停止了，但我并没有放弃将来再出书的念头。而我也清楚意识到了自己的缺陷，就是写作能力不足。于是，我从那时开始比较认真的写blog了。这主要是为了锻炼自己的写作能力，同时积累一些素材，将来写书也用得上。&lt;p&gt;    之后，又有几次，同事或者出版商和我联系讨论写书的事项。而我都觉得自己准备还不充分，没有积极参与。这次北航出版社的老师给我展示他们的一个出版计划成绩。我觉得他们的计划和设计挺不错的，再加上老婆最近也鼓励我写书，于是又动了心。我当时开始在博客上写 LabVIEW 文章的时候，心里有个打算：积累4年之后，把它们整理成册出版，所以发表的文章都是按章节排布好的。现在离那时只过了两年，文章积累的不算丰富。不过呢，万事也不用那么追求完美，没必要一下子就写部大部头的书出来。把自己部分经验整理整理，写出来也是个不错开端。&lt;p&gt;    我现在正在考虑这本书的内容。我不会写一部教科书一样面面俱到的书籍，LabVIEW 每个技术点都讲一下，那书就厚的不得了了，六个月的时间我肯定写不出来。所以呢，还是只能侧重我最熟悉的那部分知识。但是呢，又不能只写一些 LabVIEW 高级编程的内容。LabVIEW 的用户几乎还全部是初级用户，当然要面向大多数人。再考虑考虑吧。&lt;br&gt; &lt;u&gt;&lt;a href="mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%87%86%e5%a4%87%e6%8a%8a+blog+%e4%b8%8a%e7%9a%84%e6%96%87%e7%ab%a0%e6%95%b4%e7%90%86%e6%88%90%e4%b9%a6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3260.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3260.entry</guid><pubDate>Tue, 01 Jul 2008 13:54:46 GMT</pubDate><slash:comments>11</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3260/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3260.entry#comment</wfw:comment><dcterms:modified>2008-07-14T14:02:48Z</dcterms:modified></item><item><title>终于读完了整本《心理学》</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3245.entry</link><description>&lt;p&gt;    这是我这几年读的时间最长的一本书（大约读了两年），一是因为它特别厚（699页），再有这本书是断断续续读的。我这本《心理学》的作者是 David G. Myers，是美国比较流行的一部心理学导论教材，我看到的是它的第七版。&lt;br&gt;    在读这本书的过程中，陆续给书中某些内容写了读后感。但对于大多数让我受益的知识，后来都没时间整理。现在全书看完，虽然不可能把所有受益都评论一番，但说一下我认为读此书的必要性吧。&lt;p&gt;    听《百家讲坛》王立群讲课的时候，有一回他提到：一个人要想成就一番事业，只琢磨事是不够的，够重要的要琢磨人。这句话要正面来理解，琢磨人可不是算计别人；而是要掌握和理解自己乃至别人的思维方式。说的具体点，如果你当对方是敌人，知己知彼才能取胜；如果你当对方是朋友，知己知彼才能相处融洽。文明发展的趋势就是人越来越社会化。现在别说干事业，即便是日常工作生活也离不开与人打交道。对人性的理解程度直接影响到你的受欢迎程度，从而又间接影响了工作效率和生活质量。&lt;br&gt;    人类的共性远大于个性差异，所有人的思维方式都符合一定规律。这就为掌握人性提供了可能性。然而，领悟这一规律却不那么容易。有些人天资聪颖，总能猜到别人心思，做事八面玲珑；而像我，这方面却十分愚钝。不要说平时接触的各色人等，就算最亲之人，如老婆，我有时候都不知道她想干啥。不知道对方的心思是很被动的：有时候自以为替对方着想，献点殷勤，却不想看错了时机，一巴掌拍在马腿上，讨个没趣。在家里还好，如果是工作中也出现这种情况，麻烦就大了。&lt;br&gt;    好在我一直知道自己的不足，并且相信这可以通过学习弥补。那天逛书店，一眼看到这本《心理学》。于是就买回了一本，来补补课。之后没几天，就已确信它物有所值。我经常看着看着书，就感慨一句：原来是这么回事啊！有些知识还可以立马被应用到实践中，看完了人脑记忆形成那一节，我立刻想到了一些方法来改善自己的记性。&lt;br&gt;    当然，待人接物的习惯不会因为读一本书就会轻易得被改变。但是，只要保持完善自己的动力，日积月累，总会不断进步的。&lt;p&gt;    可能是心理作用，我觉得自己读这本书期间，周围人际关系和谐了不少:) 不知道我老婆赞同不？ &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e7%bb%88%e4%ba%8e%e8%af%bb%e5%ae%8c%e4%ba%86%e6%95%b4%e6%9c%ac%e3%80%8a%e5%bf%83%e7%90%86%e5%ad%a6%e3%80%8b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>生活随笔</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3245.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3245.entry</guid><pubDate>Mon, 23 Jun 2008 12:43:55 GMT</pubDate><slash:comments>10</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3245/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3245.entry#comment</wfw:comment><dcterms:modified>2008-06-23T13:01:24Z</dcterms:modified></item><item><title>家里终于连上网了</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3237.entry</link><description> 今天请假在家，就是为了装电话和宽带。张江这个地方还是偏僻了点，上网没什选择，就只有电信的ADSL。&lt;br&gt;网络装好，就迫不及待的VPN到公司。网速还不错。哈哈，以后再也不用下了班还呆在公司了。&lt;br&gt;&lt;br&gt;既然有了网络，我准备写文章的进度也提高一些。平时晚上没事，都可以上blog写两句了。&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%ae%b6%e9%87%8c%e7%bb%88%e4%ba%8e%e8%bf%9e%e4%b8%8a%e7%bd%91%e4%ba%86&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>生活随笔</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3237.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3237.entry</guid><pubDate>Thu, 19 Jun 2008 12:45:32 GMT</pubDate><slash:comments>6</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3237/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3237.entry#comment</wfw:comment><dcterms:modified>2008-06-19T12:45:32Z</dcterms:modified></item><item><title>LabVIEW 中的类</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3213.entry</link><description>&lt;h3&gt;一、创建一个空的类&lt;/h3&gt; &lt;p&gt;    在 LabVIEW 工程窗口里，鼠标右键菜单的新建栏中有一项，是创建类。类的结构和 LabVIEW 工程库是比较相近的：类的名字也作为名字空间；也可以为类中的 VI 设置访问权限等。类在硬盘上被保存在一个 .lvclass 文件中。这个文件其实是一个XML格式的文本文件，它的格式与 .lvlib 类似。&lt;br&gt;    类是一个抽象的定义，符合这个类的实体，叫做类的实例。这有点类似数据类型和数据之间的关系。 &lt;p&gt;    我们先来创建一个名叫 Animal 的类吧，用它来描述一些动物的属性和行为。现实中，通过特定的属性和方法（行为）来定义某一类事物；与之对应的 LabVIEW 中的概念是类的数据和VI。&lt;br&gt;    动物类是一个类，符合这个概念的任何一个实体比如某一只小猫，一条小狗就是这个类的实例。程序中处理的都是这些实例。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THofLsI5MGSxKk3BNSqanvv00fskBVgUl_aV541xiXfQPGXp7GbtnYF7Yt7SwG6rZ_1o?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=240 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoc3dgamzy9QuoF-fk2u9P-L1lHFD05WpYqrq3GbOUQ4heyAEDdlmRmJYPGwfeAqYFI?PARTNER=WRITER" width=232 border=0&gt;&lt;/a&gt;&lt;br&gt;图1：创建类的菜单 &lt;h3&gt;二、类的属性&lt;/h3&gt; &lt;p&gt;    在工程窗口中可以看到，每个类包含数个 VI 和一个与类同名的 .ctl 项。尽管它的面板与设置方法与用户自定义控件类似，但它实际上并不是一个独立的&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1825.entry"&gt;用户自定义控件&lt;/a&gt;。此外，类的.ctl项必须是一个 Cluster。Cluster 中的元素就是这个类所使用的数据，相当于 C 语言的类中的变量。通过改变 Cluster 中的元素的默认值，你可以在这里设置类的属性的初始值。 &lt;p&gt;    与 C 语言不同之处是，LabVIEW 类中数据只能是私有的。&lt;br&gt;    公有数据是最容易被滥用的。为了自己使用方便，非常专业的编程人员常常倾向于把类中的数据都设置为公有，可以方便随时随地访问它。但这样一来就完全破坏了类的封装性，不加控制地访问类中的数据增加了模块间的耦合度，使得可读性和可维护性都大大降低。&lt;br&gt;    通过类的方法访问类中数据就安全得多。比如我们可以在方法中添加对写入数据的合法性检查，在数据越界时报错等。&lt;br&gt;    这样也有利于调试。比如我们需要跟踪某个类的数据的变化，如果数据是公有的，程序运行时就无办法预知它是在那里被改变的。若数据是私有的，我们就可以确定它只在类中设置它的 VI 中被改变。只要在这个VI上加个断点，就可以在调试时，令程序在数据被改变之前暂停运行。&lt;br&gt;    LabVIEW 相当一部分用户是非计算机专业的人员。对于他们来说，概念越简单越好。类的数据强制为私有类型，可以避免他们接触更多的程序设计概念，而直接引导他们使用最佳的程序设计方法。 &lt;p&gt;    这样的设计方法唯一不足之处是：即便是的确需要被类之外的 VI 直接访问的数据，也必须给他们创建一个公用的方法，通过这个方法间接访问这个数据。幸好，类的右键菜单中有一项专门为数据创建访问 VI 的选项（VI for Data Member Access...）。通过它，可以便捷地创建出数据访问 VI 以供使用。 &lt;p&gt;    现在，回到我的 Animal 类：它有两个属性，分别是动物的年龄和颜色。于是我在 Cluster 中放了两个分别表示年龄和颜色的控件。 &lt;p align=center&gt; &lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocJOayg8VqzS_GEzYC6tCDt8xESNAVBMdZN6BghLY3HHLeJO2fcTnC2fXvo4bYh8Sg?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=234 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THod5cyrhLIzRNwlF53K5FnqV9aI2RWE0uA9_P0om11yg-3-MakgDhVdIoqeTnrcScn8?PARTNER=WRITER" width=240 border=0&gt;&lt;/a&gt; &lt;br&gt;图2：添加类的数据（类的属性） &lt;h3&gt;三、类的方法&lt;/h3&gt; &lt;p&gt;    鼠标右键点击在类上，就可以为类创建 VI，也就是类的方法。 &lt;p align=center&gt; &lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocJrSLHkqkyRE4pSEBTNFb6C8bXHS4qdz2h1DJjqACd4sID2Ipr8NZM_uYGZqB1lio?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=180 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THodjbEkzBuCaFzMb_kL-l5ywYHbXQYvELkG_F-YQu02dQeIa4Q7KJJ4ko91-x2HdsZc?PARTNER=WRITER" width=484 border=0&gt;&lt;/a&gt;&lt;br&gt;图3：创建新方法 &lt;p&gt;    在上图新建这一栏下可以看到很多条目：&lt;br&gt;    VI，就是指创建一个普通的 VI。&lt;br&gt;    Virtual Folder，是文件夹。如果类中的方法很多，可以把它们归类到不同的文件夹中，便于管理。&lt;br&gt;    VI from Dynamic Dispatch Template，所创建出来的VI类似于 C 语言中的虚函数。应用程序再调用这个 VI 的时候，可能实际执行的是某个子类中的同名方法。&lt;br&gt;    VI from Static Dispatch Template，所创建的 VI 比普通 VI 多了类方法最常用的代码框架。程序员可以省去一些自己画错误处理选择框的时间。它与 VI from Dynamic Dispatch Template 唯一的区别在于：类输入输出接线端子（这个例子中是“Animal in/out”）不是动态调度的。（参见图4：动态调度的接线端子）&lt;br&gt;    VI for Data Member Access...，因为类的数据全部是私有的，所以需要借助公有VI来访问他们。这个选项可以帮你快速建立读写类中数据的VI。&lt;br&gt;    VI for Override...，这个选项是专门给子类用的。用来创建覆盖父类方法的VI。&lt;br&gt;    Control，创建用户自定义控件，这一条与类的概念不相关，仅为了方便用户。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THofhl8a4fBdMp-8f7DKRcKvLY5c2mAVCeg3FsoZ9vezPcxG3uYEbfXW692wycKWjtI8?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=217 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THocZJvyIRxoNR9eMbJUlvyLkPl-CxVTMAYt-mvgA8DHFAjzcH1VVUvWTtUPhVf6AbWg?PARTNER=WRITER" width=240 border=0&gt;&lt;/a&gt; &lt;br&gt;图4：动态调度的接线端子 &lt;p align=left&gt;    在类的类的属性面板中可以设置类中每个 VI 是公有的还是私有的。这与工程库中 VI 的设置是类似的。 &lt;p align=left&gt;    可能你已经发现了，与其它语言不同，LabVIEW 中的类没有构造和析构函数。构造函数在一个类的实例（数据为这个类的一个变量）生成时被自动调用，析构函数在它被销毁时自动调用。&lt;br&gt;    在 C 语言中，你可以明确地知道一个变量的生存周期。全局变量在程序启动时被创建，程序结束时被销毁；函数的局部变量在函数被调用时创建，退出函数时销毁，等等。这些都是程序在运行时的行为。但是在 LabVIEW 中，变量的生存周期不一定是在运行过程中。LabVIEW 的变量通常对应有一个前面板上的控件，控件包含的数据在编辑状态下就已存在了，程序运行结束也不会被销毁。这就使得构造函数和析构函数失去了原有的意义。比如，构造函数和析构函数一个最常见的用法是在构造函数内预留某一资源，以供类中的方法使用，在析构函数内释放这个资源。LabVIEW 若有类似功能，则VI被打开时，资源就被霸占住了，这在逻辑上是错误的。&lt;br&gt;    没有构造函数和析构函数，我们可以把预留释放资源一类的工作放在普通的类的方法中实现。只是在使用这个类的实例的时候，需要程序员自己调用这些方法。 &lt;h3&gt;四、类的继承&lt;/h3&gt; &lt;p&gt;    为了让演示程序更有意义，再分别为狗和鸡创建两个类。这两个类应为动物类的子类。进入类的属性对话框，在 Inheritance 一栏中选择animal.lvclass作为它的父类，这两个类便成了animal的子类。可以注意到，LabVIEW 中所有的类都有一个共同的父类“LabVIEW Objet”。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocXMA6uCOda8rpnwVP0noHIr0kbP5DWmMgNOzyFKAQJOyjCQwYdkw--nKYeVGTkcVs?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=240 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoegTe0dLKA3ZPN1HZNd7h0mn5JesKKLAbznyKz2YAqvzBkq8iR2RkCQupuzz3_gzhw?PARTNER=WRITER" width=179 border=0&gt;&lt;/a&gt;   &lt;a href="http://q0by9q.bay.livefilestore.com/y1p83KYkHeC7aD_Orq2WXHb4-ZF6OlodHSOLiCgi_XZa1os1qZvjJgr6n0Zk6FwoxAmRPScgJzo1XLf2NJkR0xiqg?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=239 alt=image src="http://by1.storage.msn.com/y1pH5Es9Ox64kbiofogMErJ3XR5KVIbqtic0ugDHPA_1507ALD59LtSWEYqCvzksnA5b0zQYiN5JCCDmzxH2LoZD1rrLmNrpuYu?PARTNER=WRITER" width=348 border=0&gt;&lt;/a&gt; &lt;br&gt;图5：设置类的继承关系 &lt;p align=left&gt;    在这个设置面板上可以看到，LabVIEW 所有的类都有一个共同的祖先类 LabVIEW Object。LabVIEW Object 是个空类，既没有方法也没有属性。那么它存在的意义是什么呢？&lt;br&gt;    这要先介绍一下泛型编程的概念。理论上，设计程序模块时，越抽象越好。这样同一段代码可以被应用到更多的具体问题中去。本着这个原则，程序中算法和数据类型应该是独立的。比如，一段排序算法的代码被完成后，应当可以被应用在各种数据类型上，既可以用来给一组整数排序，也可以给一组字符串排序。这就是泛型编程。&lt;br&gt;    LabVIEW 暂时支持泛型编程，一个算法 VI 写好，它作为传递参数的控件的数据类型也就定死了。不能够直接使用在其它数据类型上。但是类的实例作为一个数据在 LabVIEW 不同节点间传递时，它的数据类型可以在它本身的数据类型，以及它的任意一个祖先类之间进行切换。比如在处理一只狗小狗的时候，可以把它当作是狗，也可把它当作是动物，还可以把它当作是 LabVIEW Object。&lt;br&gt;    我们再实现一个算法的时候，使用 LabVIEW Object 作为它的参数的数据类型。这样这个算法就可以被应用到人和一种“类”的数据上。Java，就是采用了类似的机制来实现泛型编程的。但是 LabVIEW 并没有因此获得泛型编程的能力。与 Java 不同，LabVIEW 不能直接把一个普通数据类型（比如整数，字符串等）转换成某种“类”。所以，LabVIEW 编写的算法还是不能支持任何数据类型。 &lt;h3&gt;五、其它辅助性设置&lt;/h3&gt; &lt;p&gt;    设置好继承关系，再为子类创建几个属性和方法，我们的演示类就搭建完成了。为了让应用程序美观易读，我们可以修改这几个类的数据线外观。否则，所有的类的数据线千篇一律，很容易就混淆了。数据线的外观也是在类的属性对话框中配置的。 &lt;p align=center&gt;&lt;a href="http://q0by9q.bay.livefilestore.com/y1pxGfiphRHa8hAkGcR-Pv8bcSUeo8Xv_2JEXPVFZf4Z2HVgRJWQLKGg0YDd7P-fLfuTHmWl1gHgikiUwU1L780-P9gzsSAHXnH?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=165 alt=image src="http://byfiles.storage.msn.com/y1pH5Es9Ox64kbyAPL-Mbm0pPXSlCUsw3-P7qIjxZPXOFAhIdBV9KI-k_9hSbqv2uAGdHdk86SoAMebS1ZmbrpcYG6Lk3Q4cqcJ?PARTNER=WRITER" width=240 border=0&gt;&lt;/a&gt; &lt;br&gt;图6：配置类数据线的外观 &lt;h3&gt;六、演示程序&lt;/h3&gt; &lt;p&gt;    我们再简要介绍一下类的多态：在动物类中先用虚函数方法（VI from Dynamic Dispatch Template）创建一个“叫唤”方法：Make Sound.vi。因为狗和鸡的叫声不一样。因此，在两个子类中，我们用 VI for Override... 重新实现这个方法，使其覆盖父类中的“叫唤”。应用程序中有几个不同动物的实例，程序的任务就是让它们每个实例叫一声。借助类的多态特性，应用程序不需要判断实例数据所属的子类，再根据不同子类编写不同代码的。它可以把所有实例用他们共同的父类的类型来传递，代码中也只是用父类的方法。而程序执行到父类的方法时，会自动执行已经覆盖了它的相应的子类的方法。从而让不同的动物发出不同的叫声。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THoeOFZgafwUK1rtoSx8bHGUTTWNl1FcOZAkAhUyXkM_TLXZGAoyh16qGa6JYqjWULic?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=111 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoePk7fcyT7Sdbuyq1Cf7gqhwUn8f8OQlc8ho-F2vpHwDZESSCOL5mYpWpIwVaxoYm8?PARTNER=WRITER" width=246 border=0&gt;&lt;/a&gt; &lt;br&gt;图7：动态调用的示例 &lt;p align=left&gt;&lt;a href="http://decibel.ni.com/content/docs/DOC-1722"&gt;下载示例程序&lt;/a&gt;&lt;br&gt;&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1073.entry"&gt;《我和LabVIEW》目录&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+LabVIEW+%e4%b8%ad%e7%9a%84%e7%b1%bb&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3213.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3213.entry</guid><pubDate>Thu, 05 Jun 2008 11:16:47 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3213/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3213.entry#comment</wfw:comment><dcterms:modified>2008-06-16T12:07:34Z</dcterms:modified></item><item><title>又失眠了:(</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3195.entry</link><description>&lt;p&gt;    今天早上头疼的很，因为凌晨三点的时候突然醒过来就再睡不着了。据我爸说，我这是从他那遗传来的毛病。睡不着觉的时候就会瞎琢磨。今早躺在床上想来想去，就想到了鲁迅。&lt;br&gt;    这是我上学的时候最讨厌的人之一，他写的语言文不文，白不白，怎么读都别扭，还必须要背诵，烦死了。其实对于一个中学生，哪里理解的了鲁迅的文章呢，当时背了也是白背的。&lt;br&gt;    只有当我也踏上社会之后，对各种现象了解的多了，才开始慢慢理解和喜欢鲁迅了。前些天听了《百家讲坛》一组关于鲁迅作品的讲座，现在听来与当年上课那会的感觉竟然完全不同。&lt;br&gt;    帖一篇他的作品，以向鲁迅以及那个允许他发表文章的时代表示敬意。 &lt;p&gt;  &lt;p&gt;&lt;strong&gt;《纪念刘和珍君》&lt;/strong&gt;  &lt;p&gt;鲁 迅  &lt;p&gt;一 &lt;p&gt;中华民国十五年三月二十五日，就是国立北京女子师范大学为十八日在段祺瑞执政府前遇害的刘和珍杨德群两君开追悼会的那一天，我独在礼堂外徘徊，遇见程君，前来问我道，“先生可曾为刘和珍写了一点什么没有？”我说“没有”。她就正告我，“先生还是写一点罢；刘和珍生前就很爱看先生的文章。”  &lt;p&gt;这是我知道的，凡我所编辑的期刊，大概是因为往往有始无终之故罢，销行一向就甚为寥落，然而在这样的生活艰难中，毅然预定了《莽原》全年的就有她。我也早觉得有写一点东西的必要了，这虽然于死者毫不相干，但在生者，却大抵只能如此而已。倘使我能够相信真有所谓“在天之灵”，那自然可以得到更大的安慰，—— 但是，现在，却只能如此而已。  &lt;p&gt;可是我实在无话可说。我只觉得所住的并非人间。四十多个青年的血，洋溢在我的周围，使我艰于呼吸视听，那里还能有什么言语？长歌当哭，是必须在痛定之后的。而此后几个所谓学者文人的阴险的论调，尤使我觉得悲哀。我已经出离愤怒了。我将深味这非人间的浓黑的悲凉；以我的最大哀痛显示于呜呼，我说不出话，但以此记念刘和珍君！ 非人间，使它们快意于我的苦痛，就将这作为后死者的菲薄的祭品，奉献于逝者的灵前。  &lt;p&gt;二  &lt;p&gt;真的猛士，敢于直面惨淡的人生，敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者？然而造化又常常为庸人设计，以时间的流驶，来洗涤旧迹，仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中，又给人暂得偷生，维持着这似人非人的世界。我不知道这样的世界何时是一个尽头！  &lt;p&gt;我们还在这样的世上活着；我也早觉得有写一点东西的必要了。离三月十八日也已有两星期，忘却的救主快要降临了罢，我正有写一点东西的必要了。  &lt;p&gt;三  &lt;p&gt;在四十余被害的青年之中，刘和珍君是我的学生。学生云者，我向来这样想，这样说，现在却觉得有些踌躇了，我应该对她奉献我的悲哀与尊敬。她不是“苟活到现在的我”的学生，是为了中国而死的中国的青年。  &lt;p&gt;她的姓名第一次为我所见，是在去年夏初杨荫榆女士做女子师范大学校长，开除校中六个学生自治会职员的时候。其中的一个就是她；但是我不认识。直到后来，也许已经是刘百昭率领男女武将，强拖出校之后了，才有人指着一个学生告诉我，说：这就是刘和珍。其时我才能将姓名和实体联合起来，心中却暗自诧异。我平素想，能够不为势利所屈，反抗一广有羽翼的校长的学生，无论如何，总该是有些桀骜锋利的，但她却常常微笑着，态度很温和。待到偏安于宗帽胡同，赁屋授课之后，她才始来听我的讲义，于是见面的回数就较多了，也还是始终微笑着，态度很温和。待到学校恢复旧观，往日的教职员以为责任已尽，准备陆续引退的时候，我才见她虑及母校前途，黯然至于泣下。此后似乎就不相见。总之，在我的记忆上，那一次就是永别了。  &lt;p&gt;四  &lt;p&gt;我在十八日早晨，才知道上午有群众向执政府请愿的事；下午便得到噩耗，说卫队居然开枪，死伤至数百人，而刘和珍君即在遇害者之列。但我对于这些传说，竟至于颇为怀疑。我向来是不惮以最坏的恶意，来推测中国人的，然而我还不料，也不信竟会下劣凶残到这地步。况且始终微笑着的和蔼的刘和珍君，更何至于无端在府门前喋血呢？  &lt;p&gt;然而即日证明是事实了，作证的便是她自己的尸骸。还有一具，是杨德群君的。而且又证明着这不但是杀害，简直是虐杀，因为身体上还有棍棒的伤痕。  &lt;p&gt;但段政府就有令，说她们是“暴徒”！  &lt;p&gt;但接着就有流言，说她们是受人利用的。  &lt;p&gt;惨象，已使我目不忍视了；流言，尤使我耳不忍闻。我还有什么话可说呢？我懂得衰亡民族之所以默无声息的缘由了。沉默呵，沉默呵！不在沉默中爆发，就在沉默中灭亡。  &lt;p&gt;五  &lt;p&gt;但是，我还有要说的话。  &lt;p&gt;我没有亲见；听说她，刘和珍君，那时是欣然前往的。自然，请愿而已，稍有人心者，谁也不会料到有这样的罗网。但竟在执政府前中弹了，从背部入，斜穿心肺，已是致命的创伤，只是没有便死。同去的张静淑君想扶起她，中了四弹，其一是手枪，立仆；同去的杨德群君又想去扶起她，也被击，弹从左肩入，穿胸偏右出，也立仆。但她还能坐起来，一个兵在她头部及胸部猛击两棍，于是死掉了。  &lt;p&gt;始终微笑的和蔼的刘和珍君确是死掉了，这是真的，有她自己的尸骸为证；沉勇而友爱的杨德群君也死掉了，有她自己的尸骸为证；只有一样沉勇而友爱的张静淑君还在医院里呻吟。当三个女子从容地转辗于文明人所发明的枪弹的攒射中的时候，这是怎样的一个惊心动魄的伟大呵！中国军人的屠戮妇婴的伟绩，八国联军的惩创学生的武功，不幸全被这几缕血痕抹杀了。  &lt;p&gt;但是中外的杀人者却居然昂起头来，不知道个个脸上有着血污……。  &lt;p&gt;六  &lt;p&gt;时间永是流驶，街市依旧太平，有限的几个生命，在中国是不算什么的，至多，不过供无恶意的闲人以饭后的谈资，或者给有恶意的闲人作“流言”的种子。至于此外的深的意义，我总觉得很寥寥，因为这实在不过是徒手的请愿。人类的血战前行的历史，正如煤的形成，当时用大量的木材，结果却只是一小块，但请愿是不在其中的，更何况是徒手。  &lt;p&gt;然而既然有了血痕了，当然不觉要扩大。至少，也当浸渍了亲族；师友，爱人的心，纵使时光流驶，洗成绯红，也会在微漠的悲哀中永存微笑的和蔼的旧影。陶潜说过，“亲戚或余悲，他人亦已歌，死去何所道，托体同山阿。”倘能如此，这也就够了。  &lt;p&gt;七  &lt;p&gt;我已经说过：我向来是不惮以最坏的恶意来推测中国人的。但这回却很有几点出于我的意外。一是当局者竟会这样地凶残，一是流言家竟至如此之下劣，一是中国的女性临难竟能如是之从容。  &lt;p&gt;我目睹中国女子的办事，是始于去年的，虽然是少数，但看那干练坚决，百折不回的气概，曾经屡次为之感叹。至于这一回在弹雨中互相救助，虽殒身不恤的事实，则更足为中国女子的勇毅，虽遭阴谋秘计，压抑至数千年，而终于没有消亡的明证了。倘要寻求这一次死伤者对于将来的意义，意义就在此罢。  &lt;p&gt;苟活者在淡红的血色中，会依稀看见微茫的希望；真的猛士，将更奋然而前行。 &lt;br&gt;呜呼，我说不出话，但以此记念刘和珍君！  &lt;p&gt;发表于一九二六年四月十二日《语丝》周刊第七十四期&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e5%8f%88%e5%a4%b1%e7%9c%a0%e4%ba%86%3a(&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>生活随笔</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3195.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3195.entry</guid><pubDate>Wed, 04 Jun 2008 11:22:33 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3195/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3195.entry#comment</wfw:comment><dcterms:modified>2008-06-05T11:22:52Z</dcterms:modified></item><item><title>传引用</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3193.entry</link><description>&lt;p&gt;    传值是符合数据流驱动程序的传参方式，LabVIEW 中应该尽量使用这种方式。但是传引用在某些情况下是不可避免的，比如程序要在不同的线程中对同一数据进行操作，就得用到传引用。&lt;br&gt;    引用在 C++ 中和指针本质上是一个东西，只是使用规则有些不同罢了。它们都是一个4或8字节的整数，这个整数表示的是目标数据所在的地址。程序代码通过这个地址来访问数据。&lt;br&gt;    在 LabVIEW 中，没有指针的概念，但是我们可以通过多种形式来完成传引用的功能。下面我们就来讨论一下这些传引用的形式。 &lt;p&gt;一、LabVIEW 自带的传引用数据类型 &lt;p&gt;    在 C++ 语言中，调用子函数时，可以指定某个参数是传值还是传引用。LabVIEW 采用的是完全不同的机制：在一般情况下，数据类型决定了这个数据是采用传值还是传引用。LabVIEW 中大部分数据类型是值传递的，一少部分数据类型专门用于传引用。例如，控件选板上的 Refnum 栏上的控件就都是传引用数据类型的控件。在程序框图上，用深色细绿线表示这类传引用的数据类型。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocgGoih23_xJJeiLRdYZSDX8IjfNrichJjIFYWw504TDkl2RJjseL2_if9JdzPgUns?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=242 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THofG9CDuYTdgVgC_DAGLt9sx-WZeWKFvQXMS2i9FEkOzaiXOsEDIgs0SY6RsoOWNKvY?PARTNER=WRITER" width=451 border=0&gt;&lt;/a&gt; &lt;br&gt;图1：Refnum 选板 &lt;p align=left&gt;    使用 VI Scripting 编程时常会使用到 VI Refnum, Control Refnum 和其它对象的引用。与传值不同，在传递这些数据时，如果数据线分叉，并不意味把它们所表示的控件等复制了一份。新分出来的 Refnum 还是指向原来的那个控件。 &lt;p align=left&gt;    除了各种 Refnum，LabVIEW 中还有其它一些数据类型，尽管其数据线的颜色不同，其实也属于传引用的数据类型。它们包括了硬件设备的句柄（VISA Resource, IVI Logic等）, notifier, event, queue 等等。 &lt;p align=left&gt;二、全局变量 &lt;p align=left&gt;    在实际编程过程中，更常见的是我们希望把一个普通类型的数据按传引用方式传递。比如一个数组，一个自定义的簇等。&lt;br&gt;    &lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3159.entry"&gt;全局变量&lt;/a&gt;是一种最简便的传引用的方式。全局变量的数据被保存在某一固定的内存空间里，但在不同的 VI 或线程中，都可以通过表示这个全局变量的对象来访问数据。&lt;br&gt;    在使用全局变量时，直接把表示全局变量的 VI 或节点放在程序中就可以访问它的数据了。这种方式尽管有其优点，但更多的却是缺点。我们在阅读 LabVIEW 程序的时候，数据线是非常重要的线索。它为我们指明了程序执行的顺序，数据传递和加工的过程。失去数据线这一重要线索，就不容易搞清楚这个数据是从哪里来的，何时被改动。因而大大降低了程序的可读性和可维护性。&lt;br&gt;    不过不要紧，下面提到的方法将会解决这个问题。 &lt;p align=left&gt;三、队列 &lt;p align=left&gt;    LabVIEW 中有一套操作队列的函数。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocAutKcSp9FdBkSZyCEGzgn79chHYNg4UGNzEKBf6ZRJwJ-OqTSUdstRExl_KnC9Vk?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=187 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THofkVlCNZc7g0vlKsIlAsuxCopgWP5hYvm39bnbnCRCkxZL5yb_mCILy_Fh7znKk_LY?PARTNER=WRITER" width=451 border=0&gt;&lt;/a&gt; &lt;br&gt;图2：队列的函数选板 &lt;p align=left&gt;    LabVIEW 中的队列是双向队列，堆栈也可以使用它。它与其它语言中的队列一样，为数据数据提供了存入取出的操作。一般用于不同线程、不同设备等之间通讯时数据的缓存。&lt;br&gt;    但 LabVIEW 中的队列它有其特殊性。其他语言中，队列主要作为一种数据结构，是一种便捷的在内存中保存需要顺序处理的数据的方式。在 LabVIEW 中，队列更主要的应用于在不同的线程间的数据交换。因此，队列不同于LabVIEW中大多数的数据类型，它是传引用的。这样才能在不同的线程内对同一个队列进行操作。 &lt;p align=left&gt;    我们可以借助队列，使任意一种类型的数据按照传引用的方式传递。其思路是：创建一个新的只有一个元素的队列，把数据作为这个队列的元素。平时在 VI 间传递参数时，传递的是这个队列。需要时，再把数据从队列中取出使用。下图是初始化一个这样的传引用数据的代码： &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocwRYhlDB7voN7l5NNCrN7IYoS-9orND8v7x_RCMTec2BoJban22KeA87P3NSbF8aY?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=149 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoeUC_tuY75pKQkNDqhTPEWySmqWgnUqSRjhzbFHlcwhUPhdodM5hY6JwO7vYT8u8Vk?PARTNER=WRITER" width=298 border=0&gt;&lt;/a&gt;  &lt;br&gt;图3：创建一个传引用的数据 &lt;p align=left&gt;    传引用通常都是用于在不同线程里访问同一份数据，所以在访问数据时要防止出现竞争状态。一个数据处理的 VI（假设名为A），第一步操作就应当是用“Dequeue Element”把队列中唯一的元素取出。在 VI （A）所有工作都完成后，再让新的数据重新入队。这样一来，程序执行到VI（A）时，队列立即被清空。其它线程内若有 VI （假设名为B）准备同时处理同一数据，此时它已经无法从空队列中取出所需的数据。它只能暂时等待，直到 VI（A ）完成所有工作，再次把数据放回队列，VI（B） 才能继续执行。这样就避免了同一数据被同时访问而引发的竞争状态。&lt;br&gt;    下图就是一段处理数据的示例代码： &lt;p align=center&gt; &lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THoesaq5lmlI1AvAXgDMHQruVDTMzr8VQc4Ks1_5V7PGbNkTWpBMjT_YpKfPpwPx0i4k?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=144 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THocliBWWXb51r9TpHb4eafWHq_u0LM7NbRMh8AteMez1e44Z_ltcJuY3Wqr6MtBqPNk?PARTNER=WRITER" width=479 border=0&gt;&lt;/a&gt; &lt;br&gt;图4：清空队列、处理数据、重新入队 &lt;p align=left&gt;    （有人问起，代码中那个黄色可框是什么。它是&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!2442.entry"&gt;缓存重用结构&lt;/a&gt;。）&lt;br&gt;    使用传引用，就必须自己管理内存了：当数据不再使用时必须把创建的队列销毁，否则可能会引起内存泄漏。&lt;br&gt;    这里可以&lt;a href="http://decibel.ni.com/content/docs/DOC-1705"&gt;下载一个完整的借用队列传应用的演示程序&lt;/a&gt;。 &lt;p align=left&gt;四、借助 C 语言 &lt;p align=left&gt;    借助 C 语言比借助队列实现传引用要麻烦一些，所以这不是一个首选方案。但是，如果软件中已经有部分模块是使用 C 语言编写的，并且所传递的数据在 C 代码中和 LabVIEW 代码中都会使用到，也可以考虑把数据存放在 C 语言实现的模块中。&lt;br&gt;    这种做法的思路是，数据存放在 C 语言开辟的内存空间里。C 语言把数据的内存地址传给 LabVIEW。平时在 VI 间传递参数时，传递的是这个地址的数值。需要时，再把数据从内存中读到 LabVIEW 里使用。 &lt;p align=left&gt;    在下图的&lt;a href="http://decibel.ni.com/content/docs/DOC-1035"&gt;小猪的演示程序&lt;/a&gt;中使用到了这种传数据引用方法。下图是演示程序中创建数据引用的VI：Pig.lvlib:New.vi  &lt;p align=left&gt;&lt;a href="http://q0by9q.bay.livefilestore.com/y1p83KYkHeC7aCN_LM4u9_cbJc77Q3yOHjJ6uRQACfTs256aNQ3ZaxaOoHYnKwqv8ClTrLIHxu_90e2yr5CX7_uyQ?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=425 alt=image src="http://q0by9q.bay.livefilestore.com/y1pxGfiphRHa8jW-G5HJAuCHkahXmFLvKDnNQcBliBZRnKRu0Rw_MDYvVB12U7qda1bDK_eSafHLhw3h6BS60B1EB78NpapfL5g?PARTNER=WRITER" width=695 border=0&gt;&lt;/a&gt;  &lt;p align=left&gt;    先不去考虑这个例子中的数据具体是什么，值分析一下它如何构造数据的引用：在这个 VI 的正中间是一个显示为“NEW INDEX”的VI。它的功能是把一段数据放置在C语言中开辟的内存里，然后返回保存数据的内存地址。内存地址用I32整数类型标识。以后在每个子 VI 间传递的数据就是这个内存地址的值。&lt;br&gt;    你可能已经注意到，程序把这个内存地址又强制转换成了一个 Refnum 数据类型。这不仅是为了看着舒服（LabVIEW 中的传引用大多使用这种数据类型），更是因为使用自定义的 Refnum 类型，比整数有更高的安全性。例如你的程序中有不同的几块数据都采用这种放法保存在C语言开辟的内存中，使用不同的 Refnum 类型可以分别地将它们区分开来，避免直接把地址值传递给需要使用另一块数据的 VI。（这个技巧留待以后详细解释:） &lt;p align=left&gt;&lt;a href="http://ruanqizhen.spaces.live.com/mmm2008-05-17_13.22/mmm2007-10-25_18.59/mmm2007-07-26_17.23/mmm2007-07-26_17.23/mmm2007-07-26_17.23/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry"&gt;&lt;u&gt;《我和 LabVIEW》目录&lt;/u&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+%e4%bc%a0%e5%bc%95%e7%94%a8&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3193.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3193.entry</guid><pubDate>Wed, 04 Jun 2008 11:18:01 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3193/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3193.entry#comment</wfw:comment><dcterms:modified>2008-06-19T09:06:01Z</dcterms:modified></item><item><title>Windows Desktop Search 编程</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3164.entry</link><description>&lt;p&gt;    最近，抽空研究了一下 Windows Desktop Search 编程，发现这东西真不咋样。最主要的是资源太少，估计没几个人编程的时候用到这东西的。网上搜了一下，几乎没有程序员写的相关文章。有个官方论坛，发言者寥寥无几。微软自己提供的相关文档散落在MSDN的各个角落，不成系统，看起来也挺费劲的。而且很多文章是几年前写的，到现在链接都失效了。 &lt;p&gt;    简单总结一下就是这东西终端用户用用还行，做二次开发就不太适用了。微软的捆绑销售策略虽然恶心，但确实管用。否则有Google在，谁用他的破搜索啊。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+Windows+Desktop+Search+%e7%bc%96%e7%a8%8b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><category>我和 LabVIEW</category><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3164.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3164.entry</guid><pubDate>Fri, 30 May 2008 08:27:16 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!3164/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3164.entry#comment</wfw:comment><dcterms:modified>2008-06-02T07:14:19Z</dcterms:modified></item><item><title>Photo Album: Blog Images</title><link>http://ruanqizhen.spaces.live.com/photos/cns!5852D4F797C53FB6!2704/</link><description>&lt;p&gt;Blog Images&lt;/p&gt;&lt;div&gt;&lt;table cellspacing="0" border="0"&gt;&lt;tr height="8"&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2705"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2705&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2706"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2706&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2709"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2709&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2710"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2710&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2713"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2713&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2714"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2714&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2717"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2717&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2718"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2718&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2719"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2719&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2720"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;2720&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;2704&amp;#47;"&gt;More Photos...&lt;/a&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+Photo+Album%3a+Blog+Images&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><guid isPermaLink="false">cns!5852D4F797C53FB6!2704</guid><pubDate>Fri, 28 Mar 2008 09:26:25 GMT</pubDate><msn:type>photoalbum</msn:type><live:type>photoalbum</live:type><live:typelabel>Photo album</live:typelabel><cf:itemRSS>http://ruanqizhen.spaces.live.com/photos/cns!5852D4F797C53FB6!2704/feed.rss</cf:itemRSS><dcterms:modified>2008-03-28T09:26:25Z</dcterms:modified></item><item><title>Photo Album: LabVIEW 2</title><link>http://ruanqizhen.spaces.live.com/photos/cns!5852D4F797C53FB6!1950/</link><description>&lt;p&gt;LabVIEW 2&lt;/p&gt;&lt;div&gt;&lt;table cellspacing="0" border="0"&gt;&lt;tr height="8"&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1950&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1951"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1951&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;call chain&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1950&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1953"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1953&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Include paths xcontrol&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6364383383296229302&amp;page=RSS%3a+Photo+Album%3a+LabVIEW+2&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=ruanqizhen.spaces.live.com&amp;amp;GT1=ruanqizhen"&gt;</description><guid isPermaLink="false">cns!5852D4F797C53FB6!1950</guid><pubDate>Thu, 28 Feb 2008 03:28:11 GMT</pubDate><msn:type>photoalbum</msn:type><live:type>photoalbum</live:type><live:typelabel>Photo album</live:typelabel><cf:itemRSS>http://ruanqizhen.spaces.live.com/photos/cns!5852D4F797C53FB6!1950/feed.rss</cf:itemRSS><dcterms:modified>2008-02-28T03:28:11Z</dcterms:modified></item><item><title>Photo Album: LabVIEW</title><link>http://ruanqizhen.spaces.live.com/photos/cns!5852D4F797C53FB6!1731/</link><description>&lt;p&gt;LabVIEW&lt;/p&gt;&lt;div&gt;&lt;table cellspacing="0" border="0"&gt;&lt;tr height="8"&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1732"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1732&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1733"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1733&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1736"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1736&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1737"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1737&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1756"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1756&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1757"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1757&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://ruanqizhen.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1731&amp;#47;cns&amp;#33;5852D4F797C53FB6&amp;#33;1758"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;5852D4F797C53FB6&amp;#33;1758&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p