<?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%2fcategory%2f%e6%88%91%e5%92%8c%2bLabVIEW%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: 我和 LabVIEW</title><description /><link>http://ruanqizhen.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%25E6%2588%2591%25E5%2592%258C%2bLabVIEW</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><cf:parentRSS>http://ruanqizhen.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>6364383383296229302</live:id><live:alias>ruanqizhen</live:alias></live:identity><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><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>界面编程技巧 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><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>界面设计技巧 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><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><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><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><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>怎样根据错误代码得到错误信息</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><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!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><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><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>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><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!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><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><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>全局变量</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3159.entry</link><description>&lt;p&gt;    全局变量是一种数据在不同节点，不同VI，不同线程间传递的方式。数据被保存在某一固定的内存空间里，不随数据线流动。在需要读写数据的地方，不需要外部链接的数据线，直接通过某些节点或VI就可以得到目标数据，并对其操作。&lt;br&gt;    在LabVIEW 中应当尽量避免使用全局变量。全局变量看似方便，但带来的问题也很多。最主要的是它破坏了数据流顺序的逻辑关系，导致程序可读性和可维护性下降。&lt;br&gt;    偶尔也有不得不使用全局变量或使用它利大于弊的情况。比如：实现子 VI 间参数传引用的机制；在不破坏程序可读性的前提下，避免一些过于杂乱的数据连线；对高层用户隐藏某些底层模块内部使用的数据。 &lt;h3&gt;一、全局变量（Global Variable）&lt;/h3&gt; &lt;p&gt;     &lt;p&gt;此处所说的全局变量是特指图标像地球的那个 Global Variable VI。使用这种全局变量，目标数据被存放在一个只有前面板的特殊VI中，任何需要使用这个数据的地方，把它所在的 Global VI 拖过来即可。如同前面所述，全局变量虽然使用方便，但是缺点也十分明显。&lt;br&gt;    首先，它不利于代码的可读性，破坏了数据流顺序的逻辑关系。使用全局变量难以知道数据是否在其它地方被改动过。换言之，代码上的全局变量，不能直观的反映出它的数据来源。&lt;br&gt;    其次，它的安全性低。全局变量可以在任何地方被直接读写。即便知道数据在某些地方不应该被改动，也无法对其进行控制。&lt;br&gt;    再次，它的效率低下。VI每次读全局变量，LabVIEW 都要为读到的数据复制一个新的副本，这毫无疑问影响到VI的效率。&lt;br&gt;    此外，全局变量的不合理使用还可能导致竞争状态。比如下图中的VI，假设全局变量 Data 的值原本为 0，运行完下面这个加2减1后的代码后，Data 中的值是几呢？可能是1，也有可能是2，还可能是-1，这完全取决于程序的执行顺序。而在这种情况下，这个顺序是不确定的。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THodknaiVV45G0oqFwIvUYJHQqT8EpCsassOa93Q9vpZcLSSXh8e-dHJKSWewB4B_bno?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=252 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THod-_E7SsLpOAEqOB7D-x4ma6tuYX3CwfLUXtIJB78ytNwdR-vQPl7UTx0-FeGvthNg?PARTNER=WRITER" width=335 border=0&gt;&lt;/a&gt; &lt;br&gt;图1：处于竞争状态的全局变量 &lt;h3&gt;二、单进程共享变量（Single-Process Shared Variable）&lt;/h3&gt; &lt;p&gt;    共享变量有三种：单进程，网络发布，以及时间触发的共享变量。后两种主要应用于不同硬件设备、不同计算机、不同进程程序间的数据交换。在此，我们仅仅介绍与全局变量相关的第一种：单进程共享变量。共享变量的种类可以在它的属性页中进行修改。&lt;br&gt;    单进程共享变量，顾名思义就是作用域为单个程序进程的共享变量。它与全局变量的性质是完全相同的。唯一的不同点是单进程共享变量带错误输入/输出端，我们可以利用错误处理连线来控制单进程共享变量的执行顺序。比如下图中的VI，假设共享变量 Data 的值原本为 0，运行完下面这个加2减1后的代码后，Data 的值必然为1。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THodu1JdZSVKk9WJoO38PLxAj_4JZWTWinFcgPS_4NnAAseIH_RhTBts3yLj1dchHslQ?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=237 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THofjT56fTaSQNGSP2Q_8Db8AlCQ00sY5DoVxnct0_jxMoNQObDYX0EmP_7aGZiA8K0w?PARTNER=WRITER" width=312 border=0&gt;&lt;/a&gt; &lt;br&gt;图2：共享变量的使用 &lt;p&gt;    这并不意味着单进程共享变量可以防止出现竞争状态。设想上图的VI只是程序中的一个子VI，在其运行的同时，Data 仍然可以在其它子VI中被访问，因此，仍然有可能处于竞争状态。&lt;br&gt;    共享变量是 LabVIEW 8 之后的一个新东西，比必须被保存在某个 Library 内部，不能独立存在。 &lt;h3&gt;三、功能全局变量（Functional Global）&lt;/h3&gt; &lt;p&gt;    功能全局变量与前两种全局变量完全不同，它在 LabVIEW 中就是一个普通的 VI。它把需要在全局使用的数据保存在一个没有初始化的移位寄存器中，并实现相关的访问这些数据的方法。&lt;br&gt;    功能全局变量的代码结构都是类似的：主体是一个只执行一次的循环结构；内套一个选择结构；一个输入用于选择某种操作；若干用于输入和输出数据的控件。&lt;br&gt;    其实，使用循环结构仅是为了利用它的移位寄存器。移位寄存器没有连初始化数据，因此每次执行这个VI时，它里面保存的是上一次 VI 执行结束时的数据。这样，就可以在程序的全程保存、处理或使用这一数据了。功能全局变量 VI 不可以被设置为&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1519.entry"&gt;可重入&lt;/a&gt;，否则在不同地方，得到的移位寄存器中的数据就不是同一份了。&lt;br&gt;    从 LabVIEW 8.5 开始，VI 的程序框图增加了反馈节点了。可以使用它来替代仅执行一次的循环，以简化程序。下面两图就是完全等效的功能全局变量。 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THodBc5tDUNbNYAXExgzSsb2IUvOlfzfoP7H4IMMjL5hV3D7tLvXdT__aqX0gXZeSetY?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=385 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THocNHqUsZ1YFY0q-3sMTyVqr9BNp4goNwlEzZBEvkX32li4Z6FygMOz0UTcv6ru4qx4?PARTNER=WRITER" width=522 border=0&gt;&lt;/a&gt; &lt;br&gt;图3：实现加减法功能的功能全局变量 &lt;p align=center&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THoe0GObX0qq6RqhEEmz6wFJilGWvnifja9ufjMGhEpbzXGExPCo1BWcrK28TsTpAPdA?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=346 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THofX7ru4C5UV4FMKota_y4pa7Yw0gDQc9gPBLzvd99eTCi6j2C4VEpPwOGWVjm3Q69c?PARTNER=WRITER" width=450 border=0&gt;&lt;/a&gt; &lt;br&gt;图4：等效的加减法功能全局变量 &lt;p align=left&gt;    与前两种全局变量相比，功能全局变量有两项主要的优点。所以我建议，如果不得不使用全局变量，那就使用功能全局变量。&lt;br&gt;    首先，功能全局变量可以防止竞争状态出现。因为功能全局变量的VI是不&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1519.entry"&gt;可重入&lt;/a&gt;的，所以把它作为子 VI 时，绝对不可能出现两个相同功能变量子 VI 同时执行的情况。因为对全局数据的所有操作都是在这个 VI 内部完成的，也就意味着，所有对数据的操作都绝对不会被其它操作干扰。图5中的VI，执行结束必然导致全局数据增加1，即便还有其它线程的子VI在同时运行也不会影响这个结果。但需要注意的是，解决了竞争状态不等于全局变量的使用顺序可以乱写，随机的顺序很可能导致错误。设计功能全局变量时可以加入出错处理的连线，以方便使用时确定全局变量的调用顺序。 &lt;p align=center&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=223 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THocV1BHfWm3QFk1Xx9QeR3rbS9Qkxhy6LSjUzUlLN8-PGbstPvK0-E7GGCSMbTdICL4?PARTNER=WRITER" width=220 border=0&gt; &lt;br&gt;图5：功能全局变量的使用 &lt;p align=left&gt;    另一优点是，功能全局变量可以封装内部数据、控制对数据的访问权限。例如图3 所示的那个功能全局变量，故意没有设置数据的方法。因此，使用这个全局变量的高层程序是无法直接修改全局变量的值的，只能使用给定的方法：复位或加减。甚至也可以不对高层程序提供直接查看全局数据的方法，只允许通过某些方法得到数据处理后的结果。这样全局数据就被很好的隔离开来，避免了被不当改动的风险。 &lt;p align=left&gt;    由于功能全局变量的这两个优点，它一度受到程序员的极力推崇。我读过一本名为《A Software Engineering Approach to LabVIEW》的书，它的核心思想就是建议读者把程序模块全部写成功能全局变量的形式。&lt;br&gt;    功能全局变量虽然有上述优点，但用它来作为较大功能模块的框架，还是存在很多不足的。首先，这种实现方法，模块最主要的功能和代码都在同一个VI中实现。这个VI会变得十分复杂，难以维护。其次，模块如果接口的数据较多，这个VI的连线就会极为复杂。再有，如果模块要增加或改动点什么功能，这个大VI参数可能会发生变动，引起版本不兼容的问题。&lt;br&gt;    LabVIEW 从8.2 版本起，已经支持面向对象的编程，类的概念发挥了功能全局变量的优点，克服了其缺点。因此，再设计功能模块应该首先考虑 使用LvClass。另外，利用LVOOP 可以设计出更便于维护的功能全局变量，不过这更加复杂，我们以后在介绍LVOOP的时候一并介绍吧。 &lt;p align=left&gt;&lt;a href="http://decibel.ni.com/content/docs/DOC-1703"&gt;下载功能全局变量的示例&lt;/a&gt; &lt;p align=left&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+%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f&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!3159.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3159.entry</guid><pubDate>Tue, 27 May 2008 05:05:41 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!3159/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3159.entry#comment</wfw:comment><dcterms:modified>2008-06-19T09:51:30Z</dcterms:modified></item><item><title>面向对象与数据流驱动的结合</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3140.entry</link><description>&lt;p&gt;    LabVIEW 是&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!2186.entry"&gt;数据流驱动的编程语言&lt;/a&gt;：数据在数据线上流动，每个节点通过输入端的连线接收到数据，对其进行处理，再把结果传给输出端连线。&lt;br&gt;    为了符合数据流的概念，多数情况下 LabVIEW 函数（或子VI）使用的传参方式是&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!2224.entry"&gt;值传递&lt;/a&gt;：就仿佛是整个数据在连线上流动，遇到一个节点，便一股脑都传到节点中去。必要时，譬如数据线分叉的时候，数据便生成一个副本，这样就有了两份同样的数据，沿着不同的分支继续传递。&lt;br&gt;    也有例外的情况，比如使用 refnum 这种数据类型的时候。真正有意义的数据是存放在内存的某个地方不动的，而在节点间流动的只是一个指向这片数据的引用。这种传引用的方式破坏了数据流的概念，只在不得已的情况下才可使用（比如在多线程中对同一块数据进行操作），否则还是应当尽可能遵循 LabVIEW 一贯的值传递方式。  &lt;p&gt;    为了与用户熟知的数据流方式兼容（风格不一致，必然造成程序的极大混乱），LabVIEW 中的对象也是按照值传递的方式在节点间流动的。这点和其它语言有所差别，文本编程语言中传递对象时，基本都使用传引用的方式。&lt;br&gt;    实际上，这两种传参方式各有特色，LabVIEW 别具一格的选择了值传递方式，是因为，在 LabVIEW 中，值传递的优势更大一些。  &lt;p&gt;    传引用的优点在于效率高，一个对象的数据量往往都比较大，值传递免不了要生成一些副本给被传递的数据，这类开销是相当大的。而一个引用类型的数据一般只需要占用4或8个字节，传递它们的开销远小于直接传递数据。&lt;br&gt;    在多线程程序中，传引用意味着不同的线程可以访问同一块数据。在不同的线程中同时对同一数据进行读写是很危险的，它可能会产生不可预期的结果。所以，在多线程程序中常常使用临界区、信号量等方法来防止竞争状态的出现。这对于 C++ 或其他文本语言的程序员不是一个太大的问题，编写多线程程序的人员多少已经对可能出现的竞争状态有所了解。并且他们清楚地知道自己在编写多线程程序，会格外留意并采取相应措施防止错误出现。  &lt;p&gt;    而 LabVIEW 的使用者中，相当一部分人是非计算机专业的。为了帮助这些非计算机专业编程者利用多线程的优势，LabVIEW  采用了&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1494.entry"&gt;自动多线程的机制&lt;/a&gt;。LabVIEW 中，编程者并不需要告诉程序去开辟新线程；任何两段逻辑上没有先后顺序的代码，都有可能被自动的放到两个线程里去同时执行。&lt;br&gt;    在这种情况下，传引用是非常危险的，编程者可能根本没意识不到程序有多个线程，因而无意中写下存在竞争状态的代码。&lt;br&gt;    只有值传递才可以解决这个问题。值传递意味着数据每到一个分叉处，就变成相等但互相独立的两份数据。每个可能同时运行的数据线上的数据都是相互独立的，程序永远不会试图去同时访问同一个数据。这样就避免了无意识下造成的竞争状态。如果程序中的确需要在不同线程里处理同一对象，编程者可以在明确程序风险的前提下使用 LabVIEW 中的传引用机制，并做好多线程安全防护。 &lt;p&gt;    那么，类的实例作为值传递的数据，到底都包含哪些内容呢？这个数据你可以把它看成是一个簇。这个簇中可能又包含一下多个簇：&lt;br&gt;    1. 一个簇包含所有类的属性；&lt;br&gt;    2. 一个簇包含它父类的所有属性；&lt;br&gt;    3. 一个簇包含它父类的父类的所有属性；&lt;br&gt;    4. 一个簇包含它父类的父类的父类的……&lt;br&gt;    ……&lt;br&gt;    除了这些属性数据，类的实例还包含有自身类别的信息，比如自己属于哪个类，什么版本等。这样，一个实例即便是按照它的某个祖先类来传递，也同样可以在需要的时候调用属于自己本身类的方法。 &lt;p align=left&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+%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e4%b8%8e%e6%95%b0%e6%8d%ae%e6%b5%81%e9%a9%b1%e5%8a%a8%e7%9a%84%e7%bb%93%e5%90%88&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!3140.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3140.entry</guid><pubDate>Thu, 22 May 2008 09:38: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!3140/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3140.entry#comment</wfw:comment><dcterms:modified>2008-06-23T13:44:50Z</dcterms:modified></item><item><title>创建了一个 msn 的群给 LabVIEW</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3088.entry</link><description> 从来没用过QQ，据说它的群功能很好用，但是msn没这个功能。后来有个第三方公司和msn合作，提供了类似群的功能。我听说后就跑上去给LabVIEW建了一个。可是当时没几个人，所以一直都没用。现在有半年过去了，再跑上去一看，成员居然多起来了。而且经常有人发言，不像以前那样冷清了。&lt;br&gt;把 msngroup7773@hotmail.com 加为 messenger 好友，就可以加入这个群了。&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%88%9b%e5%bb%ba%e4%ba%86%e4%b8%80%e4%b8%aa+msn+%e7%9a%84%e7%be%a4%e7%bb%99+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><comments>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3088.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3088.entry</guid><pubDate>Fri, 18 Apr 2008 02:58: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!3088/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3088.entry#comment</wfw:comment><dcterms:modified>2008-04-18T02:59:57Z</dcterms:modified></item><item><title>调用动态链接库 4 - 结构型参数的设置</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3037.entry</link><description>&lt;p&gt;    C 语言中的结构（struct），在一些简单情况下，可以和 LabVIEW 中的 Cluster 相对应。但是，对于比较复杂的情况，LabVIEW 中的 Cluster 要做适当调整，才能够对应起来。 &lt;p&gt;    在讨论结构型参数的映射前，一定要先了解一下&lt;a href="http://www.google.cn/search?hl=zh-CN&amp;amp;q=%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90&amp;amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;amp;meta="&gt;字节对齐&lt;/a&gt;的概念。我在这里只做一个简单说明，详细内容可以查找相关的专题文章。&lt;br&gt;    C 语言中的一个结构 typedef struct { char a; int b} MyStct;  结构中的元素a所在的地址是：0xAAAA0000，b 的存放地址是与结构的字节对齐设置相关的。如果采用1字节对齐，b是紧挨着a存放的，b的地址就是：0xAAAA0001；如果采用2字节对齐，b的存放地址是紧挨着a的第一个偶数地址，也就是：0xAAAA0002；如果采用4字节对齐，b的存放地址是紧挨着a的第一个4整数倍地址，也就是：0xAAAA0004……&lt;br&gt;    C 语言的字节对齐数可以由 #pragma pack 指令指定，也可以在工程属性里指定。但是 LabVIEW 的 Cluster 只能是1字节对齐的。因此，C 语言中，非1字节对齐的结构与Cluster对应时，一定要做适当调整。比如，结构 typedef struct { char a; int b} MyStct;  是2字节对齐的，那么，对应的LabVIEW Cluster 第一个元素还应该是 I8 型的a，但是，不能紧接着就放b，因为C语言中，b的起始地址不是紧挨着a的，他们中间还有一个无意义的数据，C的结构体虽然表现不出来，LabVIEW中却需要把它考虑进去。&lt;br&gt;    如果是自己编写一个DLL给LabVIEW使用，为了方便，可以把C代码中所有的结构都设为1字节对齐。 &lt;p&gt;    C 语言的结构中如果还嵌套了数组，是不能直接对应于LabVIEW中嵌套了数组的Cluster的。在LabVIEW中，只能把数组的元素都拆开来放在Cluster中。 &lt;p&gt;    下面是一些对应的实例： &lt;p&gt; &lt;div style="margin-left:23pt" align=center&gt; &lt;table style="border-collapse:collapse" width=545 border=0&gt; &lt;colgroup&gt; &lt;col style="width:84px"&gt; &lt;col style="width:214px"&gt; &lt;col style="width:230px"&gt; &lt;tbody valign=top&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-left:silver 0.5pt solid;border-bottom:silver 0.5pt solid" valign=center width=342&gt;&lt;strong&gt;C&lt;/strong&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none" width=195&gt;&lt;strong&gt;LabVIEW&lt;/strong&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center width=342&gt; &lt;p align=left&gt;#pragma pack (1)&lt;br&gt;typedef struct { char a; int b} MyStct;&lt;br&gt;MyStct* testStruct; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none" width=195&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THof8g9SPZtAYBQ19vizW929tnBCHRFqqilKJ2JWxsnLfn1F58XTATFGIucBEQtaBaZE?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=85 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoeZYKyGo9U3GBYg1AQzcqE0Qlav9GpWleBMliPhGkpueyOzlrC-hL9mu1eMQJ8j6No?PARTNER=WRITER" width=53 border=0&gt;&lt;/a&gt;  &lt;tr style="height:21px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center width=342&gt; &lt;p align=left&gt;#pragma pack (2)&lt;br&gt;typedef struct { char a; int b} MyStct;&lt;br&gt;MyStct* testStruct; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none" width=195&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THoehf1UlUcN_pCJ26RDxShJnnFB005piWSnZKwd8QWx46CMMXWo2Ql-UzYrxfL5sO44?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=72 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THodbSuud3ZScEin6Gr48B-Mdye9352ZJfQRbgDfXz_L4HSn70RqZbEpWtmVq4kZGei0?PARTNER=WRITER" width=87 border=0&gt;&lt;/a&gt;  &lt;tr style="height:28px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center width=342&gt; &lt;p align=left&gt;#pragma pack (4)&lt;br&gt;typedef struct { char a; int b} MyStct;&lt;br&gt;MyStct* testStruct; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none" width=195&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THof78CPrt6CfjQoDF5wYlHTZjz00g8H14fkkfw-gYGBRfBXCgN-FnGZsMnX7aUCb5_E?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=89 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoeyinvvkoBtEjhyrrN1zLklOEC7gKOtIDvCxPer41FHzjPHe_wYZguLpZ8JiT4Tbkw?PARTNER=WRITER" width=102 border=0&gt;&lt;/a&gt;  &lt;tr style="height:28px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center width=342&gt; &lt;p align=left&gt;#pragma pack (1)&lt;br&gt;typedef struct { char a; char* str; int b} MyStct;&lt;br&gt;MyStct* testStruct; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none" width=195&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THoc1gVpsLyUVR28eZBSo99BnjW6XhtGM665M3ZAy-1t7P1oPZhO3jmyFTCO3Zg_OVKk?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=72 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoeQsG1b5-UiugbbP7Jk8uAjrey8c-zkh-fvv2aVzpm3LnxcsTDweQQ0hurCI5AnxFc?PARTNER=WRITER" width=116 border=0&gt;&lt;/a&gt;  &lt;tr style="height:28px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center width=342&gt; &lt;p align=left&gt;#pragma pack (1)&lt;br&gt;typedef struct { char a; char str[5]; int b} MyStct;&lt;br&gt;MyStct* testStruct; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none" width=195&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THoeP7oOBJYfdeO9dqun8p2XR5e1bdI4XgXKlJyjv3lgQLXSuNrT1CQ1qeCnFl7pe88Y?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/y1pIcO_924THoc_f3MkJezqU4C-it1fYrl49UhTY5kZ-09rrHyGlaHo4mUUVt5g4n_T3xYkzeyGWKI?PARTNER=WRITER" width=71 border=0&gt;&lt;/a&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;    上面这个表中有两点需要注意的：&lt;br&gt;    一是，表格中的第四个例子，结构中含有一个指针，LabVIEW中的Cluster只能用一个U32数值（32位系统上，64位系统上使用U64）来表示指针的地址。不能把指针指向的内容放到Cluser中去。后面的章节再讨论当我们在LabVIEW中得到了一个数据的地址后，如何从这个地址中把数据拿出来。&lt;br&gt;    第二，上面C语言中声明的 testStruct 变量，是指向结构的指针。就是说C函数的变量类型为结构的指针时，才能在LabVIEW中使用Cluster与之对应。CLN节点的配置面板中，没有一个专门的参数类型叫做“struct”或者“Cluster”，选择“Adapt to Type”就可以了。&lt;br&gt;    如果参数的类型就是结构而非指针，考虑到C函数参数的压栈顺序，把一个结构体作为参数传给函数，等价于把结构中每个元素分别作为参数传递给函数。下面是一个例子： &lt;p&gt; &lt;div style="margin-left:23pt" align=center&gt; &lt;table style="border-collapse:collapse" border=0&gt; &lt;colgroup&gt; &lt;col style="width:84px"&gt; &lt;col style="width:214px"&gt; &lt;col style="width:230px"&gt; &lt;tbody valign=top&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-left:silver 0.5pt solid;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:宋体"&gt;输入&lt;/span&gt;&lt;span style="font-family:times new roman"&gt;/&lt;/span&gt;&lt;span style="font-family:宋体"&gt;输出&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:宋体"&gt;输入&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:宋体"&gt;输出或兼作输入输出&lt;/span&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;C&lt;/span&gt;&lt;span style="font-family:宋体"&gt;语言声明&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p align=left&gt;typedef struct{int left; int top;} Position;&lt;br&gt;long TestStructure(Position inPos); &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p align=left&gt;typedef struct{int left; int top;} Position;&lt;br&gt;long TestStructure(Position *pos); &lt;tr style="height:21px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;LabVIEW&lt;br&gt;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;中的配置&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocmuZCdAW9fRKtv1HSM6HPqfq-5ily7xquBIl_RZ4mJjF68H2mLoroRb4WlW1XlMWU?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=42 alt="clip_image001" src="http://byfiles.storage.msn.com/y1pIcO_924THocI_T9MvCXXnPZPHPL-cbCBv25GNUcF6sVNKCNueaNyDOSKgs-5VUlOELfimxBN84c?PARTNER=WRITER" width=202 border=0&gt;&lt;/a&gt;  &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THodStphb5N9L8wnVxAS_5L4ZQCwG6iqYrBuBF6X8AMYpBSBADcwnpnMXU7y2e-63DeU?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=37 alt="clip_image002" src="http://byfiles.storage.msn.com/y1pIcO_924THofIhXfVX26fccZpl7exiu8XO7c9M_Gf8rswhSsSvUmQxu3xQLd47W8raz-ymRQ_BMY?PARTNER=WRITER" width=211 border=0&gt;&lt;/a&gt;  &lt;tr style="height:28px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;LabVIEW&lt;br&gt;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的使用&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt; &lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THofXv99ibU0UDpJIV0M7UiYBZZMODz0WJ7SkP9sau2pBDs-pzhqVChGRRcqKjqtq19Q?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=58 alt="clip_image002" src="http://byfiles.storage.msn.com/y1pIcO_924THodyuxsZUUAbjNFiY0YHEoBraUwVgQWtsbIsfqVCdV-aYp0z7jwo45GYKF7ca9cO5aA?PARTNER=WRITER" width=176 border=0&gt;&lt;/a&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt; &lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THofKd5tH5QzUlmIFf0CAegYIvoy83Dp0qzKcevnIPYbgrtccNiNbl7ZKChOxPEzOl2Q?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=100 alt="clip_image002[5]" src="http://byfiles.storage.msn.com/y1pIcO_924THodRS1kRTgPdfK1csPYaq2XCZCfaa3pj7LWe04EgXYI_CX9igejQi3hKu7id0R8NcnY?PARTNER=WRITER" width=176 border=0&gt;&lt;/a&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt; &lt;u&gt;&lt;a href="http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!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+%e8%b0%83%e7%94%a8%e5%8a%a8%e6%80%81%e9%93%be%e6%8e%a5%e5%ba%93+4+-+%e7%bb%93%e6%9e%84%e5%9e%8b%e5%8f%82%e6%95%b0%e7%9a%84%e8%ae%be%e7%bd%ae&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!3037.entry#comment</comments><guid isPermaLink="true">http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3037.entry</guid><pubDate>Wed, 09 Apr 2008 10:46:26 GMT</pubDate><slash:comments>4</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!3037/comments/feed.rss</wfw:commentRss><wfw:comment>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3037.entry#comment</wfw:comment><dcterms:modified>2008-05-04T04:32:46Z</dcterms:modified></item><item><title>调用动态链接库 3 - 简单数据类型参数的设置</title><link>http://ruanqizhen.spaces.live.com/Blog/cns!5852D4F797C53FB6!3011.entry</link><description>&lt;p style="margin-left:35pt;text-align:justify"&gt; &lt;p&gt;    复杂问题先从简单地说起，在DLL和LabVIEW之间传递参数，最常用的三种数据类型是：数值类型、字符串、数值型数组。这几种类型的参数配置起来还是比较简单的。 &lt;p style="margin-left:35pt;text-align:justify"&gt; &lt;p&gt;&lt;strong&gt;1. 数值类型&lt;/strong&gt;&lt;br&gt;    LabVIEW 多种不同精度的数值类型与C语言中的数值类型的匹配是相当直观的，比如 4-byte Single 对应 C 语言中的 float。LabVIEW 自带的例子“LabVIEW 8.5\examples\dll\data passing\Call Native Code.llb”中详细的列出了简单数据类型在 LabVIEW 与 C 之间的对应关系。&lt;br&gt;    C 语言中经常把指针，或者数据的地址在函数间传递。在32位操作系统中，可以使用int32数值来表示指针。因此，当需要在LabVIEW中传递指针数据时，可以使用I32或U32数值类型来表示这个地址类型的数据。但是，64位的程序中，数据的地址只能使用I64或U64来表示。这样，如果一个调用了DLL函数的VI，并且函数参数中有地址型数据，使用固定数据类型的数值来表示地址，就要准备两份代码。解决方法就是使用 LabVIEW 中的新的数据类型 Pointer-sized Integer。这个数据类型的长度在不同的平台上会自动使用32位或64位长度。&lt;br&gt;    如果在C语言函数参数声明中有const关键字，可以选中Constant选项。 &lt;p&gt; &lt;div style="margin-left:23pt"&gt; &lt;table style="border-collapse:collapse" border=0&gt; &lt;colgroup&gt; &lt;col style="width:84px"&gt; &lt;col style="width:214px"&gt; &lt;col style="width:230px"&gt; &lt;tbody valign=top&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-left:silver 0.5pt solid;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:宋体"&gt;输入&lt;/span&gt;&lt;span style="font-family:times new roman"&gt;/&lt;/span&gt;&lt;span style="font-family:宋体"&gt;输出&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:宋体"&gt;输入&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:宋体"&gt;输出或兼作输入输出&lt;/span&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;C&lt;/span&gt;&lt;span style="font-family:宋体"&gt;语言声明&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;float red; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;float* red; &lt;tr style="height:21px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;LabVIEW&lt;br&gt;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;中的配置&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://by1.storage.msn.com/y1pH5Es9Ox64kaizaxO3J63rPpUjiPxjo3bilYkPzc1GDaBPxyaniqyouXHckJYk0wIgUqXDvRv78ZeZbB-a3wdcO03gc0BHIRz?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=61 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoc_0AHueZlgd3SVIP2cyvdcajv66iWUfAbyAeemS2lst2nNmR876dfpLw_Q2KIDbuE?PARTNER=WRITER" width=201 border=0&gt;&lt;/a&gt;  &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THofTRMTB7DoGNR09muDvJnhZ92FnjUOXCvDIXVQ94Ukdp9Oo0i3wij0ZeMdUSZG6maU?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=58 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THocOEphCBLw5DYMkdZUuCixzPYLXJjzFxh4Iwn6rNbBffyNZ6eAsZwQXqxajrVqB1Ys?PARTNER=WRITER" width=213 border=0&gt;&lt;/a&gt;  &lt;tr style="height:28px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;LabVIEW&lt;br&gt;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的使用&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THodK9p5lIvmhD3tjwe1S6c5D2JOaysS3MNerSkuljqiWOGT_vQdZLpmhEvmjlSImMDI?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=52 alt=image src="http://by1.storage.msn.com/y1pH5Es9Ox64kYaxyqpaQ9wQuGZaNgQAQ1COsIFT3ltXxLdcUh0Oxt72rlqPQSyDlE46MEWF-PcjbNfAbyyhtMuaepB4s7fhgUw?PARTNER=WRITER" width=124 border=0&gt;&lt;/a&gt;  &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://by1.storage.msn.com/y1pH5Es9Ox64kac4tTS20jKGGnR_M4lgzipRZQbM_AQLIqF3-9xO7i4d-OPdw6DoEzRjEgptRoeMCTy9Ht3y20evIws2MDIZuFm?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=60 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THoc57D0q03XPiJ7QnZ3cNyD9PLKVxcsCxAzJ5LIwnXVU3C1jhg8HkHlPwb2Ltutw2cI?PARTNER=WRITER" width=179 border=0&gt;&lt;/a&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;2. 布尔类型&lt;/strong&gt; &lt;br&gt;    布尔类型在 DLL 函数和 LabVIEW VI 之间传递没有专有的数据类型，是利用数值类型来传递的。输入时先把布尔值转变为数值，在传递给DLL函数；输出时再把数值转为布尔值。 &lt;p&gt; &lt;div style="margin-left:23pt"&gt; &lt;table style="border-collapse:collapse" border=0&gt; &lt;colgroup&gt; &lt;col style="width:84px"&gt; &lt;col style="width:214px"&gt; &lt;col style="width:230px"&gt; &lt;tbody valign=top&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-left:silver 0.5pt solid;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:宋体"&gt;输入&lt;/span&gt;&lt;span style="font-family:times new roman"&gt;/&lt;/span&gt;&lt;span style="font-family:宋体"&gt;输出&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:宋体"&gt;输入&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top:silver 0.5pt solid;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:宋体"&gt;输出或兼作输入输出&lt;/span&gt; &lt;tr style="height:22px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;C&lt;/span&gt;&lt;span style="font-family:宋体"&gt;语言声明&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:times new roman"&gt;bool red;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt;color:black;font-family:times new roman"&gt;bool* red;&lt;/span&gt; &lt;tr style="height:21px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;LabVIEW&lt;br&gt;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;中的配置&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocDmwHto586PLKhoXVJmfPT5nhLDBcGWXl2k9cFLZxpV3HLtVIS-08TIeRzYBCHklM?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=59 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THodr6fgiy75aepHOG9D57Hg03kIWieqas_ZXWni6GjRsDrUUJ0gzU__5o-LeniKQKis?PARTNER=WRITER" width=201 border=0&gt;&lt;/a&gt;  &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO_924THocoJH-P5yBZo5NdHkKyd84mtzUio3RzGXAeJFBC_XlB7TzJqPXZxCZJcXoKLuDvfHY?PARTNER=WRITER"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=60 alt=image src="http://byfiles.storage.msn.com/y1pIcO_924THodKBfjrIokJpAcKxU5VtyAL4KThMbCQE1hE5yULerClJrA0FsJ-Twk6tVvju3rebJI?PARTNER=WRITER" width=216 border=0&gt;&lt;/a&gt;  &lt;tr style="height:28px"&gt; &lt;td style="border-right:silver 0.5pt solid;border-left:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid" valign=center&gt; &lt;p style="text-align:center"&gt;&lt;span style="font-size:9pt"&gt;&lt;strong&gt;&lt;span style="font-family:times new roman"&gt;LabVIEW&lt;br&gt;&lt;/span&gt;&lt;span style="font-family:宋体"&gt;的使用&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;td style="border-right:silver 0.5pt solid;border-top-style:none;border-bottom:silver 0.5pt solid;border-left-style:none"&gt; &lt;p style="text-align:center"&gt;&lt;a href="http://byfiles.storage.msn.com/y1pIcO