<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CHS">
    <title>尘封之地</title>
    <link rel="self" type="application/atom+xml" href="http://blog.rongzhiwang.com/gavin/Atom.aspx" />
    <subtitle type="html">Gavin的技术试验田</subtitle>
    <id>http://blog.rongzhiwang.com/gavin/Default.aspx</id>
    <author>
        <name>Gavin Mok</name>
        <uri>http://blog.rongzhiwang.com/gavin/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="interwis.net Blog Version 3.0.0.0">Subtext</generator>
    <updated>2012-03-21T18:11:44Z</updated>
    <entry>
        <title>动态属性实现方法研究</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2012/03/21/393.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2012/03/21/393.aspx</id>
        <published>2012-03-21T18:11:44Z</published>
        <updated>2012-03-21T18:11:44Z</updated>
        <content type="html">&lt;h1&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:&amp;#xD;&amp;#xA;minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;&amp;#xD;&amp;#xA;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;一、要做什么&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;——可动态调整的对象属性&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;一般来说，我们在开发一个业务系统的时候，会把一个对象的所有属性作为对应数据库表的字段，这样比较直观方便。比如说，我们要保存一个人的信息，比如姓名、年龄、性别等，可以建一个&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;Person&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;表，表里面有&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;name&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;、&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;age&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;、&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;gender&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;等字段。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;但有些时候，我们一开始并不完全知道我们需要什么字段，甚至在系统上线后，仍会发现漏了某些重要的东西。比如说我们要做一个记录人员信息的系统，我们可以知道需要记录一个人的姓名、年龄、性别、职业等。但是假如这个人是运动员，我们就可能还想了解其从事的是哪项体育运动。即使现在我们仍能将所有能想到的字段都添加进数据库表里，但显然难以做到尽善尽美。比如说，对于乒乓球、网球等的运动员，我们可能还想知道他使用的是左手还是右手。如果我们这时候再添加字段的话，对于一个系统来说，极有可能是一个大工程。从数据库安全的角度来说，执行&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;命令往往会被认为是不安全的。这就要求，我们有另外的方法能够动态地去调整数据对象的属性。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;h1&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:&amp;#xD;&amp;#xA;minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;&amp;#xD;&amp;#xA;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;二、怎样做——简单的表结构&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;经过上面的分析我们已经知道了，要实现对象的动态属性，把每个不同的属性都作为数据表对应字段的想法是行不通的。一个简单的方法，是建立一个“属性表”，这个表里保存着所有目前为止能想得到的属性，如姓名、年龄、身高、体重、国籍等，一般来说每个属性都有一个唯一标识。假如现在要添加一个新的属性，只需执行&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;INSERT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;命令就行了（而不是可能会被限制执行的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;ALTER&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;命令）。然后再建立一个“属性值赋值表”，记录下每个人某个属性对应的值。当然人员基本信息表还是需要的。这样一个简单的表结构就完成了。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;在本文后面的例子中，我对此结构进行扩充。在属性表中，我添加了“所属领域”的字段，以区分不同领域的各种属性，方便开发搜索功能；另外增加了一个“属性可取值表”，说明每个属性可能的取值，比如性别可以取值为男、女，国籍可取值为中国、美国、法国等，以方便在某些情况下选择搜索条件。整个表结构如下图：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:&amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language:&amp;#xD;&amp;#xA;ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;img src="/UserUpload/gavin/111.jpg" border="0" alt="" width="466" height="280" /&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;其中，&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TField&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;是领域表，&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPerson&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;是人员信息表，&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TProperty&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;是动态属性的信息表，&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPropertyValue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;是属性可取值表，&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPersonValueSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;是属性值赋值表。为了简便地说明问题，这些表的字段都尽可能的少。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;h1&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:&amp;#xD;&amp;#xA;minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;&amp;#xD;&amp;#xA;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;三、具体应用——搜索与对比&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;增、删、改都能根据表的结构简单地完成，这里的结构上比较具有可玩性的是查。此结构虽然在可扩充性方面比较灵活有优势，但是在搜索时却颇费周折。这就要求我们从一开始对其提供良好的函数库。下面仅列出&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句，具体函数可以参考本文最后的实例中的源代码。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Cambria;mso-ascii-theme-font:major-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;major-fareast;mso-hansi-font-family:Cambria;mso-hansi-theme-font:major-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;、查找一个人员的所有属性及其值&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;所有人员属性值都是保存在&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPersonValueSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;表中的，取出所有&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;PersonID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;为指定值的记录即可：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SELECT * FROM
TPersonValueSet WHERE PersonID = @PersonID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Cambria;mso-ascii-theme-font:major-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;major-fareast;mso-hansi-font-family:Cambria;mso-hansi-theme-font:major-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;、查找可用的搜索条件&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;这个对于搜索来说很重要。比如说，在篮球领域的页面里，我们可以根据其擅长位置来搜索人员；而在软件开发领域的页面里，我们可以根据其常用语言来搜索。我们首先必须让用户知道可以根据什么条件来搜索，然后才能进行下一步的工作。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;首先，要找出指定领域的所有可用于搜索的条件，这个可以从属性表&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TProperty&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;中根据&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;FieldID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;找出来：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SELECT * FROM TProperty
WHERE FieldID = @FieldID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;然后，根据找到的每个属性，可以从属性可取值表中找到所有可搜索的预设值：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SELECT * FROM
TPropertyValue WHERE PropertyID = @PropertyID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;好像都没什么难吧？其实这是因为数据库表结构的基础打得好。而且&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句是一回事，直接在程序上实现，又是另一回事了。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Cambria;mso-ascii-theme-font:major-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;major-fareast;mso-hansi-font-family:Cambria;mso-hansi-theme-font:major-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;、根据已选条件搜索人员&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;选择了搜索条件后，接下来当然是需要搜索结果了。但由于属性不是固定的，事先连有哪些属性都不知道，自然不能在&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;后用一个个的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;AND&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;把搜索条件连接起来。因此，我们得另辟蹊径。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;一切从简单出发。假如只有一个搜索条件，比如说，要搜索篮球领域中，性别为男的人员，我们需要先从&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPersonValueSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;表中找出含有“性别”属性（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;）的，且其值为“男”（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;）的记录的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;PersonID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;，然后用得到的结果在&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPerson&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;表中筛选出篮球领域（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;）的人员。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句如下：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SELECT [ID] FROM TPerson
WHERE FieldID = '2' AND [ID] IN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;(SELECT PersonID FROM
TPersonValueSet WHERE PropertyID = '5' AND PropertyValue = '10')&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;那假如需要多个搜索条件呢？那我们需要扩展一下上面的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句的后半部分，也就是&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;IN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;后面的部分。比如说，要搜索篮球领域中，性别属性为男、国籍属性（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;）为中国（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;）的人员，则我们要在&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPersonValueSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;表中搜索的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;PersonID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;的集合如下图所示：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;img src="/UserUpload/gavin/112.jpg" border="0" alt="" /&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;我们要找的，是性别为男的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;PersonID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;集与国籍为中国的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;PersonID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;集的交集。我们知道，求并集的关键字是&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;UNION&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;，而求交集的关键字是&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;INTERSECT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;。具体的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句如下：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SELECT [ID] FROM TPerson
WHERE FieldID = '2' AND [ID] IN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;(SELECT PersonID FROM
TPersonValueSet WHERE PropertyID = '5' AND PropertyValue = '10'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;INTERSECT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SELECT PersonID FROM
TPersonValueSet WHERE PropertyID = '4' AND PropertyValue = '7')&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;如果需要更多的搜索条件，如此类推地拼接&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句即可。具体应用可查看本文的实例。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Cambria;mso-ascii-theme-font:major-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;major-fareast;mso-hansi-font-family:Cambria;mso-hansi-theme-font:major-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;、人员动态对比&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;如果使用过类似太平洋电脑网的产品对比功能，你一定会深感其便利、直观。如下图：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;img src="/UserUpload/gavin/113.jpg" border="0" alt="" /&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;类似那样的功能，假如是常规的表结构，我们可以很简单地把所有的属性都一一对应地列出来即可。但这样会有一个问题：假如需要新增一个属性（比如图中的“加速技术”，以前是没有这个属性的），那么不但表结构要改，连程序也要改。而假如使用了我们这里的动态属性的表结构，这样的比较就可以非常灵活。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;首先，我们当然需要先找出需要对比的字段。有时我们需要对比的是两者之间共同的属性，但其实更多时候，即使不是共同属性作对比，也是有作用的，比如上图中的“加速技术”，其中两者都没有，则此属性为空；而有此属性的，则显示出了优势。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;具体到本文的例子中，也是找出在各人员中出现过的属性作比较。以“网球”领域为例，“习惯”这个属性只有其中一个人员有记录，但仍然作为对比的属性之一。要找出所有可对比的属性，只需从&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;TPersonValueSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;表中找出各人员有记录的属性的并集即可。比如，要比较“费德勒”（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;15&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;）与“纳达尔”（代码为&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;16&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;），取出两者需对比的属性的&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;语句为：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;(SELECT DISTINCT
PropertyID FROM TPersonValueSet WHERE PersonID = ‘15’)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;UNION&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="color:#1F497D;mso-themecolor:text2"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;(SELECT DISTINCT
PropertyID FROM TPersonValueSet WHERE PersonID = ‘16’)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;接下来的事情就好办了，只需以待比较人员为横轴、以需比较属性为纵轴作一表格，将各人员对应的属性值填写进去即可。如下图：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;img src="/UserUpload/gavin/114.jpg" border="0" alt="" /&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;具体实现方法可参看实例。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;本文实例下载地址（包括&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;asp.net&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;源代码及&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;SQL
Server&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;数据库备份）：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://rongzhiwang.com/NetDisk/DownloadFile.aspx?ID=82ff6fc6321c4d1594198a0ee6c0038f&amp;amp;Code=4cbbcba8"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;http://rongzhiwang.com/NetDisk/DownloadFile.aspx?ID=82ff6fc6321c4d1594198a0ee6c0038f&amp;amp;Code=4cbbcba8&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/393.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/393.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/393.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/393.aspx</trackback:ping>
    </entry>
    <entry>
        <title>写个好玩的程序——文字拼图</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2012/02/08/201.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2012/02/08/201.aspx</id>
        <published>2012-02-08T10:27:49Z</published>
        <updated>2012-02-08T10:27:49Z</updated>
        <content type="html">&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;身为一个合格的程序员，当然不能把写代码单纯地当作谋生的途径，有时还是应该写些简单的程序来调剂一下生活，这样才不会让自己觉得写程序太枯燥嘛。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;比如最近看到有人把某明星的照片变成文字组成的图片，故且称为“文字拼图”吧，大概像下面那样：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;原照片：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;img src="/UserUpload/gavin/image1.jpeg" border="0" alt="" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;文字图片：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;img src="/UserUpload/gavin/image2.jpeg" border="0" alt="" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;看得不清楚的话，往后退几步应该就能看清了。近视的同学在看这图片的时候有着天然的优势。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;这样一个功能，毫无疑问可以通过编程得到，而且这个程序我想每个程序员都应该能轻松地写出来。简单来说，就是依次读取一张图片的所有像素，然后判断，颜色深的用笔划多的字代替，颜色浅的用笔划少的字代替。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;后来在实际做的过程中，我发现这样的话生成的文件往往太大了，一个&lt;/span&gt;&lt;span lang="EN-US"&gt;200*200&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:&amp;#xD;&amp;#xA;Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;的小图片，生成的文字图片中，一行文字就超出了屏幕范围，实际意义不大。所以我稍微修改一下，每&lt;/span&gt;&lt;span lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;个像素取样一次，取其颜色的平均值即可。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;最麻烦的地方还是在于文字的选择，有些笔划多的字，看上去并不那么的“黑”。所以需要多次调试，找出最佳的方案。另外，出于简便起见，我没有对&lt;/span&gt;&lt;span lang="EN-US"&gt;255&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;个颜色值都对应相应的文字，而是每&lt;/span&gt;&lt;span lang="EN-US"&gt;13&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;个值对应一个文字。这样只需要找出最佳的&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;个文字就可以了，反正人眼也不能识别那么细微的颜色差别。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;经过多次调试，我确定了以下&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;个文字：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:18.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:blue;mso-font-kerning:0pt;&amp;#xD;&amp;#xA;mso-no-proof:yes"&gt;string&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;[] text = { &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;翻&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;鹏&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;铺&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;莫&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;闻&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;国&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;纬&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;医&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;问&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;五&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;王&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;午&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;立&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;小&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;三&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;十&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;二&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;一&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;，&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt;, &lt;span style="color:#A31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;color:#A31515;mso-font-kerning:0pt;mso-no-proof:yes"&gt;、&lt;span lang="EN-US"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt; };&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;首先，我们需要先载入图像：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:18.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:#2B91AF;mso-font-kerning:0pt;&amp;#xD;&amp;#xA;mso-no-proof:yes"&gt;Bitmap&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;&amp;#xD;&amp;#xA;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;#xD;&amp;#xA;&amp;quot;Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-no-proof:yes"&gt; bmp = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Bitmap&lt;/span&gt;(fileName);&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;然后，算出图像的尺寸：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:18.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:blue;mso-font-kerning:0pt;&amp;#xD;&amp;#xA;mso-no-proof:yes"&gt;int&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt; w = bmp.Width;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:18.0pt;mso-char-indent-count:2.0"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:blue;mso-font-kerning:0pt;&amp;#xD;&amp;#xA;mso-no-proof:yes"&gt;int&lt;/span&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt; h = bmp.Height;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;接着，自然就是读取每个点的颜色值了：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;[,] R = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt;[w, h];&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;[,] G = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt;[w, h];&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;[,] B = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt;[w, h];&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;[,] gray = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;int&lt;/span&gt;[w, h];&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; i = 0; i
