<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.ajaxstu.com/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0"><channel><atom:link href="http://feed.ajaxstu.com" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/ajaxstu" type="application/rss+xml"></fs:self_link><lastBuildDate>Fri, 09 May 2008 14:14:15 GMT</lastBuildDate><title>悠悠博客</title><description>关注Ajax技术与web开发</description><link>http://www.ajaxstu.com/</link><language>zh-CN</language><copyright>Copyright 2005-2007 http://www.ajaxstu.com. All Rights Reserved.</copyright><pubDate>Sat, 10 May 2008 00:54:05 GMT</pubDate><dc:date>2008-05-10T00:54:05Z</dc:date><dc:language>zh-CN</dc:language><dc:rights>Copyright 2005-2007 http://www.ajaxstu.com. All Rights Reserved.</dc:rights><item><title>Google Reader增强了分享功能—更新增加标注</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781926/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2906</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2906&amp;key=eef72936</trackback:ping><description>从Google Reader官方博客&lt;font color=&quot;#4e0a13&quot;&gt;了解到&lt;/font&gt;，&lt;font color=&quot;#4e0a13&quot;&gt;Google Reader&lt;/font&gt;增强了分享功能，可以让用户分享不在阅读器中的网络上的任何一篇文章，让一些值得分享的信息都可以出现在阅读器中。 很大程度的改善了用户体验&lt;p&gt;　　Google Reader这次实现的新功能可以让我们在阅读器中添加和分享所有有趣的事情，下面是具体的介绍：&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;1、分享任何地址&lt;/strong&gt; - 只要将一个&lt;font color=&quot;#4e0a13&quot;&gt;添加链接&lt;/font&gt;的书签拖动到浏览器的链接栏，之后在访问浏览任何一个网址，按一下那个按钮，就可以分享任何一个网页地址，更进一步，你还可以选择一些文本后点击&amp;ldquo;Note in Reader&amp;rdquo;书签，在里面添加上你自己的一些评论，这和del.icio.us的功能几乎一样了。&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;2、分享条目增加批注&lt;/strong&gt; - 如果你和我一向喜欢在Google Reader中分享信息，你一定会想要你的朋友获得一些你自己的东西，让读者知道你为什么分享这篇文章，现在，使用&amp;ldquo;Share with note&amp;rdquo;按钮可以在共享条目上增加你自己的批注，现在你的朋友就应该知道你共享条目的用意是什么了。&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;3、增加备注&lt;/strong&gt; - 在任何时候，你都可以直接增加一条备注信息给你的朋友，而不需要附加在其他条目上，就如同微博客一样，在&lt;font color=&quot;#4e0a13&quot;&gt;Notes Page&lt;/font&gt;的文本框中键入文字即可分享。&lt;/p&gt;&lt;p&gt;　　&lt;strong&gt;快捷键&lt;/strong&gt;：&lt;strong&gt;Shift+D&lt;/strong&gt;，在阅读的时候按Shift+D可以添加批注分享，按Shift+S可以普通分享。&lt;/p&gt;&lt;p&gt;　　新增加的这些功能让Google Reader的分享机制变得越来越可怕，使得Google Reader渐渐具有替代del.icio.us和twitter的功能了。&lt;/p&gt;</description><category>我的随笔</category><pubDate>Fri, 09 May 2008 22:14:15 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2906.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2906.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2906.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781926/4474951</fs:itemid></item><item><title>微软回应雅虎和谷歌联手 重申收购价公平</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781927/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2905</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2905&amp;key=02ba5f7c</trackback:ping><description>&lt;p&gt;关于微软收购雅虎的事件已经闹的不可开交了，又有了新的分歧，4月12日消息，在雅虎宣布与谷歌联合测试在线广告并且与美国在线（AOL）谈判有关合并互联网业务的消息之后，微软首席运营官Kevin Turner星期五（4月11日）发表评论称，微软认为它收购雅虎的价格是公平的。本问转自&lt;a href=&quot;http://www.msncnblog.cn&quot;&gt;MSN下载网&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Turner星期五在印度孟买与印度HCL Infosystems公司联合推出一项战略计划的新闻发布会上说，我们认为，我们向雅虎提供了非常公平的收购要约。现在，收购的事情完全取决于雅虎董事会的决定。 &lt;/p&gt;&lt;p&gt;Turner说，这个收购的战术和战略就是要使微软成为世界级的数字广告公司。有这个收购或者没有这个收购，我们都要成为世界级的数字广告公司。 &lt;/p&gt;&lt;p&gt;微软上周六威胁称，如果在三个星期之内不能达成收购交易，微软将对雅虎实施敌意收购并且会降低424以美元收购雅虎的价格。 &lt;/p&gt;&lt;p&gt;纽约时报本周报道称，新闻集团正在与微软进行谈判，要参加微软收购雅虎的交易。 &lt;/p&gt;&lt;p&gt;雅虎星期三宣布要把网络搜索广告外包给谷歌并且对此进行测试。消息灵通人士称，这是雅虎要与谷歌和时代华纳旗下的美国在线建立三家联盟阻止微软收购的计划的一部分。 &lt;/p&gt;</description><category>我的随笔</category><pubDate>Thu, 03 Apr 2008 10:01:21 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2905.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2905.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2905.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781927/4474951</fs:itemid></item><item><title>DRBD(网络raid1)的安装和试用</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781928/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2904</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2904&amp;key=b9b7c97d</trackback:ping><description>&lt;p&gt;前段时间研究了一下DRBD的工作方式，作了一下总结，跟大家分享一下。&lt;/p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 一、DRBD的介绍&lt;/strong&gt;&lt;p style=&quot;text-indent: 24pt;&quot;&gt;DRBD是一种可以提供高可用性集群的块设备，它可以适时的同步远端主机和本地主机之间的数据，类似与Raid1的功能，我们可以将它看作为网络Raid1。在服务器上部署使用DRBD，可以用它代替共享磁盘阵列的功能，因为数据同时存在于本地和远端的服务器上，当本地服务器出现故障时，可以使用远端服务器上的数据继续工作，如果要实现无间断的服务，可以通过drbd结合另一个开源工具heartbeat，实现服务的无缝接管，关于heartbeat，现在还没有进行深入研究，只知道其大概的原理.&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;关于heartbeat的相关信息可以到官方网站查看。&lt;a href=&quot;http://linux-ha.org/&quot;&gt;http://linux-ha.org&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 30.1pt;&quot;&gt;&lt;strong&gt;二、DRBD的安装&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;由于drbd的架设需要两台机器，假设两台机器名分别为drbd0和drbd1，其IP分别为10.190.40.200和10.190.40.201。虚拟机内核版本为：2.6.9-34.&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;DRBD的官方网站为&lt;a href=&quot;http://www.drbd.org/&quot;&gt;http://www.drbd.org&lt;/a&gt;，下载其最新版本的源码（目前为8.2.1），&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;解压后直接运行make和make install，系统会自动加载drbd的模块和一些工具。模块名为drbd.ko，安装后在/lib/modules/2.6.9-34.EL/kernel/drivers/block/目录下可以看到，不同的内核版本路径可能不一样。在/sbin目录下可以看到drbdadm，drbdmeta ，drbdsetup这几个工具。&lt;/div&gt;&lt;div style=&quot;text-indent: 30.1pt;&quot;&gt;&lt;strong&gt;三、配置DRBD&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24.1pt;&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt;、准备drbd要使用的分区&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;为了试验效果，该分区最好是干净的分区，我在虚拟机中重新划分了一个分区/dev/hdb2作为drbd使用。分区的大小可以自己指定，视需要拷贝的数据量的大小而定。&lt;/div&gt;&lt;div style=&quot;text-indent: 24.1pt;&quot;&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;strong&gt;、修改drbd的配置文件&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp; Drbd配置文件的为/etc/drbd.conf，这个配置文件记录了drbd在启动时的一些参数和drbd设备与硬盘分区的映射关系。在编译安装后会自动生成，我们需要根据自己机器的环境进行修改。下面是我虚拟机上的配置文件，注释已经很清楚了，我就关键部分作一下说明，见附件：&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;&quot;&gt;&amp;nbsp;&lt;a href=&quot;http://www.ajaxstu.com/upload/drbd.txt&quot; target=&quot;_blank&quot;&gt;drbd.txt&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;将这两个配置文件分别拷到两个虚拟机的/etc目录下。&lt;/div&gt;&lt;div style=&quot;text-indent: 24.1pt;&quot;&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;strong&gt;、启动drbd&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;为了能够适时的同步数据，在启动DRBD之前,我们需要分别在两台主机的hdb2分区上,创建供DRBD记录信息的数据块.分别在两个虚拟机上执行: &lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd1 ~]#&amp;nbsp;drbdadm create-md r0&lt;/div&gt;&lt;/div&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;r0就是上面配置文件中定义的资源名称。它将为r0这个资源创建供drbd记录信息的数据块。执行这个命令的时候会给出创建成功的提示信息。&lt;/pre&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;现在准备工作已经做好了，我们需要在两个虚拟机上分别启动drbd.&lt;/pre&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd1 /]# /etc/init.d/drbd start&lt;/div&gt;&lt;/div&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;在启动的时候，两个节点会有一个监听对方的过程，可以通过设置配置文件的wfc-timeout值来限定监听对方的时间，如果设置为0，那么节点在启动时如果不能监测到对方，将会无限期的等待，当然在等待的时候在命令行里会有提示，也可以强行跳过。&lt;/pre&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;现在两个节点上的drbd都运行起来了，但是还没有设置哪个是主哪个是从，它怎么同步数据呢？我是将drbd1设置为主节点的，所以在drbd1这个虚拟机上执行命令&lt;/pre&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd1 /]# drbdsetup /dev/drbd0 primary &amp;ndash;o&lt;/div&gt;&lt;/div&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;说明：/dev/drbd0是配置文件中定义的drbd设备文件。&lt;/pre&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;现在，drbd1就是主节点了。&lt;/pre&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;这时通过命令 cat /proc/drbd查看drbd的运行状态。&lt;/pre&gt;&lt;pre style=&quot;text-indent: 24pt;&quot;&gt;下面是我在主节点上执行这个名后的结果：&lt;/pre&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;version: 8.2.1 (api:86/proto:86-87)&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@localhost.localdomain, 2007-12-19 00:50:27&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;0: cs:WFConnection st:Primary/Unknown ds:UpToDate/DUnknown C r---&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:513392 nr:0 dw:24538 dr:505600 al:64 bm:34 lo:0 pe:0 ua:0 ap:0&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resync: used:0/31 hits:30540 misses:34 starving:0 dirty:0 changed:34&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; act_log: used:0/257 hits:6132 misses:64 starving:0 dirty:0 changed:64&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;我在执行的时候从节点drbd0还没有起来，所以存在st:Primary/Unknown这个记录，表示该节点已经作为主节点Primary了，而对方状态未知，我将从节点drbd0也起来后，再执行这个命令可以看到&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd1 ~]# cat /proc/drbd&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;version: 8.2.1 (api:86/proto:86-87)&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@localhost.localdomain, 2007-12-19 00:50:27&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0&lt;/div&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;现在两个节点都运行正常了，由于我已经进行过数据同步的测试，所以上面的节点中会有ds:UpToDate/UpToDate这个信息。表示，两个节点的数据已经同步，如果第一次运行的话，这里应该是ds:Inconsistent/Inconsistent，表示两个节点的数据不一致。还会有一个同步进度的信息，类似&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[==&amp;gt;.................] sync'ed: 14.7% (262464/305152)K&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish: 0:02:58 speed: 1,440 (1,292) K/sec&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;当两端都同步完成后，我们就可以试验它保持主从数据的一致性了。&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;将主节点虚拟机drbd1上的drbd设备/dev/drbd0(说明一下，我在两个节点上都将/dev/drbd0作为drbd设备了)mount到一个目录，在我的虚报机上是/mnt/drbd1.然后朝里面拷贝一些文件，完成后在从节点虚拟机上先停止drbd：&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd0 ~]# /etc/init.d/drbd&amp;nbsp;stop&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;如果不停止的话,drbd会占用这个设备，因此无法将它Mount到一个目录上。&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;停止后执行&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd0 ~]#Mount /dev/hdb2&amp;nbsp;/mnt/drbd0&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;然后到/mnt/drbd0这个目录下可以看到刚才在主节点上拷贝的一些数据，现在已经同步过来了。&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;如果需要切换两个节点上的主从关系，可以先在主节点上卸载drbd设备(umount)，然后执行&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd1 ~]# drbdadm secondary r0&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;现在drbd1已经降为从节点了。&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;然后在以前的从节点上执行&lt;/div&gt;&lt;div style=&quot;border: 1pt solid rgb(204, 204, 255); padding: 1pt 4pt; background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 21pt; margin-right: 0cm;&quot;&gt;&lt;div style=&quot;background: rgb(224, 224, 224) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-indent: 24pt;&quot;&gt;[root@drbd0 ~]# drbdadm primary r0&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;就将其升为主节点了。&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;现在新的主节点上的数据就会向从节点上同步。&lt;/div&gt;&lt;div style=&quot;text-indent: 24pt;&quot;&gt;drbdadm -- --overwrite-data-of-peer primary all&lt;/div&gt;</description><category>我的随笔</category><pubDate>Tue, 01 Apr 2008 04:27:46 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/DRBD.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/DRBD.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/DRBD.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781928/4474951</fs:itemid></item><item><title>PHP中删除某个特定的HTML标签</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781929/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2903</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2903&amp;key=23a9dc77</trackback:ping><description>&lt;p&gt;使用PHP的内部函数strip_tags可以很方便的删除掉字符串中的所有HTML标签，但是很多情况下我们只需要删除某个特定的标签，有没有什么简单的办法呢？我仔细查看了下PHP手册，其实有个例子已经实现了，很少有人注意到，我简单的介绍一下。&lt;/p&gt;&lt;div class=&quot;mycode&quot;&gt;&amp;nbsp;&amp;lt;?php&lt;br /&gt;&amp;nbsp;function strip_selected_tags($text, $tags = array())&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $args = func_get_args();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $text = array_shift($args);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $tags = func_num_args() &amp;gt; 2 ? array_diff($args,array($text))&amp;nbsp; : (array)$tags;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ($tags as $tag){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(preg_match_all('/&amp;lt;'.$tag.'[^&amp;gt;]*&amp;gt;(.*)&amp;lt;\/'.$tag.'&amp;gt;/iU', $text, $found)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $text = str_replace($found[0],$found[1],$text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $text;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;?&amp;gt;&lt;/div&gt;&lt;p&gt;这个函数很短，但它实现的功能很实用，第一个参数是原字符串，第二个参数是要删除的HTML的标签数组，如果要删除&amp;lt;a&amp;gt;和&lt;a&gt;&amp;lt;p&amp;gt;&lt;/a&gt;标签，只需要使用下面的代码：&lt;/p&gt;&lt;div class=&quot;mycode&quot;&gt;&amp;nbsp;&amp;lt;?php&lt;br /&gt;$tags = array();&lt;br /&gt;$tags[0]='a'; &lt;br /&gt;$tags[1]='p'; &lt;br /&gt;&amp;nbsp;$str = &amp;quot;&amp;lt;a href=http://www.ajaxstu.com&amp;gt;link&amp;lt;/a&amp;gt;&amp;lt;p&amp;gt;help&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;echo strip_selected_tags($str,$tags);&lt;br /&gt;?&amp;gt;&lt;/div&gt;&lt;p&gt;是不是很简单呢？&lt;/p&gt;</description><category>正则表达式</category><pubDate>Sat, 22 Mar 2008 09:35:04 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2903.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2903.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2903.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781929/4474951</fs:itemid></item><item><title>学习微软的SaaS软件模式</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781930/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2902</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2902&amp;key=5d358b17</trackback:ping><description>&lt;p&gt;不得不佩服微软工程师的细心和对用户考虑的周到。&lt;/p&gt;&lt;p&gt;最近&lt;font color=&quot;#4e0a13&quot;&gt;微软推出的Office Live Workspace产品&lt;/font&gt;令人耳目一新，这个产品采用插件的方式，在本地的所有Office程序（Word、Excel、Powerpoint等）里都都有一个内置的Live Workspaces连接到用户的网络帐号，用户可以将本地Office文件直接同步或上传到自己的Office Live Workspace网络空间上，然后使用Live Workspace帐号从世界上任何地点来访问这个文件，并与其他用户共享。这应该是微软的&lt;font color=&quot;#4e0a13&quot;&gt;SaaS&lt;/font&gt;（软件即服务）战略的具体展现形式。&lt;/p&gt;&lt;p&gt;　　微软的这一策略值得中国广大的应用软件开发商思考，我们自己能不能借鉴和学习一下微软的Office Live Wordspace这种思路，来改进和完善自己的应用软件。&lt;/p&gt;&lt;p&gt;　　中国不少应用软件商有非常庞大的用户群，如果能够很好的利用，那么产生的效果可能会非常惊人。实际上软件开发商要修改的东西并不多，我们只要在自己的应用软件中做一个Addin，就可以让自己的用户将本地的数据库上传到软件开发商的网站上，软件开发商可以利用这个网站进行在线服务进行收费，用户则可以共享和远程使用自己的数据库，开发商和用户双方都可以实现现有软件价值的升值，让用户能够完成更多更好的功能，何乐而不为呢？&lt;/p&gt;&lt;p&gt;　　举个例子，财务记账类软件可以将用户帐套同步到远程服务器，这样用户可以随时随地远程访问自己的财务数据；字典翻译类软件可以将用户自己的字典同步到服务器，用户可以在其他地点使用自己的个性化数据。&lt;/p&gt;&lt;p&gt;　　所以，中国的应用软件开发商们，既然微软都能在自己的核心产品Microsoft Office实现这样的架构，我们为什么不能学习一下微软的思路，也在自己的应用软件中完成同样的功能呢？我觉得这还是很值得考虑考虑的，希望国内的软件工程师们能够有所借鉴。&lt;/p&gt;</description><category>我的随笔</category><pubDate>Mon, 10 Mar 2008 21:14:18 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2902.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2902.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2902.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781930/4474951</fs:itemid></item><item><title>传百度安全中心即将上线 涉水免费杀毒</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781931/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2901</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2901&amp;key=822f770e</trackback:ping><description>&lt;p&gt;百度又有大动作了。&lt;/p&gt;&lt;p&gt;消息人士透露，继百度紧锣密鼓要推出IM的消息后，百度即将试水在线杀毒服务，&amp;ldquo;百度安全中心&amp;rdquo;将于2月27日上线。百度此番是与金山合作，短期内完全采取免费的运营模式。&lt;/p&gt;&lt;p&gt;据了解，百度最新推出的百度安全中心将类似于Vista打分的方式来为系统进行安全评级，以此来提醒用户进行查杀病毒以及补丁升级等操作，为用户提供全面的在线安全服务。除了软件客户端之外，百度安全中心还提供了IE版，客户端内的所有功能在IE版中同样可以实现。&lt;/p&gt;&lt;p&gt;该消息人士透露，与一般杀毒软件厂商所提供的查毒免费与杀毒收费的在线服务不同，百度安全中心的查毒与杀毒都将成为免费服务。该产品是由百度与金山合作，金山将主要负责产品方面的研发，而百度则将重点放在推广方面，双方的合作在推广初期还未考虑盈利模式，但随着推广力度的逐步加大,未来可能会考虑广告方式的盈利模式，但对于用户端的服务将不会收费。&lt;/p&gt;</description><category>系统优化</category><pubDate>Fri, 22 Feb 2008 22:10:44 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2901.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2901.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2901.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781931/4474951</fs:itemid></item><item><title>传谷歌可能会收购乌克兰门户网站Bigmir</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781932/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2900</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2900&amp;key=b2872f12</trackback:ping><description>&lt;p&gt;据国外某博客指出，市场传出谷歌公司可能打算收购乌克兰门户网站Bigmir.net的传闻，Bigmir.net是乌克兰领先门户网站，拥有250万用户。传闻猜测这项交易的价格可能在1亿美元左右，2007年乌克兰在线广告市场的规模大概为1200万美元。 &lt;/p&gt;&lt;p&gt;如果这个传言属实，谷歌可能会继续在Bigmir网站上使用俄语搜索引擎Yandex。&lt;/p&gt;&lt;p&gt;谷歌在继续不停他的收购梦，让我们拭目以待。&lt;/p&gt;</description><category>我的随笔</category><pubDate>Tue, 19 Feb 2008 22:08:21 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2900.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2900.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2900.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781932/4474951</fs:itemid></item><item><title>微软Windows Live Spaces出现域名解析错误</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781933/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2899</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2899&amp;key=90ad2f58</trackback:ping><description>&lt;p&gt;今天是西方传统的情人节，微软的博客系统Windows Live Spaces出现了无法域名解析的现象，所有的博客地址都无法解析出IP，导致Windows Live Spaces无法访问。微软的Windows Live Spaces曾经在2006年6月份有一次大规模的无法访问事件。&lt;br /&gt;　　为了证实这个DNS解析问题的普及型，看看在国外是否也是一样解析错误，我使用Telnet登陆了我在国外的一个服务器地址，对Windows Live Spaces进行了Ping操作，发现一样也是无法Ping通，也无法访问到，Ping命令显示如下信息：&lt;br /&gt;$ ping williamlong.spaces.live.com&lt;br /&gt;ping: unknown host williamlong.spaces.live.com&lt;br /&gt;　　因此可以判断，Windows Live Spaces可能在全球范围出现了无法解析域名地址的现象，而导致全部无法访问，实在不清楚微软在搞什么鬼名堂，莫非微软的工程师都忙着情人节约会去了？&lt;/p&gt;&lt;p&gt;&lt;br /&gt;本文来源于月光博客 &lt;a href=&quot;http://www.williamlong.info&quot;&gt;http://www.williamlong.info&lt;/a&gt; &lt;/p&gt;</description><category>我的随笔</category><pubDate>Thu, 14 Feb 2008 21:12:19 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2899.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2899.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2899.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781933/4474951</fs:itemid></item><item><title>prado框架新控件的生成方法</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781934/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2898</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2898&amp;key=e3d35b5a</trackback:ping><description>&lt;div style=&quot;MARGIN: 17pt 0cm 16.5pt; LINE-HEIGHT: 18pt&quot; align=&quot;center&quot;&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;在使用prado的过程中，为了生成更加复杂和友好的界面，就需要我们编写新的控件的。&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;总的来说，有两种生成新控件的方式：组合已经存在的控件和扩展已经存在的控件。这两种生成控件的方式都需要它们的类继承自&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TControl&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;类或者它的子类&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;。&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;下面对这两种方式进行介绍：&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;一、&lt;/span&gt;&lt;/tt&gt;组合已经存在的控件&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;组合是生成新控件最简单的方式，我们只需要专注于已经存在的控件，有两种通过组合生成新控件的方式，一种是扩展&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TCompositeControl&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;类，覆盖TControl::createChildControls()这个方法；另一种是扩展TTemplateControl类或者它的子类，编写一个&lt;/span&gt;&lt;/tt&gt;&lt;font size=&quot;+0&quot;&gt;control template.，相对而言，后者要简单一点，并且通过这种方式可以很容易的了解界面的布局，但是前者的效率要比后者高，因为它不需要解析模板。&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;在界面的实际开发过程中，我们可能经常需要将一个labele控件和一个textbox控件组合使用，如果能将这两个空间组合起来生成一个新的控件，那是不是会使我们的开发容易很多呢？下面的例子是通过上述两种方式生成一个新控件&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;LabeledTextBox&lt;/span&gt;&lt;/tt&gt;的过程：&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;、通过编写控件模板的方式组合出新控件&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;这种方式需要两个文件：控件类&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;LabeledTextBox.php&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;和控件模板文件LabeledTextBox.tpl，这两个文件必须要放在同一个目录。&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;与编写prado page文件差不多，下面是控件模板LabeledTextBox.tpl的代码：&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;BORDER-RIGHT: #ccffcc 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #ccffcc 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 1pt; BORDER-LEFT: #ccffcc 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: #ccffcc 1pt solid&quot;&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;com:TLabel&lt;/span&gt;&lt;span&gt; ID=&lt;/span&gt;&lt;span&gt;&amp;quot;Label&amp;quot;&lt;/span&gt;&lt;span&gt; ForControl=&lt;/span&gt;&lt;span&gt;&amp;quot;TextBox&amp;quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;com:TTextBox&lt;/span&gt;&lt;span&gt; ID=&lt;/span&gt;&lt;span&gt;&amp;quot;TextBox&amp;quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;它声明了一个id为&lt;span&gt;Label&lt;/span&gt;&lt;span&gt;的TLabel&lt;/span&gt;&lt;span&gt;控件和一个id&lt;/span&gt;&lt;span&gt;为&lt;/span&gt;&lt;span&gt;TextBox&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;TTextBox&lt;/span&gt;&lt;span&gt;控件，我们需要注册这两个控件。我们可以通过在&lt;/span&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;LabeledTextBox&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;类文件里&lt;/span&gt;&lt;/tt&gt;&lt;span&gt;为这两个控件分别定义属性，例如，我们定义一个&lt;/span&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;Label&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;属性：&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;BORDER-RIGHT: #ccffcc 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #ccffcc 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 1pt; BORDER-LEFT: #ccffcc 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: #ccffcc 1pt solid&quot;&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;class&lt;/span&gt; LabeledTextBox &lt;span&gt;extends TTemplateControl {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function getLabel() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;ensureChildControls();&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $this-&amp;gt;getRegisteredObject('Label');&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;在上面的代码中，&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;ensureChildControls()&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;这个调用保证了&lt;/span&gt;&lt;/tt&gt;在&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;Label&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;属性被访问时成功&lt;/span&gt;&lt;/tt&gt;创建label 和textbox这两个控件，&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TextBox&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;属性也是如此。&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;在使用该方法组合新控件时，在page的Php文件中需要包含该新控件的路径，例如：example.php(&lt;/span&gt;&lt;/tt&gt;&lt;span&gt;LabeledTextBox&lt;/span&gt;&lt;span&gt;控件放置在pages/ NewControls&lt;/span&gt;&lt;span&gt;路径下&lt;/span&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;)&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;BORDER-RIGHT: #ccffcc 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #ccffcc 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 1pt; BORDER-LEFT: #ccffcc 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: #ccffcc 1pt solid&quot;&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;lt;?php&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;Prado::&lt;span&gt;using('Application.pages.NewControls.LabeledTextBox');&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;class&lt;/span&gt; Home &lt;span&gt;extends TPage&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function buttonClicked($sender,$param)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $sender-&amp;gt;Text=$this-&amp;gt;Input-&amp;gt;TextBox-&amp;gt;Text;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;2&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;、通过覆盖createChildControls()的方式组合新的控件&lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;在组合新控件的过程中，最好的办法就是通过扩展TCompositeControl类来覆盖createChildControls()方法，因为它不需要模板，因此可以节省解析模板的时间，从而提高效率。&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;下面是完整的通过扩展TCompositeControl类的事例代码：&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;BORDER-RIGHT: #ccffcc 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #ccffcc 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 1pt; BORDER-LEFT: #ccffcc 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: #ccffcc 1pt solid&quot;&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;class&lt;/span&gt; LabeledTextBox &lt;span&gt;extends TCompositeControl {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private $_label;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private $_textbox;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected function createChildControls() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_label=new TLabel;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_label-&amp;gt;setID('Label');&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the label as a child of LabeledTextBox&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;getControls()-&amp;gt;add($this-&amp;gt;_label);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_textbox=new TTextBox;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_textbox-&amp;gt;setID('TextBox');&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;_label-&amp;gt;setForControl('TextBox');&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the textbox as a child of LabeledTextBox&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;getControls()-&amp;gt;add($this-&amp;gt;_textbox);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function getLabel() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;ensureChildControls();&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $this-&amp;gt;_label;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function getTextBox() {&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;ensureChildControls();&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $this-&amp;gt;_textbox;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;BACKGROUND: #dddddd; MARGIN: auto 0cm; TEXT-INDENT: 22pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;新的控件已经生成了，我们该如何使用呢？&lt;/div&gt;&lt;div style=&quot;BORDER-RIGHT: #ccffcc 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #ccffcc 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #dddddd; PADDING-BOTTOM: 1pt; BORDER-LEFT: #ccffcc 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: #ccffcc 1pt solid&quot;&gt;&lt;div style=&quot;MARGIN: auto 0cm&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;com:LabeledTextBox&lt;/span&gt;&lt;span&gt; ID=&lt;/span&gt;&lt;span&gt;&amp;quot;Input&amp;quot;&lt;/span&gt;&lt;span&gt; Label.Text=&lt;/span&gt;&lt;span&gt;&amp;quot;Username&amp;quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;跟使用普通的prado控件一样，是不是很简单？&lt;span&gt;Label.Text&lt;/span&gt;&lt;span&gt;就是lable&lt;/span&gt;&lt;span&gt;的文字描述。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;二、扩展已经存在的控件&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;扩展已经存在的控件跟传统的类继承方式一样，通过这种方法我们可以通过覆盖它们的属性、方法、事件处理等定制一些已经存在的控件类。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 21pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;span&gt;这种方式的难度在于被覆盖的控件类的规模，举例来说，在定制&lt;/span&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TLabel&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;控件中，我们需要使lable默认的颜色是红色，这仅仅需要我们在构造函数里设置ForeColor属性就ok了。比较难的是创建一个具有新功能的控件，通常，这种方式的控件类需要继承低层次的基础类，如TControl&lt;/span&gt;&lt;/tt&gt; 或者&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TWebControl&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;类。&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;1&lt;/span&gt;&lt;/tt&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;、扩展TControl类&lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;tt&gt;TControl&lt;/tt&gt; 是所有控件类的基础类.有两个最重要的方法:&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 25.5pt; TEXT-INDENT: 19.45pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;addParsedObject() &amp;ndash;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;这个方法在标识一个模板里所有的组件或者有tag标签的文本时被调用到。默认的，这些组件或者文本要被添加到控件的容器里，新生成的控件在处理它自身的内容时可能要覆盖这个方法，例如，TListControl只会接受TListItem组件，这些组件要被添加到TListControl的容器中。 &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;render() &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;这个方法就是绘制界面，默认的，它将某一控件的所有内容都呈现出来，新生成的控件类可以覆盖这个方法定制具有特色的类. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;其它的一些重要属性和方法: &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;ID &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;标识一个控件的字符串，如果没有定义，它会自动生成. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;UnqiueID &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;跟上面的意思差不多，可以通过调用TControl::findControl()来定位一个控件。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;ClientID &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;类似UniqueID, 在界面的HTML元素里可以体现出来。. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;Enabled &amp;ndash;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;设置某控件当前是否enable，子控件继承父控件的该属性。 &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;Parent &amp;ndash;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;该控件的父控件.它将负责该控件是否进行绘制和决定该控件的绘制结果是否进行存放。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;Page &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;包含控件的页面. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;Controls &amp;ndash;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;所有子控件的容器，包括静态的文本，它可以是数组，并且实现了Traversable 接口，将一个子控件添加到该控件中，简单的将它插入到合适的位置就可以了。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;getViewState() and setViewState() &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;这两个方法通常用来定义控件的属性，它们通过设置viewstate 属性的方法. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;saveState() and loadState() &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;这两个方法提供现场和保存现场，可以被覆盖. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;、扩展&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt; TWebControl&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;类&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TWebControl&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;作为一个主要的基础类在呈现HTML元素时被用到，它提供了设置HTML元素属性的方法，它分解了 TControl::render()为如下的更能描绘HTML元素的方法：&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;addAttributesToRender() &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;添加一个要被描绘的HTML元素的属性，当需要描绘不同的属性时，该方法经常要被覆盖掉。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;renderBeginTag() &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;描绘HTML元素的开始标签 &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;renderContents() &amp;ndash; &lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;类似上面的.当需要定制内容时该方法要被覆盖掉。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 9pt; LINE-HEIGHT: 18pt; TEXT-ALIGN: left&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;middot;&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;renderEndTag() -&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;描绘HTML元素的结束标签 &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;当描绘HTML的tag时，TWebControl类实现了getTagName()去获取该标签的名字，如TButton类中调用该方法返回的就是&amp;ldquo;input&amp;rdquo;。可以通过覆盖该方法来描绘不同的标签名称。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN: auto 0cm; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 18pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;、创建具有特殊功能的控件&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style=&quot;MARGIN-LEFT: 21pt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;如果一个控件需要在客户端接收事件然后传递给服务器端，例如TButton，需要实现IPostBackEventHandler这个接口。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;如果一个控件能够加载数据，例如TTextBox，需要实现IPostBackDataHandler这个接口。&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;总结：纵观prado的所有控件，其实现原理就是通过使用继承TControl类或者&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;TWebControl&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;中对HTML标准控件进行了一次包装的接口，这些接口主要通过组织、描绘HTML标签，最终呈现在界面上，prado在搜集所有的HTML元素的属性时是通过setviewstate和getviewstate来实现。控件中的事件处理，和用户输入合法性的检查，是通过注册&lt;/span&gt;&lt;tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;事件处理的handler和&lt;/span&gt;&lt;/tt&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;validator&lt;/span&gt;&lt;span style=&quot;FONT-SIZE: 12pt&quot;&gt;来实现。在每个application运行时，会将事件处理程序和validator的判断程序放在js文件中，客户端直接包含进来，所以有些简单的事件处理和错误检查是在客户端进行的。&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;TEXT-INDENT: 24pt; LINE-HEIGHT: 18pt&quot; align=&quot;left&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;</description><category>组件</category><pubDate>Thu, 31 Jan 2008 17:26:38 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/2898.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/2898.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/2898.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781934/4474951</fs:itemid></item><item><title>Linux下Apache+cgi的配置方法(虚拟机环境)</title><link>http://item.feedsky.com/~feedsky/ajaxstu/~6367012/72781935/4474951/1/item.html</link><wfw:comment>http://www.ajaxstu.com/</wfw:comment><wfw:commentRss>http://www.ajaxstu.com/sydication.asp?cmt=2897</wfw:commentRss><trackback:ping>http://www.ajaxstu.com/cmd.asp?act=tb&amp;id=2897&amp;key=e706789c</trackback:ping><description>&lt;p&gt;下面的内容是我以前工作中的笔记，分享一下。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、&amp;nbsp;安装apache&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先下载apache的安装包，httpd-2.2.3.tar.gz&lt;br /&gt;切换到该安装包所在目录，执行：&lt;br /&gt;tar xvzf httpd-2.2.3.tar.gz&lt;br /&gt;会生成一个目录：httpd-2.2.3&lt;br /&gt;cd&amp;nbsp; httpd-2.2.3&lt;br /&gt;如果要将apache安装到/usr/local/apache，则执行：&lt;br /&gt;./configure --prefix= /usr/local/apache&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;执行完这3条命令后，apache就安装到你的 /usr/local/apache目录下了&lt;br /&gt;cd ./usr/local/apache&lt;br /&gt;可以看到几个目录，切换到bin目录下，执行&lt;br /&gt;./apachectl start&lt;br /&gt;Apache服务就启动了。&lt;br /&gt;在地址栏输入 &lt;a href=&quot;http://localhost&quot;&gt;http://localhost&lt;/a&gt; 就可以看到浏览器显示&amp;quot;It works!&amp;quot;的信息，如果是是安装到虚拟机上，假设虚拟机的IP是10.190.41.85，就在windows上浏览器输入&lt;a href=&quot;http://10.190.41.85&quot;&gt;http://10.190.41.85&lt;/a&gt;也可以看到刚才的信息&lt;br /&gt;到这里，apache就安装完成了。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、&amp;nbsp;配置CGI&lt;/strong&gt;&lt;/p&gt;新版本的apache默认是支持CGI的，如果不能确认的话可以打开apache安装目录下的conf/httpd.conf&amp;nbsp;&amp;nbsp; 文件，找到ScriptAlias /cgi-bin/ &amp;quot;/usr/local/apache/cgi-bin/&amp;quot; 这一行，如果这行没有注释，那就是已经支持CGI了，如果被注释的话只需将前面的注释符号去掉就OK了。&lt;br /&gt;&lt;p&gt;&lt;strong&gt;3、&amp;nbsp;示例：&lt;/strong&gt;&lt;/p&gt;编辑一个cpp文件，命名为hello.cpp&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;mycode&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;p&gt;&amp;nbsp;using namespace std;&lt;/p&gt;&lt;p&gt;int main(void) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;Content-type: text/html&amp;quot; &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;HTML&amp;gt;&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;BODY&amp;gt;&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;Hello World!&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;/BODY&amp;gt;&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;&amp;lt;/HTML&amp;gt;&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&lt;p&gt;编译该文件，生成执行档hello.cgi，给该执行档加上执行权限（这步很重要，不然访问的时候就会出错了），然后将起拷到apache安装目录的cgi-bin目录下，在浏览器下输入&lt;a href=&quot;http://10.190.41.85/cgi-bin/hello.cgi&quot;&gt;http://10.190.41.85/cgi-bin/hello.cgi&lt;/a&gt;就可以看到&amp;quot;Hello World!&amp;quot;的内容了&lt;br /&gt;&lt;/p&gt;</description><category>HTML基础</category><pubDate>Fri, 25 Jan 2008 17:00:04 +0800</pubDate><author>a@b.com (tomorrow819)</author><comments>http://www.ajaxstu.com/archives/Apache-cgi-Linux.html#comment</comments><guid isPermaLink="false">http://www.ajaxstu.com/archives/Apache-cgi-Linux.html</guid><dc:creator>a@b.com (tomorrow819)</dc:creator><fs:srclink>http://www.ajaxstu.com/archives/Apache-cgi-Linux.html</fs:srclink><fs:srcfeed>http://www.ajaxstu.com/rss.xml</fs:srcfeed><fs:itemid>feedsky/ajaxstu/~6367012/72781935/4474951</fs:itemid></item></channel></rss>