&amp;lt; w; i++)&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:2"&gt;         &lt;/span&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; j = 0; j
&amp;lt; h; j++)&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;span style="color:#2B91AF"&gt;Color&lt;/span&gt; color = bmp.GetPixel(i, j);&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;R[i,
j] = color.R;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;G[i,
j] = color.G;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;B[i,
j] = color.B;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;gray[i,
j] = (R[i, j] + G[i, j] + B[i, j]) / 3;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:2"&gt;         &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;对于每个像素，红、绿、蓝三色值的平均值就是该像素的灰度值。值越大，表示颜色越浅，我们就应该用越少笔划的文字来代替。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;我们前面说过，每三个像素取样一次，然后算出其颜色的平均值，写入指定的文字即可：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; i = 0; i
&amp;lt; h; i+=s)&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:1"&gt;     &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:2"&gt;         &lt;/span&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; j = 0; j
&amp;lt; w; j+=s)&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:2"&gt;         &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt; gl = 255;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt; gm = 0;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt; count = 0;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; k = 0; k
&amp;lt; s &amp;amp;&amp;amp; j + k &amp;lt; w; k++)&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:4"&gt;                   &lt;/span&gt;&lt;span style="color:blue"&gt;for&lt;/span&gt; (&lt;span style="color:blue"&gt;int&lt;/span&gt; l = 0; l
&amp;lt; s &amp;amp;&amp;amp; i + l &amp;lt; h; l++)&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:4"&gt;                   &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:5"&gt;                       &lt;/span&gt;gm
+= gray[j + k, i + l];&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:5"&gt;                       &lt;/span&gt;count++;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:4"&gt;                   &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;gl
= gm / count;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:3"&gt;              &lt;/span&gt;&lt;span style="color:#2B91AF"&gt;File&lt;/span&gt;.AppendAllText(saveFile, text[gl / 13]);&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:2"&gt;         &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:&amp;#xD;&amp;#xA;none;text-autospace:none"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;font-family:&amp;#xD;&amp;#xA;新宋体;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;&amp;#xD;&amp;#xA;mso-font-kerning:0pt;mso-no-proof:yes"&gt;&lt;span style="mso-tab-count:2"&gt;         &lt;/span&gt;&lt;span style="color:#2B91AF"&gt;File&lt;/span&gt;.AppendAllText(saveFile, &lt;span style="color:#2B91AF"&gt;Environment&lt;/span&gt;.NewLine);&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;#xD;&amp;#xA;宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;&amp;#xD;&amp;#xA;mso-hansi-theme-font:minor-latin"&gt;这里&lt;/span&gt;&lt;span lang="EN-US"&gt;s&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;是定义好的常量，值为&lt;/span&gt;&lt;span lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;这样，我们就简单地完成了这个简单的程序。我们很容易想到，这个程序对于一些灰度颜色对比比较明显的图效果会较好，而对比不明显的，则效果会不那么理想。比如下面的：&lt;/span&gt;
&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;img src="/UserUpload/gavin/image3.jpeg" border="0" alt="" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;img src="/UserUpload/gavin/image4.jpeg" border="0" alt="" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;#xD;&amp;#xA;宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;&amp;#xD;&amp;#xA;mso-hansi-theme-font:minor-latin"&gt;脸部和背景的颜色相关不大，导致融了在一起。当然近视的同学还是能看出一点端倪的。&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;#xD;&amp;#xA;宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;&amp;#xD;&amp;#xA;mso-hansi-theme-font:minor-latin"&gt;本程序的下载地址（需要&lt;/span&gt;&lt;span lang="EN-US"&gt;.net
framework&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;&amp;#xD;&amp;#xA;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:宋体;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin"&gt;才能运行）：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://rongzhiwang.com/NetDisk/DownloadFile.aspx?ID=48bc34c7e80b4798a4d457f3fa642f0e&amp;amp;Code=40ab0f0a"&gt;http://rongzhiwang.com/NetDisk/DownloadFile.aspx?ID=48bc34c7e80b4798a4d457f3fa642f0e&amp;amp;Code=40ab0f0a&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;#xD;&amp;#xA;宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;&amp;#xD;&amp;#xA;mso-hansi-theme-font:minor-latin"&gt;源代码（&lt;/span&gt;&lt;span lang="EN-US"&gt;C#&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;）下载地址：&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://rongzhiwang.com/NetDisk/DownloadFile.aspx?ID=a5350247dd4346f28d7dd9166aacf1f3&amp;amp;Code=50271196"&gt;http://rongzhiwang.com/NetDisk/DownloadFile.aspx?ID=a5350247dd4346f28d7dd9166aacf1f3&amp;amp;Code=50271196&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:&amp;#xD;&amp;#xA;宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:Calibri;&amp;#xD;&amp;#xA;mso-hansi-theme-font:minor-latin"&gt;测试时建议使用尺寸不太大的图片，最大&lt;/span&gt;&lt;span lang="EN-US"&gt;200*200&lt;/span&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;就够了，不然的话文字要么换行了，要么超出显示器的显示范围了，就看不到什么效果了。&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:10.5pt;mso-bidi-font-size:11.0pt;font-family:宋体;&amp;#xD;&amp;#xA;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;mso-fareast-theme-font:&amp;#xD;&amp;#xA;minor-fareast;mso-hansi-font-family:Calibri;mso-hansi-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi;&amp;#xD;&amp;#xA;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;p&gt; &lt;/p&gt;
&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"&gt;&lt;span style="font-family:宋体;mso-ascii-font-family:Calibri;mso-ascii-theme-font:minor-latin;&amp;#xD;&amp;#xA;mso-fareast-font-family:宋体;mso-fareast-theme-font:minor-fareast;mso-hansi-font-family:&amp;#xD;&amp;#xA;Calibri;mso-hansi-theme-font:minor-latin"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/201.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/201.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/201.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/201.aspx</trackback:ping>
    </entry>
    <entry>
        <title>网页输入模板技术研究与实现</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2011/11/22/192.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2011/11/22/192.aspx</id>
        <published>2011-11-22T22:59:32Z</published>
        <updated>2011-11-22T23:01:39Z</updated>
        <content type="html"> &lt;span&gt;融智服务商城中，提交订单所用到的输入模板是我从融智网开发一开始就在考虑的一个问题。很早之前就想搞这样的功能，但当时的技术积累还不够，所以一直推迟到最近才真正完成。在此之前，只好采取往输入框中预先填入引导性内容的办法。&lt;/span&gt;
&lt;h1 style="font-size: 18pt"&gt;&lt;span&gt;要做成什么样子？&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;首先说说我想实现的效果。&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;一般来说，用户在进行一些需要说明各种参数的操作——比如下订单——的时候，要往一个输入框里填写特定的内容。比如说，我要购买一个域名，那么需要填写想购买的域名、是否同时购买网站空间、国内还是国外空间等。页面一打开的时候，显示一个普通的输入框，但当用户点击该输入框，则显示出引导用户选择的提示内容，如下图：&lt;/span&gt; &lt;/div&gt;
&lt;div&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/1.jpg" /&gt;&lt;/div&gt;
&lt;div&gt;  &lt;/div&gt;
&lt;div style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;用户把“暂定域名”、“时间要求”填写上，并选择好“是否需要网站空间”、“国内&lt;/span&gt;&lt;span lang="EN-US"&gt;/&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;国外空间”后，点击“确定”，则根据用户的输入往输入框中填写相关的内容，如下两图：&lt;/span&gt;
&lt;div&gt; &lt;/div&gt;
&lt;img border="0" alt="" src="/UserUpload/gavin/2.jpg" /&gt; &lt;/div&gt;
&lt;div style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"&gt;（填写或选择内容）&lt;/span&gt;
&lt;div&gt; &lt;/div&gt;
&lt;img border="0" alt="" src="/UserUpload/gavin/3.jpg" /&gt;&lt;/div&gt;
&lt;div style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt; &lt;span&gt;（自动填充输入框）&lt;/span&gt;&lt;/div&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt; &lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;这个功能实际上要解决的问题可不像看上去那么简单。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;首先，模板应该是可以编辑的，也就是说，我可能往模板中添加或删除一个属性，或者修改里面的文字与显示方式，甚至是增加若干个可选择的模板。因此，不能简单地把页面写死，否则维护成本会很高。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;其次，应该可以根据输入框中已有的内容找出匹配的模板，并自动填充好模板中的控件。&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="text-indent: 21pt; font-size: 18pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;大致怎样做？&lt;/span&gt;&lt;/h1&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;任何大问题都是由若干个小问题组成的，我们可以把这个问题分解成以下各个小问题，每个小问题都是实现整个需求的一个步骤。那么，为了完成输入模板的功能，我们需要解决以下小问题：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;1、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;模板的格式怎样定义？&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;2、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;模板保存在哪里？&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;3、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;页面上通过什么方式获取模板&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;4、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;怎样把获取到的模板显示出来？&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;5、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;用户填写好模板后，怎样把模板中控件的值根据设定的形式填入输入框中？&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;6、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;怎样根据输入框中已有的内容选择匹配的模板？&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;7、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;怎样根据输入框中已有的内容设置已匹配的模板的各个控件的值？&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;8、 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;是否可以兼容各个浏览器？&lt;/span&gt;&lt;/p&gt;
&lt;h1 style="text-indent: 21pt; font-size: 18pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;具体如何做？&lt;/span&gt;&lt;/h1&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;、模板的格式怎样定义？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;由于我们需要把模板的内容填充到输入框中，为便于处理，模板保存的形式应该是字符串。但这个格式应该是怎样的呢？一开始，我是打算把模板保存成&lt;/span&gt;&lt;span&gt;XML&lt;/span&gt;&lt;span&gt;文件形式的，这样显得规范，而且便于处理。但在与俊杰讨论的过程中，他问了我一个问题：为什么不直接用&lt;/span&gt;&lt;span&gt;HTML&lt;/span&gt;&lt;span&gt;呢？我想了想，假如直接把模板保存成&lt;/span&gt;&lt;span&gt;HTML&lt;/span&gt;&lt;span&gt;的话，似乎能够十分方便地显示，取值什么的也相当简单，那没理由不这样做。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;但每个模板只保存一个&lt;/span&gt;&lt;span&gt;HTML&lt;/span&gt;&lt;span&gt;形式的字符串就足够了吗？由于我们填充到输入框中的内容与显示出来的模板可以有明显的不同，因此，每一个模板我们需要维护两个值，一个用于展现模板便于用户输入，另一个用于填充到输入框中。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;最终，我确定了模板的格式如下：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;模板的用于展示的部分就是普通的&lt;/span&gt;&lt;span&gt;HTML&lt;/span&gt;&lt;span&gt;格式的字符串，每个用于让用户输入或选择的控件均有一个&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;的形式为“&lt;/span&gt;&lt;span&gt;ModValue[&lt;/span&gt;&lt;span&gt;数字标识&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;”，如“&lt;/span&gt;&lt;span&gt;ModValue0&lt;/span&gt;&lt;span&gt;”、“&lt;/span&gt;&lt;span&gt;ModValue1&lt;/span&gt;&lt;span&gt;”。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;模板的用于填充的部分就是普通的文本，但在用于接收用户输入或选择的值的位置预留格式化的字符，我让其规定为“&lt;/span&gt;&lt;span&gt;{[&lt;/span&gt;&lt;span&gt;数字标识&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;span&gt;”的形式，如“&lt;/span&gt;&lt;span&gt;{0}&lt;/span&gt;&lt;span&gt;”、“&lt;/span&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;”。&lt;/span&gt;&lt;span&gt;{0}&lt;/span&gt;&lt;span&gt;的位置用于接收&lt;/span&gt;&lt;span&gt;ModValue0&lt;/span&gt;&lt;span&gt;控件的值，&lt;/span&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;的位置用于接收&lt;/span&gt;&lt;span&gt;ModValue1&lt;/span&gt;&lt;span&gt;的值，如此类推，一一对应。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;如上面的图中的模板，其格式如下：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;展示部分：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span&gt;暂定域名&lt;/span&gt;&lt;span&gt;:&amp;lt;/span&amp;gt;&amp;lt;input id='ModValue0' type='text'/&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span&gt;是否需要网站空间&lt;/span&gt;&lt;span&gt;:&amp;lt;/span&amp;gt;&amp;lt;select id='ModValue1'&amp;gt;&amp;lt;option value='&lt;/span&gt;&lt;span&gt;需要&lt;/span&gt;&lt;span&gt;'&amp;gt;&lt;/span&gt;&lt;span&gt;是&lt;/span&gt;&lt;span&gt;&amp;lt;/option&amp;gt;&amp;lt;option value='&lt;/span&gt;&lt;span&gt;不需要&lt;/span&gt;&lt;span&gt;'&amp;gt;&lt;/span&gt;&lt;span&gt;否&lt;/span&gt;&lt;span&gt;&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;span&gt;时间要求：&lt;/span&gt;&lt;span&gt;&amp;lt;input id='ModValue2' type='text'/&amp;gt;&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;span&gt;国内&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;国外空间&lt;/span&gt;&lt;span&gt;&amp;lt;select id='ModValue3'&amp;gt;&amp;lt;option&amp;gt;&lt;/span&gt;&lt;span&gt;国内&lt;/span&gt;&lt;span&gt;&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;&lt;/span&gt;&lt;span&gt;国外&lt;/span&gt;&lt;span&gt;&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;填充部分：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;暂定域名：&lt;/span&gt;&lt;span&gt;{0}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;网站空间&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;时间要求：&lt;/span&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;{3}&lt;/span&gt;&lt;span&gt;空间&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;、模板保存在哪里？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;可以用任何方式保存，但建议保存到数据库中，便于随时增删改。我一开始是想保存到配置文件中的，但考虑到减少自己的工作量，把模板的维护工作分发给别人，我还是决定保存到数据库。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;由于这个不算十分重要的问题，本文的示例源代码中为了便于说明关键问题，我把模板写死到代码中（&lt;/span&gt;&lt;span&gt;hard code&lt;/span&gt;&lt;span&gt;）。实际使用过程中，应该是每个程序员都能轻易地改为从数据库中获取的。&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;、页面上通过什么方式获取模板&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;有两种方法：页面载入的时候就把相关模板的数据全部载入；或者使用&lt;/span&gt;&lt;span&gt;AJAX&lt;/span&gt;&lt;span&gt;，在需要使用模板编辑的时候才载入。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;两种方法各有优劣，应该不必叙述太多了。我个人倾向于后一种方法，这样不会把页面的源代码搞得太复杂，反正在一个页面中不会频繁的载入和使用模板。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;由于模板不只一个，因此获取到的应该是模板的集合；而由于一个模板可以包含多个属性（比如&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;、显示部分、填充部分、适用范围等），因此获取到的结果应该能表达这些序列化的内容。可以根据个人喜好选择返回&lt;/span&gt;&lt;span&gt;XML&lt;/span&gt;&lt;span&gt;或者&lt;/span&gt;&lt;span&gt;Json&lt;/span&gt;&lt;span&gt;，而页面上则对获取到的结果进行处理。在示例源代码中，我选择使用&lt;/span&gt;&lt;span&gt;Json&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;根据我的开发需要，在示例源代码中，模板对象包含以下属性：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;：唯一标识，用于区分不同的模板；&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;Name&lt;/span&gt;&lt;span&gt;：模板名称，便于用户手动选择模板；&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;Category&lt;/span&gt;&lt;span&gt;：模板的类型，这是业务需要，即使没有这个属性模板也可以运行的；&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;InputFormat&lt;/span&gt;&lt;span&gt;：输入格式，即模板的展示部分；&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;OutputFormat&lt;/span&gt;&lt;span&gt;：输出格式，即模板的填充部分；&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;TechicalField&lt;/span&gt;&lt;span&gt;：相关技能，非必要，我用这个属性来根据不同的页面选择最优先显示的模板而已。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;、怎样把获取到的模板显示出来？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;由于我们在定义模板格式的时候，选择了使用普通&lt;/span&gt;&lt;span&gt;HTML&lt;/span&gt;&lt;span&gt;格式的字符串来表示用于展示的部分，因此，我们在显示模板的时候基本上就没有任何难度了，直接用&lt;/span&gt;&lt;span&gt;Javascript&lt;/span&gt;&lt;span&gt;把展示部分的格式赋值给页面上特定的元素即可，比如&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;。如（假设已把展示部分的格式赋值给变量&lt;/span&gt;&lt;span&gt;InputModule&lt;/span&gt;&lt;span&gt;）：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;$(“#DivModule”).html(InputModule);&lt;span&gt;    &lt;/span&gt;//jquery&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;或&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;document.getElementById(“DivModule”).innerHTML(InputModule); //&lt;/span&gt;&lt;span&gt;原生&lt;/span&gt;&lt;span&gt;javascript&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;、怎样把模板中控件的值根据设定的形式填入输入框中？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;这里需要分为两个步骤：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;）取出页面上所有&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;形如“&lt;/span&gt;&lt;span&gt;ModValue[&lt;/span&gt;&lt;span&gt;数字标识&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;”的控件的值，并格式化模板的填充部分的格式。为了完成这一步骤，我们需要定义一个&lt;/span&gt;&lt;span&gt;javascript&lt;/span&gt;&lt;span&gt;函数&lt;/span&gt;&lt;span&gt;ArrayFormat(str,arr)&lt;/span&gt;&lt;span&gt;，这个函数的作用是用数组&lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;的元素格式化字符串&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;中的&lt;/span&gt;&lt;span&gt;{0}&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;span&gt;等，并返回格式化后的字符串。由于我们在定义上的严格控制，&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;中待格式化的个数应该等于数据&lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;的元素个数&lt;/span&gt;&lt;span&gt;(arr.length)&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;我定义的&lt;/span&gt;&lt;span&gt;ArrayFormat(str,arr)&lt;/span&gt;&lt;span&gt;函数如下：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;function ArrayFormat(str, arr)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;if(arguments.length == 0)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;return null; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;for(var i=0;i&amp;lt;arr.length;i++)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;var re = new RegExp('\\{' + (i) + '\\}','gm');&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;str = str.replace(re, arr[i]);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;return str;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;）将格式化后的字符串赋值到输入框中，这个比较简单，但我建议直接给&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;document.getElementById(“***”).value &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;赋值，因为在测试的过程中，我发现对于&lt;/span&gt;&lt;span&gt;textarea&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;jquery&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;$(“#***”).val()&lt;/span&gt;&lt;span&gt;在不同的浏览器有不同的表现。当然，如果你可以把这个问题解决的话，就最好不过。&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;、怎样根据输入框中已有的内容选择匹配的模板？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;至此，我们已经能够用模板往输入框中填入内容了。但根据已有内容选择匹配的模板，并设置模板中的值，才是最麻烦的问题。这里开始，采用正则表达式算是最简单最直观的方法了。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;我们假设已经把所有的模板对象获取，并且保存到&lt;/span&gt;&lt;span&gt;moduleObj&lt;/span&gt;&lt;span&gt;数组中。之所以可以这样假设，是因为我们在需要选择匹配模板的场合，必然是需要把模板显示出来的；而在模板显示出来之前必然需要获取所有模板。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;遍历&lt;/span&gt;&lt;span&gt;moduleObj&lt;/span&gt;&lt;span&gt;数组，使用&lt;/span&gt;&lt;span&gt;Javascript&lt;/span&gt;&lt;span&gt;内置的&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;函数判断一个模板是否与已有内容匹配。如果匹配，则返回该模板的&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;，以便下一步使用。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;由于在正则表达式中，换行符的情况比较特殊（比如&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;是表示除了换行符以外的所有字符，又比如&lt;/span&gt;&lt;span&gt;IE&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Firefox&lt;/span&gt;&lt;span&gt;对换行符的定义有所不同等），必须先对其作一些处理。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;选择匹配模板的函数如下：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;function matchModule(str)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;for(var j = 0; j &amp;lt; moduleObj.length; j++)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;var tempFormat = AllFormat(moduleObj[j].OutputFormat,".*");&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;&lt;span&gt;                   &lt;/span&gt;var re = new RegExp('(\r)*(\n)+','gm');&lt;span&gt;   &lt;/span&gt;//&lt;/span&gt;&lt;span&gt;处理换行符&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;var nStr = str.replace(re,'&amp;lt;br /&amp;gt;');&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;var nTemp = tempFormat.replace(re,'&amp;lt;br /&amp;gt;');&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;                   &lt;/span&gt;if(nStr.match(nTemp)) return moduleObj[j].ID;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;return 0;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;、怎样根据输入框中已有的内容设置已匹配的模板的各个控件的值？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;既然我们已经选择了匹配的模板，那把已有的内容设置到模板中的各个控件中，就不是一件难事了。来到这里，最大的问题就是，如何从已有的内容中，分离出模板的填充部分的变量值。比如说，假设模板的填充部分为&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;暂定域名：&lt;/span&gt;&lt;span&gt;{0}\r\n{1}&lt;/span&gt;&lt;span&gt;网站空间&lt;/span&gt;&lt;span&gt;\r\n&lt;/span&gt;&lt;span&gt;时间要求：&lt;/span&gt;&lt;span&gt;{2}\r\n{3}&lt;/span&gt;&lt;span&gt;空间&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;，已有内容为&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;暂定域名：&lt;/span&gt;&lt;span&gt;t.cn\r\n&lt;/span&gt;&lt;span&gt;需要网站空间&lt;/span&gt;&lt;span&gt;\r\n&lt;/span&gt;&lt;span&gt;时间要求：一天完成&lt;/span&gt;&lt;span&gt;\r\n&lt;/span&gt;&lt;span&gt;国内空间&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;，那么我们需要从已有内容中找出的值应该是：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;t.cn&lt;/span&gt;&lt;span&gt;、需要、一天完成、国内&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;，然后再用这些内容给模板的展示部分赋值。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;为此，我们应该能第一时间想到&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span&gt;函数。我们只要能够通过模板的填充部分构造出一个正则表达式，然后用这个正则表达式把已有内容分割即可。不难想到，只要我们把模板的填充部分的参数位全部用“&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;”代替，就是一个合适的正则表达式（尽管会有冗余的地方）。在上面的例子中，构造出的正则表达式如下：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; color: #3366ff; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;暂定域名：&lt;/span&gt;&lt;span&gt;|\r\n|&lt;/span&gt;&lt;span&gt;网站空间&lt;/span&gt;&lt;span&gt;\r\n&lt;/span&gt;&lt;span&gt;时间要求：&lt;/span&gt;&lt;span&gt;|\r\n|&lt;/span&gt;&lt;span&gt;空间&lt;/span&gt;&lt;strong /&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;为了实现这样的功能，我们需要一个&lt;/span&gt;&lt;span&gt;AllFormat(str, formatStr)&lt;/span&gt;&lt;span&gt;函数，这个函数的作用是用&lt;/span&gt;&lt;span&gt;formatStr&lt;/span&gt;&lt;span&gt;字符串代替&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;字符串中的所有参数。我定义的&lt;/span&gt;&lt;span&gt;AllFormat(str, formatStr)&lt;/span&gt;&lt;span&gt;函数如下：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;function AllFormat(str, formatStr)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;var re = new RegExp('{\\d*}','gm');&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;var newStr = str.replace(re,formatStr);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;return newStr;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;注意：对于正则表达式的最后为“&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;”的情况，也许需要特殊处理。另外，有可能在原内容中，对应的变量的位置其值为空（比如说，在模板中填写信息的时候留空了），这种情况比较难处理；为了简化开发过程，我选择了忽略这个问题。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;至此，我们已经获得了待设置到模板的显示部分的控件的所有变量，假设这些变量存储在&lt;/span&gt;&lt;span&gt;parms&lt;/span&gt;&lt;span&gt;数组中。我们就可以遍历这个数组，用其中的元素的值来为模板的显示部分的控件赋值。由于我们前面严格定义了模板的显示部分，因此我们可以简单地用如下方法来赋值：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;for(i = 0; i &amp;lt; parms.length; i++)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;&lt;span&gt;                   &lt;/span&gt;$("#ModValue"+i).val(parms[i]);&lt;span&gt;      &lt;/span&gt;//&lt;/span&gt;&lt;span&gt;为模板内的变量赋值&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span style="color: #3366ff"&gt;&lt;span&gt;         &lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;、是否可以兼容各个浏览器？&lt;/span&gt;&lt;/h2&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;在开发的过程中，我确实遇到了浏览器兼容性相关的很多问题，也尝试了各种各样的方法来解决这些问题。目前看来，这些问题都得到了较好的解决。至于是否仍有其他地雷，唯有在以后的使用过程中不断发现并解决了。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt; &lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;写到这里，我们已经解决了所有的关键性问题了。当然，还有很多的细节问题是需要考虑的，比如说数据库表定义方法、代码效率等，又比如说对于页面其它控件及输入内容的限制（页面上其它控件的&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;不能类似于“&lt;/span&gt;&lt;span&gt;ModValue0&lt;/span&gt;&lt;span&gt;”、“&lt;/span&gt;&lt;span&gt;ModValue1&lt;/span&gt;&lt;span&gt;”，某些内容不能出现“&lt;/span&gt;&lt;span&gt;{0}&lt;/span&gt;&lt;span&gt;”、“&lt;/span&gt;&lt;span&gt;{1}&lt;/span&gt;&lt;span&gt;”等），但这些问题都是可以在实际开发过程中一一解决的。&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;本文的示例源代码（&lt;/span&gt;&lt;span&gt;asp.net&lt;/span&gt;&lt;span&gt;）可在这里下载：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;a href="http://www.interwis.net/NetDisk/DownloadFile.aspx?ID=7a493d7283304ed680a267f01bafa86e&amp;amp;Code=7ff07699"&gt;http://www.interwis.net/NetDisk/DownloadFile.aspx?ID=7a493d7283304ed680a267f01bafa86e&amp;amp;Code=7ff07699&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;假如你对以下内容有基本的了解，你可以轻松的看懂这份源代码：&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;1） &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Javascript&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;Jquery&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;Json&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;AJAX&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;2） &lt;/span&gt;&lt;/span&gt;&lt;span&gt;正则表达式&lt;/span&gt;&lt;/p&gt;
&lt;div style="text-indent: 21pt; mso-char-indent-count: 2.0" class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;3） &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Asp.net&lt;/span&gt;&lt;span&gt;（非必要，后台处理代码可以很简单地改用&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;jsp&lt;/span&gt;&lt;span&gt;等实现）&lt;/span&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;谢谢！&lt;/div&gt;
&lt;/div&gt;

&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/192.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/192.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/192.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/192.aspx</trackback:ping>
    </entry>
    <entry>
        <title>从地铁看用户体验——融智网用户体验的自我反省</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2011/05/10/179.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2011/05/10/179.aspx</id>
        <published>2011-05-10T18:49:56Z</published>
        <updated>2011-05-11T19:06:29Z</updated>
        <content type="html">&lt;p&gt;　　天天坐地铁，除了挤了点之外，一直以为广州地铁的用户体验做得还算好，也许是习惯了吧。 &lt;/p&gt;
&lt;p&gt;　　但是，其实对于第一次坐地铁的人来说，却是另一回事。&lt;/p&gt;
&lt;p&gt;　　我自己就给好几十个人解释过在体育西路站怎么换乘、从这个站到那个站要乘哪个方向的列车在哪个站换乘等。或许你会说：不是有线路图吗？一看就清楚了啊。是的，其实地铁的线路图对我而言是很清晰明了的，站内的列车方向指示也是很清楚明白的。通过结合这两者，我就清楚地知道从西门口站到华师站，需要在一号线乘往广州东站方向的列车，在体育西路站换乘三号线往天河客运站方向，在华师站记得下车就是。但是，对于“地铁新手”而言，他们也许看得一头雾水，又也许也明白这个过程，但他们就是不敢确定，于是就找些看上去熟行熟路的人确认一下。毕竟，假如不幸自己理解错了，那不但是浪费时间，还可能迷路了。&lt;/p&gt;
&lt;p&gt;　　联想到融智网来吧。其实，即使在页面上有着明显的流程提示，但似乎仍然有很多用户不知道自己接下来应该干什么。这有可能是流程图本身意义不明确的原因，但还有个可能的原因是用户本身的不确定情绪。他心里会想：流程图说我现在可以提交方案了，但确实是这样吗？当然，另一个比较尴尬的情景是：我从哪提交方案？&lt;/p&gt;
&lt;p&gt;　　图示是比文字来得直观，但仍然不够直观。最直观的其实是实例，正如“地铁老手”的经验或现身说法一样。&lt;/p&gt;
&lt;p&gt;　　有时候还会见到有人拿着车票站在出闸口手足无措，不知道应该如何办。他可能看到其他人拿着羊城通在闸口感应区一碰，门就打开了，然后就潇洒地走出去。但他自己无论怎么碰怎么敲怎么撞，门就是不肯开，于是他纳闷了。他不知道他应该把票直接投进闸机回收口去（我忘了那个小孔叫什么了）。一般这种情况下，总会有地铁工作人员在不远处喊：“投进去，你投进去就行啦。”他其实也听到，但肯定不明白指的是什么东西，也许还以为人家在说粗口叫他快点投胎。在一号线还有一些闸机是推式的，即使把票投进去了，它也不会自动开，需要乘客推着走过去。于是我又常常见到一些乘客站在那里发呆，似乎是在等待着发生什么故事。这时一般来说旁边又会有工作人员对他喊：“过去，你直接推过去就行啦。”但他听着还是不明白，似乎是不知道这个“推”是什么动作。还有更奇葩的，是在进站口站在已经打开的自动闸门前发愣的乘客，他似乎是不相信票还在自己手中但可以进去，然后超时了，门又自动关上了，然后无论怎么刷，都是“请到票务处”。这种情况我觉得无法解释。&lt;/p&gt;
&lt;p&gt;　　由此可以得出结论：你不但不能把每个用户都想象成为聪明的人，相反，你应该认为每个用户都是很笨的。最好的用户体验应该是能提供傻瓜式的操作的，而不是还要有个学习的过程。Linux可以在计算机相关专业人员之间非常流行，却无法成为大众主流。在处理融智网的业务过程中，我发现了很多用户的“误操作”。比如有一次，接包方用户在未收到项目奖金的情况下就结束了项目，结果之后肯定就收不到款了。我起初以为是提示信息不够，但后来一检查，发现已经连续两次醒目地提醒用户，“假如现在结束项目，剩余的***元项目款项将返还给发包方”，甚至动用了弹窗手段，但用户还是坚定点了“确定”。这种情况出现的话，怪用户不细看吗？只能怪平台本身体验不好。&lt;/p&gt;
&lt;p&gt;　　所以说，流程还是要优化，但如何优化才是最佳、最直观？&lt;/p&gt;
&lt;p&gt;　　完善帮助文档，有用吗？其实帮助文档用处是极微的，100个用户中也许有半个会去看，因为用户都是很懒的。地铁里也有“乘车指南”，你见过有多少人会站在那里细看？又有多少人在看过之后能够无忧地乘车？即使是各种图示、箭头如此的明显、直观，仍然有这么多人一头雾水，更别说文字性的说明了。&lt;/p&gt;
&lt;div&gt;　　能怪用户太懒吗？只能说，我们辜负了用户的期望。用户在使用前，可能会在脑海里就有了自己的设想，哪会先去看你的文档？最终他用起来却发现是另一回事，这时他是先怪罪于你，还是怪自己没仔细研究过呢？&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//2011年5月11日更新：&lt;/div&gt;
&lt;div&gt;　　今天在经纪人后台管理功能中遇到的问题，让我更加确信这一点：帮助文档可以直接地说是没用的。用户在使用你的产品前已经有了自己的思维定势，一旦最终不是按照他想的那样去运行，他第一反应肯定就是：这系统太垃圾了。他不会知道，其实那个22页的帮助文档里对他遇到的问题已经有了相应的说明。&lt;/div&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/179.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/179.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/179.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/179.aspx</trackback:ping>
    </entry>
    <entry>
        <title>智客alpha0.1，欢迎下载试用</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2011/01/30/alpha0.1.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2011/01/30/alpha0.1.aspx</id>
        <published>2011-01-30T19:39:48Z</published>
        <updated>2011-01-30T19:48:04Z</updated>
        <content type="html">&lt;div&gt;智客alpha0.1，欢迎下载试用。下载地址：&lt;/div&gt;
&lt;div&gt;&lt;font size="3" face="Times New Roman"&gt;&lt;a href="http://www.interwis.net/NetDisk/DownloadFile.aspx?ID=9dafbc5d3e484790baf9a575f33c9e00&amp;amp;Code=69ba2f3e " target="_blank"&gt;&lt;font size="3" face="Times New Roman"&gt;http://www.interwis.net/NetDisk/DownloadFile.aspx?ID=9dafbc5d3e484790baf9a575f33c9e00&amp;amp;Code=69ba2f3e&lt;/font&gt; &lt;/a&gt;&lt;/font&gt;
&lt;div&gt;下载后，解压后直接双击即可，免安装。大小：583.04KB，操作系统：Windows XP 及以上版本。&lt;/div&gt;
&lt;div&gt;使用融智网beta版的用户登录即可，用户名与密码跟融智网beta版的用户名与密码相同。有兴趣参与试用的朋友们可以先在融智网beta版注册用户，beta版的访问方法请与融智网工作人员联系。&lt;/div&gt;
&lt;div&gt;所谓alpha版，就是比beta版还要早期的版本，一般只限于内部测试，在beta版放出之前用于功能性测试等。&lt;/div&gt;
&lt;div&gt;服务器端是用.net开发，便于与融智网的其他功能连接；客户端用的MFC，便于兼容大多数用户电脑。虽然以前用过MFC，但一直没深入，并且这几年还荒废了。重新学习，虽然有一定的基础，但仍倍感艰难。指针溢出、控件自绘等，对于一个用惯了.net从而变懒的人来说，不是容易解决的事，再加上之前也没怎么做过socket编程，于是开发起来一直举步维艰。目前这个alpha版本，估计还会存在很多的功能性问题，还可能由于指针溢出成为各种病毒传播的渠道，所以敬请各位大侠酌情试用。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面是智客alpha0.1的使用截图（由于还没有进行美工工作，界面十分丑陋）：&lt;/div&gt;
&lt;div&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/interwis1.jpg" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/interwis2.jpg" /&gt;  &lt;img border="0" alt="" src="/UserUpload/gavin/interwis3.jpg" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/interwis4.jpg" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/interwis5.jpg" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;目前已有功能：&lt;/div&gt;
&lt;div&gt;1、登录&lt;/div&gt;
&lt;div&gt;2、列出好友列表及与自己有关的项目列表（发布的、参与的，其中报名及进行过项目沟通的视为参与）&lt;/div&gt;
&lt;div&gt;3、好友聊天&lt;/div&gt;
&lt;div&gt;4、项目相关人士（发包方、已报名的、项目沟通留言的）群聊&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;目前还没有，下一版本（alpha0.2）中计划添加的功能：&lt;/div&gt;
&lt;div&gt;1、改进美工&lt;/div&gt;
&lt;div&gt;2、用户在线状态&lt;/div&gt;
&lt;div&gt;3、新消息通知闪烁（目前是相关项变红）&lt;/div&gt;
&lt;div&gt;4、聊天表情&lt;/div&gt;
&lt;div&gt;5、离线留言&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;最可能存在的BUG：&lt;/div&gt;
&lt;div&gt;1、指针溢出，系统出错&lt;/div&gt;
&lt;div&gt;2、好友列表不全&lt;/div&gt;
&lt;div&gt;3、项目列表不全&lt;/div&gt;
&lt;div&gt;4、无法登录&lt;/div&gt;
&lt;div&gt;5、无法打开项目聊天窗口&lt;/div&gt;
&lt;div&gt;6、项目聊天窗口内的相关用户数据出错&lt;/div&gt;
&lt;div&gt;7、各种各样的其他BUG……&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;欢迎持续关注，欢迎给予宝贵意见！&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/170.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/170.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/170.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/170.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Coder or Programmer?</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2010/12/31/coder-or-programmer.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2010/12/31/coder-or-programmer.aspx</id>
        <published>2010-12-31T01:05:25Z</published>
        <updated>2010-12-31T01:11:06Z</updated>
        <content type="html">&lt;div&gt;　　似乎是不知不觉间，在程序员这个岗位上，已经默默无闻地干了快三年。假如算上实习的时间，实际上已经超过三年了。从一开始按照客户需求做项目，到能够按照自己的想法与同事讨论需求，这其中一点一滴的变化，说来耐人寻味。当然，我还是不能凭借自己的想法去天马行空，仍是受到各种条件的制约。但是，我起码认识到，我应该开始从coder到programmer转变了。我不必再用代码去实现别人的思想，而是把自己的思想赋予到代码里面去。&lt;/div&gt;
&lt;div&gt;　　你是愿意当一名coder，还是programmer？中文里，这两者都被称为“程序员”，但我觉得，把coder称为代码工，也许更适合些吧。那是为了实现一个别人设定的目标，坐在电脑前敲着代码的一群人。&lt;/div&gt;
&lt;div&gt;　　也许，我从骨子里就不适合当一个coder。我在工作中遇到问题时，总是习惯于先用自己的方法去解决，因为我已经知道了解决的方法。但假如用这个方法需要耗费大量的时间时，又只好违心去向公共的开源组件求助。当我在使用一些公共组件时，心里总是不踏实，因为这等于把自己的事情交托到别人身上去；假如出了问题，也只能祈求别人能解决。可是，在任务期限的压力下，又不得不委身于此。现实就是在妥协与被妥协之间作选择的过程。于是我对自己说，这个只是临时方案，如果以后有时间，我再自己做吧。我希望我做出来的，是自己的东西，而不是别人让我做的；是包含了我的思想的东西，而不是只有别人的思想。&lt;/div&gt;
&lt;div&gt;　　当你需要实现某个功能时，你第一时间想到的是什么？上网搜索别人做过的同类东西，还是想想自己该如何去实现？各位前辈对我说：别人已经做过了，你就没必要浪费时间再去重新做，拿过来用就行。我也接受劝告，到处去找现成的东西来用。可是，一段时间后，我发觉这样很没成就感。&lt;/div&gt;
&lt;div&gt;　　想想高中的时候，某道数学作业不会做，你会怎么办？&lt;/div&gt;
&lt;div&gt;　　1、看看有没有同学已经做出来，假如有，直接拿过来抄；&lt;/div&gt;
&lt;div&gt;　　2、看看那些已经做出来的同学的解题思路，回来自己照着解决；&lt;/div&gt;
&lt;div&gt;　　3、硬啃，哪怕解决得并不完美，甚至最后空着交上去。&lt;/div&gt;
&lt;div&gt;　　在大多数情况下，我是选择第3种做法。首先，第1种做法我是绝对不会做，因为那与我做人的原则相背离。至于第2种方法，每次把问题解决后，心里总是不得释怀，因为那是按照别人的思路去做，而不是自己的思路。即使是把问题解决了，仍是一点成就感也没有。难道这个时候我们应该说，“别人已经解答出来了，你就没必要浪费时间再去解答了，直接拿过来抄就行”？&lt;/div&gt;
&lt;div&gt;　　映射到作为一名程序员，我们也常常面对这样的选择，并且可选项与上面是对应的。&lt;/div&gt;
&lt;div&gt;　　需要实现一个功能时，你会怎么办？&lt;/div&gt;
&lt;div&gt;　　1、搜索现成的组件，找到后，直接搬过来用；&lt;/div&gt;
&lt;div&gt;　　2、问问解决过同类问题的人，由他们提供解决方案，自己按照这个方案来实现；&lt;/div&gt;
&lt;div&gt;　　3、自己苦心琢磨解决方案，然后动手实现。&lt;/div&gt;
&lt;div&gt;　　从选项1到选项3，那是从coder到programmer的过程。我相信，这也是一个逐步提高的过程。假如一直醉心于实现别人的思想，不肯踏出赋予自己思想的第一步，就永远只能原地踏步。当你用选项3的方法解决问题后，那种成就感是无与伦比的。&lt;/div&gt;
&lt;div&gt;　　现实中，这样的所谓成就感简直不值一文，因为投入与产出不成比例。为了让你拥有这样的成就感，投入数倍的时间？那是可能性为0的事。短期收益最高的，肯定是第一种方法，不需要花多大的投入，即可取得看起来一样的收益，甚至是更大的收益——至少看起来是这样。但有着长远眼光的人，必然愿意花更多的精力从基础打起，因为那才是自己的思想。技术的交流当然是必要的，但交流过后，我们更应该将这种交流赋予自己的思想，这样才能不断进步。这种进步不但是个人的，还是集体的。&lt;/div&gt;
&lt;div&gt;　　假如条件允许，还是先思考着自己解决问题吧。这样才能体会到当一名programmer的乐趣。&lt;/div&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/167.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/167.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/167.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/167.aspx</trackback:ping>
    </entry>
    <entry>
        <title>层叠式评论列表的实现思路——类似网易新闻评论的盖楼</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2010/11/11/158.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2010/11/11/158.aspx</id>
        <published>2010-11-11T19:27:21Z</published>
        <updated>2010-12-15T22:39:10Z</updated>
        <content type="html">&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　网易的新闻评论里面的盖楼样式很具有代表性，很直观，也很利于交流、跟帖等，所以之前一直想把融智网的项目沟通中做成类似样式。这种样式对于用户的导向作用是非常明显的，很容易让人产生跟帖的冲动，不然的话“山寨之王”腾讯也不会跟着弄成相同的样式了。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　于是我花了些时间来研究和实现，终于搞定了。话说其实我这样也算抄袭吧……嗯……借鉴，借鉴……&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　实现的思路还是比较简单的（假设网页是用asp.net开发的）：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　首先，评论的数据库表的结构至少应该包括ID和ReplyCommentID列，其中ID是每个评论在表中存储的唯一标识，ReplyCommentID则表明该评论（子评论）是对哪条评论（父评论）的回复。假若ReplyCommentID列为空，表明是新添加的评论，而不是评论的回复；假若不为空，则必须与表中的其中一条记录的ID对应。当然，不能与本条记录的ID对应。Content字段是评论的内容。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　然后，为了显示所有的评论，我们需要一个Repeater控件来绑定评论列表。不使用其他数据绑定控件（如DataList、GridView）的原因，是因为只有Repeater能让我们自由控制生成的HTML代码，不产生多余代码。在Repeater的每个Item中，我们还需要一个Literal控件来展示评论的内容。选用Literal的原因，同样是因为其产生的代码是完全由我们控制的。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　看到那个层叠式的展示结构时，我就想到用递归或循环结构来实现。考虑到递归的低运行效率，我决定用循环结构。可能有人会认为，应该先从根评论开始循环，然后自上而下获得一个回复的子评论，继续循环，直到找不到子评论为止。其实这样实现起来是十分复杂的，必须使用广度搜索算法，而且也用不着Repeater控件了，因为在搜索的过程中就把所有的评论都读了个遍。所以，既然我们是在Repeater中处理的，最简单的方法自然是从当前评论开始循环，根据ReplyCommentID自下而上地获取其父评论，一直到ReplyCommentID为空为止，结束循环。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　在Repeater的ItemDataBound事件处理方法中，为了方便操作，我们用一个字符串变量displayStr来保存循环的每一步中显示的当前效果，循环结束时，displayStr就是最终显示的效果；此外，还要用另一个字符串变量replyStr来获得循环的每一步中的评论内容。至于页面中显示的边框、宽度等元素，用div作为窗口，根据循环的次数设置其css属性来展示。&lt;/span&gt;
&lt;div /&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　循环的过程中，需要一个关键的字符串处理方法：string.Format()，用来方便地插入一个评论的父评论。假如你所用的语言没有提供这个方法的话，不妨自己写个，反正也不难写。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　为了减少重复代码，我们把用来作容器的div标签的头尾都赋值给指定的变量（divFront及divBack），比如：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;string divFront = "&amp;lt;div style='border:1px dotted Gray; padding-left: 9px; background-color: #f9fcff; padding-right: 9px; margin-top: 9px; width: {0}px;'&amp;gt;";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="color: #00ff00"&gt;string divBack = "&amp;lt;/div&amp;gt;";&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　可以看到，divFront中有一个待格式化的{0}，预留此处，便于根据不同的循环次数来设置宽度。于是，我们用一个整型变量count来记录循环的次数。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　循环开始时，把displayStr初始化为"{0}"，count初始化为0。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;int count = 0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;string displayStr = "{0}";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　设评论类的实例为comment。循环继续的条件是ReplyCommentID不为空，即：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;while(comment.ReplyCommentID != null)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;{&lt;br /&gt;
}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　下面就是循环体内的内容了。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　首先用string.Format()方法设置容器的宽度：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;string pre = string.Format(divFront, 715 - 20 * count);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　然后根据评论的ReplyCommentID获取其父评论：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;comment = GetCommentByID(comment.ReplyCommentID);      //取当前评论的父评论，并作为循环的下一步的评论，这个方法可以自己定义。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　假如找不到指定ID的父评论，则跳出循环：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;if (comment == null) break;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　获取循环到当前步骤的评论内容及其容器所显示的HTML代码：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;replyStr = pre + "{0}" + comment.Content + divBack;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　为什么又要有个"{0}"？因为我们后面还要继续循环啊。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　然后，我们就可以设置循环到当前步骤时的最终显示效果了：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;displayStr = string.Format(displayStr, replyStr);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　注意，这里会用replyStr的内容代替displayStr中的"{0}"，而replyStr中又有"{0}"，这样的话，到循环的下一步时，我们仍然有一个"{0}"可用。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　循环的每一步最后，切勿忘记递增循环的次数：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;count++;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　想想循环的每一步结束后，我们的displayStr变量将会是一个怎样的值？&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　循环的第一步结束后，应该是像下面形式的一个字符串：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #ff0000"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;lt;div ...&amp;gt;{0}[评论的内容]&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　第二步结束后，应该是像下面一样：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #ff0000"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;lt;div ...&amp;gt;{0}&amp;lt;div ...&amp;gt;[评论的内容]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　依此类推。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　当一直循环到某个评论的ReplyCommentID为空时，评论结束。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　评论结束后，displayStr的值中仍会有一个"{0}"，当然我们不能这样显示了，所以可以用一个空白字符串开代替之：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;font size="3"&gt;&lt;span style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;font size="3"&gt;displayStr = string.Format(displayStr, "");&lt;/font&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　最后，把displayStr的值赋值给我们一开始创建的Literal控件就行了：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="color: #00ff00"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;ltrReplies.Text = displayStr;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　完毕。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　本文只提供一个思路，写得也有些乱（我自己回头看一下刚写下的东西，连我自己也看得不太懂），若需要源代码来加深认识，欢迎在本文下面留言（记得附上联系方式哦~~）。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;　　最终效果如下图：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/floor.gif" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 10pt"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;

&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/158.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/158.aspx</wfw:comment>
        <slash:comments>14</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/158.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/158.aspx</trackback:ping>
    </entry>
    <entry>
        <title>asp.net如何解释ViewState数据</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2010/10/23/asp.netviewstate.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2010/10/23/asp.netviewstate.aspx</id>
        <published>2010-10-23T01:57:21Z</published>
        <updated>2010-10-23T01:59:51Z</updated>
        <content type="html">&lt;div style="font-size: 12pt"&gt;&lt;span style="font-size: 12pt"&gt;对于一些用.net来开发的网页，我们在查看源文件的时候，很容易能够查看到一串乱码状的字符，大致如下：&lt;/span&gt;&lt;/div&gt;
&lt;span class="HTML_TXT"&gt;&lt;span class="HTML_TAG"&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em; font-size: 8pt" class="SYN_TXT"&gt;&lt;span class="HTML_TXT"&gt;&lt;span class="HTML_TAG"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 8pt"&gt;&lt;span class="HTML_TXT"&gt;&lt;span class="HTML_TAG"&gt;&lt;span style="font-size: 8pt"&gt;&amp;lt;&lt;span class="HTML_ELM"&gt;input&lt;/span&gt; &lt;span class="HTML_ATR"&gt;type&lt;/span&gt;=&lt;span class="HTML_VAL"&gt;"hidden"&lt;/span&gt; &lt;span class="HTML_ATR"&gt;name&lt;/span&gt;=&lt;span class="HTML_VAL"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span class="HTML_ATR"&gt;id&lt;/span&gt;=&lt;span class="HTML_VAL"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="HTML_ATR"&gt;&lt;span style="font-size: 8pt"&gt;&lt;span class="HTML_TXT"&gt;&lt;span class="HTML_TAG"&gt;&lt;span style="font-size: 8pt"&gt;&lt;span class="HTML_ATR"&gt;value&lt;/span&gt;=&lt;span class="HTML_VAL"&gt;"/wEPDwULLTE3NzAyMDM1MTVkZMKTMXyz5q5nZTb86F0507Ov5T4Q"&lt;/span&gt; /&amp;gt;&lt;/span&gt;
&lt;div&gt; &lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt"&gt;其中的value值就是视图状态字符串。这个字符串看上去是不可读的，只是一串乱码，让人很容易就以为它是经过加密了的——但实际上并非如此。相反，我们可以很轻易地把其“解码”出来。读出来的关键代码如下(C#语言)：&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt;  //viewStateString是源文件中的ViewState字符串值。&lt;br /&gt;
System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(viewStateString));  &lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt;为了示范一下，我们做个简单的Winform程序。建立一个名称为TestViewState的Winform项目，主界面如下：&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;img border="0" alt="" src="/UserUpload/gavin/2010-10-23 1-30-41.jpg" /&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt; &lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em; font-size: 12pt" class="SYN_TXT"&gt;cs文件中的代码如下：&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;
&lt;p&gt;&lt;font size="3" face="Times New Roman"&gt;using System;&lt;br /&gt;
using System.Windows.Forms;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="3" face="Times New Roman"&gt;namespace TestViewState&lt;br /&gt;
{&lt;br /&gt;
 public partial class Form1 : Form&lt;br /&gt;
 {&lt;br /&gt;
  public Form1()&lt;br /&gt;
  {&lt;br /&gt;
   InitializeComponent();&lt;br /&gt;
  }&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="3" face="Times New Roman"&gt;  private void BtnCheck_Click(object sender, EventArgs e)&lt;br /&gt;
  {&lt;br /&gt;
   byte[] stringBytes = Convert.FromBase64String(this.TxtSource.Text);&lt;br /&gt;
   this.TxtTarget.Text = System.Text.Encoding.ASCII.GetString(stringBytes);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 12pt"&gt;&lt;span style="font-size: 12pt"&gt;很简单地，我们就搞定了这个程序。下面运行测试一下吧。我们拿融智网(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.interwis.net"&gt;&lt;span style="font-size: 12pt"&gt;http://www.interwis.net&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12pt"&gt;)上的一个页面来当白老鼠吧。比如这个页面：&lt;font size="3"&gt;&lt;a href="http://www.interwis.net/Account/Info.aspx?ID=ABCD647A-E0B7-4BD9-A97D-2D9D454D512D"&gt;http://www.interwis.net/Account/Info.aspx?ID=ABCD647A-E0B7-4BD9-A97D-2D9D454D512D&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt;查看这个页面的源文件，我们可以乱码状的东西，如下（为了不影响页面美观，我手动添加了些回车）：&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 8pt"&gt;/wEPDwULLTE0NDQzOTMyNTUPZBYCZg9kFgJmD2QWAgIDD2QWBAIBD2QWAmYPZBYGZg8WAh4HVmlzaWJsZWdkAgMPD2QWAh4Jb25rZXlkb3duBUZqYXZhc2&lt;br /&gt;
NyaXB0OmtleURvd25TdW1taXQoJ2N0bDAwX2N0bDAwX0hlYWRfVGVtcFRvcDFfQnRuU2VhcmNoJyxldmVudCk7ZAIEDw9kFgIeB29uY2xpY2sFWnN1Ym1pdFdpdGhW&lt;br /&gt;
YWxpZGF0aW9uKCdpbmRleF9zZWFyY2gnLCdjdGwwMF9jdGwwMF9IZWFkX1RlbXBUb3AxX0J0blNlYXJjaCcsJ0xibFNlYXJjaGluZycpO2QCBQ9kFgQCAQ9kFhACAQ8WA&lt;br /&gt;
h4EVGV4dAUFZ2F2aW5kAgMPFgIfAwUG5Liq5Lq6ZAIFDxYCHwMFgAE8aW1nIHdpZHRoPScxMjAnIGhlaWdodD0nMTIwJyBzcmM9J2h0dHA6Ly93d3cuaW50ZXJ3aXMu&lt;br /&gt;
bmV0L1VzZXJVcGxvYWQvSW1hZ2VzL1BlcnNvbi8yMDEwLzcvMjgvaGVhZHNfMS5naWYnIGFsdD0n55So5oi35aS05YOPJyAvPmQCBw8WAh8DBVA8aW1nIHNyYz0naH&lt;br /&gt;
R0cDovL3d3dy5pbnRlcndpcy5uZXQvUlpfQ2xpZW50L0ltYWdlcy9oZWFydF9ncmF5LmdpZicgdGl0bGU9JzAnIC8+MGQCCQ8WAh8DBVA8aW1nIHNyYz0naHR0cDovL3d3&lt;br /&gt;
dy5pbnRlcndpcy5uZXQvUlpfQ2xpZW50L0ltYWdlcy9oZWFydF9ncmF5LmdpZicgdGl0bGU9JzAnIC8+MGQCCw8WAh8DBZcCPGltZyBzcmM9J2h0dHA6Ly93d3cuaW50ZXJ&lt;br /&gt;
3aXMubmV0L1JaX0NsaWVudC9JbWFnZXMvc3Rhcl9zbWFsbC5naWYnIHdpZHRoPScxNicgdGl0bGU9JzY5MicgLz48aW1nIHNyYz0naHR0cDovL3d3dy5pbnRlcndpcy5uZXQ&lt;br /&gt;
vUlpfQ2xpZW50L0ltYWdlcy9zdGFyX3NtYWxsLmdpZicgd2lkdGg9JzE2JyB0aXRsZT0nNjkyJyAvPjxpbWcgc3JjPSdodHRwOi8vd3d3LmludGVyd2lzLm5ldC9SWl9DbGllbnQv&lt;br /&gt;
SW1hZ2VzL3N0YXJfc21hbGwuZ2lmJyB3aWR0aD0nMTYnIHRpdGxlPSc2OTInIC8+NjkyZAINDxYCHwMFBDAuMDBkAg8PFgIfAwUEMC4wMGQCAw9kFgICAQ9kFhRmD&lt;br /&gt;
xYCHwMFHTxkaXYgY2xhc3M9J2hlYWRfcmVzdCc+PC9kaXY+ZAIBDxYCHwMFBWdhdmluZAICDxYCHwMFCUdhdmluIE1va2QCAw8WAh8DBQlHYXZpbiBNb2tkAgQPF&lt;br /&gt;
gIfAwVB5byA5Y+RLee9keermeW8gOWPkSzlhoXlrrkt6KeG6aKR5YaF5a655aSE55CGLOW8gOWPkS3lip/og73lvIDlj5FkAgUPFgIfAwVlSUlTLE1TLVNRTCxQaG90b3Nob3A&lt;br /&gt;
sQysrLEphdmFTY3JpcHQsQ1NTLC5ORVQsV2luZG93cyBTZXJ2ZXIsQVNQLOaQnOe0ouW8leaTjuS8mOWMlizop4bpopHlhoXlrrnlpITnkIZkAgYPFgIfAwUDNTg1ZAIHDxY&lt;br /&gt;
CHwMFEzIwMDktMDMtMTcgMDA6Mzc6MzhkAggPFgIfAwUTMjAxMC0xMC0yMyAwMToxOTowM2QCCQ8WAh8DBagB5pys5Lq66ZW/5pyf5LuO5LqL572R6aG16K6+6&lt;br /&gt;
K6h55u45YWz5bel5L2c77yM5YW35pyJ6Laz5aSf55qE57uP6aqM5ZKM6IO95Yqb77yM54S25YiZ5qC35a2Q5pyJ54K554yl55CQ77yb5oCn5qC85ZKM6JS85Y+v5Lqy77yM5b&lt;br /&gt;
mz5piT6L+R5Lq677yM5b6X572q5Lq65aSa56ew5ZG85Lq65bCR44CCZGRreds4g3EBWF1d+1gMx06reT3q+g==&lt;/span&gt;
&lt;div&gt; &lt;/div&gt;
&lt;span style="font-size: 12pt"&gt;霸气！谁要是查看这个页面的源文件，肯定会被这一串字符串深深地震撼。能写出如此页面的人，想必是个人才也。&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt;好吧，我们把这串东西输入我们的程序的“源字符串”文本框中去，并点击“查看”。于是，我们在“结果”文本框中可以看到“解码”后的结果，如下：&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em; font-size: 8pt" class="SYN_TXT"&gt;?&amp;#x1;&amp;#xF;&amp;#xF;&amp;#x5; -1444393255&amp;#xF;d&amp;#x16;&amp;#x2;f&amp;#xF;d&amp;#x16;&amp;#x2;f&amp;#xF;d&amp;#x16;&amp;#x2;&amp;#x2;&amp;#x3;&amp;#xF;d&amp;#x16;&amp;#x4;&amp;#x2;&amp;#x1;&amp;#xF;d&amp;#x16;&amp;#x2;f&amp;#xF;d&amp;#x16;&amp;#x6;f&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1E;&amp;#x7;Visiblegd&amp;#x2;&amp;#x3;&amp;#xF;&amp;#xF;d&amp;#x16;&amp;#x2;&amp;#x1E; onkeydown&amp;#x5;Fjavascript:keyDownSummit('ctl00_ctl00_Head_TempTop1_BtnSearch',event);d&amp;#x2;&amp;#x4;&amp;#xF;&amp;#xF;d&amp;#x16;&amp;#x2;&amp;#x1E;&amp;#x7;onclick&amp;#x5;ZsubmitWithValidation('index_search','ctl00_ctl00_Head_TempTop1_BtnSearch','LblSearching');d&amp;#x2;&amp;#x5;&amp;#xF;d&amp;#x16;&amp;#x4;&amp;#x2;&amp;#x1;&amp;#xF;d&amp;#x16;&amp;#x10;&amp;#x2;&amp;#x1;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1E;&amp;#x4;Text&amp;#x5;&amp;#x5;gavind&amp;#x2;&amp;#x3;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x6;??????d&amp;#x2;&amp;#x5;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;?&amp;#x1;&amp;lt;img width='120' height='120' src='http://www.interwis.net/UserUpload/Images/Person/2010/7/28/heads_1.gif' alt='????????????' /&amp;gt;d&amp;#x2;&amp;#x7;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;P&amp;lt;img src='http://www.interwis.net/RZ_Client/Images/heart_gray.gif' title='0' /&amp;gt;0d&amp;#x2; &amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;P&amp;lt;img src='http://www.interwis.net/RZ_Client/Images/heart_gray.gif' title='0' /&amp;gt;0d&amp;#x2; &amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;?&amp;#x2;&amp;lt;img src='http://www.interwis.net/RZ_Client/Images/star_small.gif' width='16' title='692' /&amp;gt;&amp;lt;img src='http://www.interwis.net/RZ_Client/Images/star_small.gif' width='16' title='692' /&amp;gt;&amp;lt;img src='http://www.interwis.net/RZ_Client/Images/star_small.gif' width='16' title='692' /&amp;gt;692d&amp;#x2;&lt;br /&gt;
&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x4;0.00d&amp;#x2;&amp;#xF;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x4;0.00d&amp;#x2;&amp;#x3;&amp;#xF;d&amp;#x16;&amp;#x2;&amp;#x2;&amp;#x1;&amp;#xF;d&amp;#x16;&amp;#x14;f&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x1D;&amp;lt;div class='head_rest'&amp;gt;&amp;lt;/div&amp;gt;d&amp;#x2;&amp;#x1;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x5;gavind&amp;#x2;&amp;#x2;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5; Gavin Mokd&amp;#x2;&amp;#x3;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5; Gavin Mokd&amp;#x2;&amp;#x4;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;A??????-????????????,??????-??????????????????,??????-????????????d&amp;#x2;&amp;#x5;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;eIIS,MS-SQL,Photoshop,C++,JavaScript,CSS,.NET,Windows Server,ASP,??????????????????,??????????????????d&amp;#x2;&amp;#x6;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x3;585d&amp;#x2;&amp;#x7;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x13;2009-03-17 00:37:38d&amp;#x2;&amp;#x8;&amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;&amp;#x13;2010-10-23 01:19:03d&amp;#x2; &amp;#xF;&amp;#x16;&amp;#x2;&amp;#x1F;&amp;#x3;&amp;#x5;?&amp;#x1;????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ddky?8?q&amp;#x1;X]]?X ?N?y=??&lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em; font-size: 8pt" class="SYN_TXT"&gt; &lt;/div&gt;
&lt;div style="text-indent: -0.5em; padding-left: 1em; font-size: 8pt" class="SYN_TXT"&gt;&lt;span style="font-size: 12pt"&gt;似乎还是有些乱？可是，某些值已经是清晰可见了。&lt;/span&gt;
&lt;div style="font-size: 12pt"&gt;其实只要了解ViewState的原理，就会知道“解码”的来龙去脉。ViewState在页面上的值是asp.net收集到的页面上的全部信息序列化的一个Base64字符串（Base64字符串能确保没有任何非法的HTML特殊字符），而运行Convert.FromBase64String()方法，就是把Base64字符串转换回来的过程。&lt;/div&gt;
&lt;div style="font-size: 12pt"&gt;由此可见，ViewState并不适合存放一些敏感的或者是需保护的数据，除非你已经用其他方法加密了。不过一般来说，为了保证运行的效率，如果不是十分必要，还是把ViewState禁用吧，那一大串东西实在太吓人。&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/156.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/156.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/156.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/156.aspx</trackback:ping>
    </entry>
    <entry>
        <title>转些好玩的东西——有些旧了</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2010/08/24/153.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2010/08/24/153.aspx</id>
        <published>2010-08-24T16:47:05Z</published>
        <updated>2010-08-24T16:59:23Z</updated>
        <content type="html">&lt;span style="line-height: 1.3em; font-size: 18px"&gt;&lt;span style="font-family: SimHei"&gt;&lt;span style="font-family: SimSun"&gt;&lt;span style="font-size: 8pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-family: SimHei"&gt;&lt;span style="font-family: SimSun"&gt;&lt;span style="font-size: 8pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-family: KaiTi_GB2312"&gt;&lt;span style="font-family: SimSun"&gt;&lt;span style="font-size: 18pt"&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="line-height: 1.3em; font-family: sans-serif"&gt;&lt;span style="line-height: 1.3em; font-size: 18px"&gt;&lt;span style="line-height: 1.3em; font-family: SimSun; font-size: 10pt"&gt;
&lt;p&gt;既然是博客，总不能满是技术活吧……转些好玩的东西给大家解解闷。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;中大鬼故事之永芳堂 &lt;br /&gt;
第一个鬼故事是关于永芳堂的。永芳堂的设计在我们学校里一直很有争议。有人说它破坏了中大的风水。因为它的设计从上方俯瞰好像一个坟墓，呈八字型向两边伸展，堂前还有18尊铜像，据说是守灵的。传闻有份起永芳堂的设计师等人，一年内全部死光。而且永芳堂刚刚起好的时候，八字型两撇所指之处，草木皆死。永芳堂是为了纪念孙中山的，里面存放孙中山的衣冠冢，但实际上不是孙中山的，关于里面放的是谁的衣冠，有两个不同的版本。一说是永芳公司老板的爷爷的衣冠；另一说是建筑老板的女儿的，她的名字有个芳字,所以永芳堂意思是芳永远睡在里面，有人说永芳堂里时不时会传出来女人声音。永芳堂的邪门之处还在于上永芳堂的台阶，早上数和下午数是不一样的。外面有18铜像,每个铜像有一个锁链锁住，如果有人发现了那一个铜像没有锁链的话就会有教授或学生死于非命。好邪门的。 &lt;/p&gt;
&lt;p&gt;中大鬼故事之文科楼 &lt;br /&gt;
第二个鬼故事发生在文科楼。印象中文科楼的正门是永远不开的，我们平时上课走的总是侧门。不开正门是因为每开一次，中大就会死一个教授。有人说当初建设这座楼的时候，挖到两个小孩子的尸体，后来楼盖好以后，有人从正门进入后就会见到两个小孩子在天井里玩，但是一转身就不见了，而且不久就会感到被人在身后大拍一下背脊，但是转身还是什么人都没有。有人从文科楼外经过，看到正门的铁栏杆后有两个小孩向外探头。 &lt;/p&gt;
&lt;p&gt;中大鬼故事之岭南堂 &lt;br /&gt;
第三个鬼故事与岭南堂有关。岭南堂位于中大的正门主干道路上面，把正门（南门）和后门（北门）正正地挡住，是一座全玻璃的楼房。据说建筑期间有不少民工死于非命，连设计的人也变成疯疯癫癫，于是请来术士看看风水，发现正门和后面直通，杀气，涙气在中大畅通无阻，此建筑乃挡刹之物，但是设计有误，使杀气会聚在里面，于是建筑工程受拖延，出了人命，只有建筑成玻璃外墙，才能挡回杀气，也可以搞好中大风水。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
鬼故事之东12 &lt;br /&gt;
广东中山大学东区是宿舍区，一条长长的园东路，路的北面是东湖、小礼堂、饭堂。南面由两列并排的宿舍楼从东门一直到基建处。这些宿舍楼的名称就分别是东1、东2，一边是基数一边偶数排列的。 &lt;br /&gt;
东12现在是一栋新楼，然而几年前那里是一片废墟。据说是学校把整座楼给拆了。当时前面的东10和后面的东14都完好无损，就中间剩了一片空地，看了都觉得奇怪，尤其是宿舍床位非常紧张的中大，却怎么无故拆了整栋楼房。后来就听说是因为有鬼。但却衍生出很多个版本，大家愿意相信哪个呢？ &lt;/p&gt;
&lt;p&gt;版本(1)——资料来源：我一个师姐口述。 &lt;br /&gt;
东12原来是男生宿舍，那一年开学，一个大二的男生从很偏僻遥远的乡下风尘仆仆回来，放下行李后就先去洗把脸。但当他洗完脸回来后整理行李时，却发现他带回来的二千多元的学费不翼而飞。 &lt;br /&gt;
这个男生生长在很贫瘠的乡下，好努力才考上中大光宗耀祖，但却为此家里已经债台高筑。这次的学费也几经辛苦借东家借西家拼拼凑凑得来的，当时这些钱对他来说，重要性大家可想而知。 &lt;br /&gt;
发现钱弄丢了，他第一时间时问同宿舍的人有没有见过，大家当然说没有，然后他还是不停地阐述那些钱的重要和无休止地恳求人家把钱还给他，后来还给每个同宿舍的男生磕头，吓得人家纷纷走出去不再理他(这样一来，就算真的偷了他钱的人也不好拿出来咯。)然后接下来几天，这个男生依然在恳求人家。还发展到整栋宿舍楼。每天象游魂一样流连于同楼每层每间宿舍，走到人家房间门前都去问人家有没有见过他的钱，还跪在每间宿舍门前磕头。吓得每个人都不敢理睬他，一看到他来了，就关上房门…… &lt;br /&gt;
几天后，他在宿舍上吊自杀。 &lt;br /&gt;
接下来，就是很多怪事发生—— &lt;br /&gt;
有男生在晾衣服的时候(宿舍的阳台上会有一些外伸的铁枝支架以给学生晾晒衣服)，把裤子挂晾着，却赫然发现自己裤子旁边，凌空悬着一双腿，还象晾着的裤子一样在风中轻轻摇晃…… &lt;br /&gt;
夜里都关门睡觉的时候，有人听到宿舍门外有很奇怪的“咚…咚…咚…”的声音，听起来很象是什么东西撞击地面，好像~~`好像~~~`好像那天那个男生的磕头声…… &lt;br /&gt;
后来情况越来越严重，先是那个自杀男生原来住的宿舍，继而发展到全栋宿舍楼的男生都强烈要求搬走，校方也没办法，只好给他们都另外安排，于是东12就空着了。到了第二年有新生入学，东12又再重新住满了学生，但这些倒霉的新生，却同样也看到奇怪的现象，听到诡异的声音…… &lt;br /&gt;
终于到最后，没有人敢再留住在东12，听说东12空置封锁后，其他楼的人看过来，却依稀看到好像有人在里面流连游荡。传言越来越多，校方逼于压力，把东12拆掉。 &lt;/p&gt;
&lt;p&gt;版本(2)——资料来源：异度惊魂网 &lt;br /&gt;
东12原来是什么系的女生住的呢?我不知道,可是当一个女孩子自杀了以后,问题就出来了…… &lt;br /&gt;
那个女孩子为什么要自杀呢?我也不知道.她从四楼跳了下来(四楼最高啦,).可是不知道怎么搞的,头居然直接撞在了一楼的窗台上,一楼的那个房间全是血,恐怖的是,那些血竟然洗不掉,只有把墙灰连同血一起铲下来…… &lt;br /&gt;
原来的东12的灯管是和其他楼的宿舍一样是吊在天花板的,一天晚上,那个房间有个女生晚上醒来,看见灯管在晃动,她就觉得很奇怪,仔细一看……！竟是一个穿着白纱的女孩子坐在上面荡秋千!现在新东12的灯管是贴着天花板的,就是这个原因. &lt;br /&gt;
另外一个宿舍的女生也有发现.晚上大家都睡觉了,但是有个女生很刻苦,还躲在蚊帐里面看书.忽然,她听到窗外有"咯咯"的笑声,她就抬头看,看见一个女孩子在窗外微笑着向她招手,这个女生吓的脸色发白,因为她是住在四楼的! &lt;br /&gt;
就这样,事情越来越多,学校就不得不把东12的学生给搬到其他宿舍楼.到我进校前就干脆拆了它.有一个96的师兄就给我讲过,他刚进校的时候,东12还没有拆,他就进去过,他说,站在宿舍大门门口就觉得有些冷,是那种阴阴的冷,然后就似乎听见走廊里有什么动静,但是听不真切,总觉得毛骨悚然的.以上只是听说而已,千万不要信的说,呵呵,否则今晚你的蚊帐外面可能就有…… &lt;/p&gt;
&lt;p&gt;中大鬼故事之珠海校区的教学楼顶 &lt;br /&gt;
中大拥有亚洲第一长的教学楼，我第一次去珠海就被它镇住了，真的相当雄伟相当壮观！而且整个教学楼还给我一种很干净很清新的感觉，当时因为在网上看到不少关于南校区的鬼故事，但是没听说过珠海的，所以我一直都很喜欢这里，很庆幸自己有2年的时光可以在一个如此阳光明媚充满活力的地方度过。 &lt;br /&gt;
因为接下来说的事情跟教学楼相关，所以我先大致说明一下教学楼的布局吧。珠海校区的教学楼搭建在两座山之间，南北向。南边山头后面是图书馆，东边是隐湖，碧波微荡，六七月份湖中开满了荷花的时候荷塘月色是相当的动人的，西边则是若海，多年前可以媲美隐湖然而在我回迁的时候早已干涸，长满了野草。北边则靠近学生宿舍区荔园的篮球场，山头后面是唐家湾，从南往北依次是教学区A-F，没记错的话其中A区主要是一些电子实验室、物理实验室之类，B-F则是普通的课室，E、F区的高层是语音实验室。这个是我入学以后的样子了，之前是怎样则不清楚了。教学楼的天台有透明的顶棚，四面通风，晚上上去相当的舒服，是情侣拍拖的圣地。教学楼虽说很长，课室相当的多，然而利用率并不高，我总是能找到很多空的课室，不管任何时候。于是我便好奇了，因为我知道医学院七年制的只有一年在这边受教，而据说珠海校区刚建好的时候所有过来这边的学生都是待两年才搬走的，唯独医学院，and我有同学就是这么过来一年，在我看来就是跑跑过场，还要相当费周折的搬一次家，十分可怜。然后，我就很后悔我的八卦，居然被我打听到了如此让我郁闷的故事。。。 &lt;br /&gt;
时间大概是01年，当时珠海的开荒牛00级的人大二，医学院的学生要开始上解剖课，于是从北校区运来了几具尸体，放在了F区现在电房那一带。至于解剖课是在什么地方上则不得而知，告诉我这个故事的人并没有提及。在某个冬夜，教学楼巡查的保安在天台A区靠近隐湖那边看到一个白色的身影，因为平时看到的身影通常都是一对对或是一堆堆的，一个人在教学楼顶的情况相当罕见，于是保安便走过去问候。就在保安离那个身影还有20多米远的时候，保安分明看到了那个“人”身上缠满了白色的纱布！保安一下就懵了，然而还是壮着胆很大声的喊了一句“谁？在那里做什么？”没想到那个影子就突然从天台跳了下去！那个保安当时就吓坏了，马上叫上了其他值班的人一起到隐湖那边的山头还有教学楼下寻找，却什么也没找到。 &lt;br /&gt;
第二天医学院的人上解剖课的时候发现少了一具尸体，开始以为是学生的恶作剧，还问了很多人，一直问到了晚上值班的保安，没想到保安一下脸就绿了，哆嗦着说出了前一天晚上发生的怪事。于是老师和保安都出动了去找，还是什么都没找到，一直过了整整一个星期，一对情侣白天在教学楼天台看若海的时候无意中低头，看到山上一团白色的类似人影的东西吓得叫了保安，找人过去查看，果然是失踪的那具尸体……后来出事的那个保安大病了一场以后便辞职了。 &lt;br /&gt;
此后不知道是从01还是02级的人开始，医学院的学生只在珠海走过场的待一年便搬回北校区住，解剖课也搬回那边上了，推说是搬运尸体比较麻烦and实验环境不好云云。事情兴许就这么结束了吧。只是在珠海比较久的保安都会教新来的人没啥事不用去天台巡逻，看到只有一个白衣的身影的话千万不要过去。 &lt;/p&gt;
&lt;p&gt;中大鬼故事之榕园 &lt;br /&gt;
榕园是学生宿舍区，布局相当的有型，是以榕园广场中心点为圆心，宿舍楼、榕园饭堂呈放射型的八卦，我第一次看到榕园的地图就是这么想的，没想到事实上也是这样，我居然还在那里相当无忧无虑的住了两年，想想也真是庆幸，我几乎到了回迁的时候，跟一群朋友出去吃饭，然后才听说的这个故事，也准备走了，怕也怕不了多少了～ &lt;br /&gt;
事情发生在珠海校区刚建好的第一年，这个时候只有00级的学生一届人在这里，01级的还没入学，榕园也还在建设中。当时只建起了榕园饭堂的那一栋楼，宿舍区还是一片刚填平的池塘，一眼看过去一片废墟。只见到杂草丛生，乱石颓垣，半夜的时候总有些野猫以及夜游的生物在那里此起彼伏的叫唤。 &lt;br /&gt;
00级的学生都住在荔园，平时几乎没什么人会走到榕园这边来。然而有一天，一个00级的女生不知道为了什么心情不是很好，一个人从教学楼走回宿舍，到了楼下又不想上去，于是继续走，不知不觉就走到了榕园，面对着眼前杂乱的摊子，心里还觉得舒服些，走到乱石丛中漫步，别有一番滋味。 &lt;br /&gt;
就这样，这个女生走了不知道多久，天黑了。她看到榕园唯一一栋起好了的楼下有灯光，于是便走了过去。那里只有一个上了年纪的大妈在看守东西。大妈看到这个女孩心情不大好的样子，便热情的留了她吃饭，女孩也就留下了。吃完了晚饭，女孩跟大妈聊了很久的天，她感觉好多了，到了十点多的时候，大妈便催促女孩快回宿舍不然宿舍楼要关门了。那个女生却说跟大妈聊得很开心，不想走，问大妈能不能收留她一个晚上，大妈犹豫了一下，还是答应了，她告诉女孩晚上可以在三楼楼梯尽头的那个小房间睡，那里有灯。于是两个人继续聊到了差不多十二点，女孩才上楼休息。 &lt;br /&gt;
那个小房间可能比现在榕园的宿舍小了一半吧，只有一角有一张双层的辘架床，天花板吊着一盏昏暗的小灯泡，开关是拉线的那种，就在床边。没有门板，门上挂了一块布当作门帘。女生想了想，爬上了上铺，顺手把拉线系在了床头。睡到半夜，女生突然被一阵类似拍皮球的声音吵醒了，她也没多想，顺手就拉开了灯，声音马上停止了。女生想自己大概是在做梦吧，于是关了灯继续睡，没多久又听到了拍球的声音。于是她又开了灯，声音又停止了。重复了几次，女生索性开着灯睡了。又过了半夜，女生又听到了拍球的声音，灯已经开了，再过两个小时天也该亮了，她干脆坐起来，眼睛盯着门外，想看看到底是谁这么晚了还在吵。这个时候，她仿佛听到了小孩蹦蹦跳跳的声音，拍皮球，皮球滚动的声音，她听到这些声音从楼梯口一直响到她的门口！这个时候，她分明看到门口有一个小孩抱着皮球的身影映在门帘上！可是。。。可是灯在房间里面啊，外面应该连灯都没有的！这个影子是怎么来的？她很害怕，想呼救却发不出声音…… &lt;br /&gt;
第二天早上，过了十点了大妈还没看到昨晚的女孩下楼，便上去看看，她发现这个女孩用天花板的电线做绳子上吊了，已经死去多时了，尸体像冰一样的冷。大妈摇摇头，怎么这年头的孩子都这么想不开呢，又死了一个……附：榕园在建设以前是一个大池塘，住在唐家的人经常把生活的垃圾、小动物的尸体、甚至初生的婴儿扔下去，当然也包括年少夭折无钱埋葬的小孩了。久而久之池塘里面的水都发臭了，没有鱼，村民也不会去那里喝水。榕园建设期间曾有一些人死在那里，后来加建了榕五，使之成为了一个成型了的八卦形状 &lt;/p&gt;
&lt;p&gt;一般来说，一个有一定年代的校园多多少少都会跟鬼故事撤上关系。年轻的东校区和珠海校区则很少听说有此内故事（只是听说明德园旁边的小山上曾是古墓，夜晚比较吓人）。 &lt;br /&gt;
而南校区则是广州鼎鼎大名的灵异地区，其中的岭南堂、永芳堂和文科大楼、原东12宿舍在广州十大灵异地点就占据了4个位置，其灵异可见一斑。其大多与风水等相关，大家搜索“广州十大灵异地方”便可以查到详情。 &lt;br /&gt;
北校区是原来的中山医所在地，靠近烈士陵园和中山一院，教授同学们平日里解剖尸体众多，而且自杀事件频频发生。按理说应该是闹鬼最厉害的地方，但是医学部的同学经过了系统的医学课程训练，早已经面对尸体而面不改色，见怪不怪，胆量惊人，成了坚定的无神论者，所以北校区反倒没有什么闹鬼的故事。另外经常有老教授临死时捐出自己的身体器官以供医学研究，其无私作风令人钦佩。&lt;br /&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/153.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/153.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/153.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/153.aspx</trackback:ping>
    </entry>
    <entry>
        <title>令人崩溃的显卡……</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/gavin/archive/2010/08/11/152.aspx" />
        <id>http://blog.rongzhiwang.com/gavin/archive/2010/08/11/152.aspx</id>
        <published>2010-08-11T12:26:33Z</published>
        <updated>2010-08-11T12:26:33Z</updated>
        <content type="html">&lt;div style="font-size: 16px" id="blogDetailDiv"&gt;
&lt;p&gt;　　事情是这样的：&lt;/p&gt;
&lt;p&gt;　　话说前一段时间，我家里的电脑每次运行魔兽争霸不久就会死机。开始我以为是系统终于又出问题了，因为以前玩地球帝国时都有类似的问题，在XP下玩一段时间会死机，在vista和win7（当时还是测试版）下玩就很正常。于是星期日那天，我决定装个win7上去试试。然后就装上去嘛，一切正常。装个系统是闲事，装完系统后装的一大堆软件才是麻烦事。首先就是要更新补丁嘛，于是用360来更新了。补丁不多，几十个，我便挂机让它更新，然后跑去中六电脑城买东西了，以为回来后正好更新完毕。谁知回来后我傻眼了，画面动也不动了。死机而已嘛，正常，可能是某个更新补丁的兼容性问题吧。于是我重启，选择上一次正常配置启动，谁知启动不了，于是我再试几次，仍是不行。我想我还是别作无谓挣扎了，一样的措施对付一样的问题，结果肯定是一样的嘛。&lt;/p&gt;
&lt;p&gt;　　于是我上网查——两台电脑的优势就在于一台不行了，另一台还可以用，或者说一台被占用了，至少还有另一台。据说9500GT与win7天生不兼容？怎么可能，我刚刚还能装得上——稍等，好像之前我试过装的时候是不行的啊，怎么这回突然又行了？难道说，不行才是正常的？好吧，我还是用回原来的XP吧。&lt;/p&gt;
&lt;p&gt;　　于是选择“早期版本的windows”，等待启动……卡住了……难道安装win7的时候不小心把XP的一些文件覆盖了？不可能吧，我装在不同的分区的啊。现在好了，佛祖保佑，我现在没有一个系统能用了。试试安全模式吧，能进，好了，系统还原。不行，仍是启动不了。&lt;/p&gt;
&lt;p&gt;　　无奈了，老实重装吧。于是我把装了系统的两个分区都格式化了，重装个XP。装个系统，仍是三两下手势的事。然后，这回我先装驱动吧，网卡、声卡、显卡，一个一个来。装好了，重启，又卡住了……不怕，最后一次正确配置，可以进入，很好，证明硬件没问题了吧，大不了再重装一下驱动。&lt;/p&gt;
&lt;p&gt;　　貌似一装上显卡驱动就出问题了，不装的话都还好好的，难道nvidia官网的最新驱动有问题？于是我找了个较旧的版本来安装。这个更绝，还没重启呢，就黑屏了。迫不得已，重启。&lt;/p&gt;
&lt;p&gt;　　我对着显示器上深邃的黑色思索，莫非这个XP的安装盘有问题？于是，我换了个安装盘，重新安装系统，一切再次重复，然后装驱动。问题依旧，其他都没问题，一装上显卡驱动就不行了。我濒临崩溃……&lt;/p&gt;
&lt;p&gt;　　抱着试一试的心理，我决定装个vista试试。这年头还有人在重装系统的时候装vista的？试一试吧，无妨。装上了，可用；再装显卡驱动吧，又挂掉了。我抓狂，姑奶奶你就放过我吧……&lt;/p&gt;
&lt;p&gt;　　难道是那个DVI接口有问题？当年都是贪新鲜买了个DVI线回来，也不知道有没有实际用途。于是我换回Sub线，问题依然存在。&lt;/p&gt;
&lt;p&gt;　　然后，我决定再换个盘，装回XP。话说此时我已经没有任何想法了，反正显卡肯定是有问题了，再试最后一回吧——不行就换显卡！买块GTX460回来玩玩也不错嘛，一看价钱，1360元，算了，当我什么也没说过。&lt;/p&gt;
&lt;p&gt;　　重装过程依旧没问题，可以开机，装声卡驱动也没问题，一装显卡驱动，如约地挂了。很好，我很满意。&lt;/p&gt;
&lt;p&gt;　　再然后，我想起了在大学时最常用的招式：橡皮擦大法。什么叫橡皮擦？我估计很多人都忘记这物体了，想当年在学校，一块橡皮擦解决了我多少的硬件问题啊。系统启动不了？把内存、显卡什么的统统拔下来，用橡皮擦把金手指（就是那个黄色的接口啦）使劲的擦，然后重新按上去，问题就解决了。当年我就是这样把内存的金手指硬生生地擦成了银手指。这回不妨也试试这个办法吧，于是我满屋找橡皮擦，终于在笔筒的一个幽暗角落里找到了布满灰尘的一块。不要紧吧，擦擦就干净了。&lt;/p&gt;
&lt;p&gt;　　把显卡卸下来，用已经擦干净了的橡皮擦把金手指两面都擦了擦，然后重新装上去，重启。&lt;/p&gt;
&lt;p&gt;　　载入页面过去了。&lt;/p&gt;
&lt;p&gt;　　开机音乐响起了。&lt;/p&gt;
&lt;p&gt;　　桌面出现了。&lt;/p&gt;
&lt;p&gt;　　分辨率自动调整好了。&lt;/p&gt;
&lt;p&gt;　　我傻了。&lt;/p&gt;
&lt;p&gt;　　兜兜转转，回到原点。不得不感叹：最简单最古老的方法，往往是最有效的方法。&lt;/p&gt;
&lt;p&gt;　　我还是睡去了。&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://blog.rongzhiwang.com/gavin/aggbug/152.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/gavin/comments/152.aspx</wfw:comment>
        <slash:comments>3</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/gavin/comments/commentRss/152.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/gavin/services/trackbacks/152.aspx</trackback:ping>
    </entry>
</feed>
