﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-gyn-随笔分类-TclTk</title><link>http://www.cnitblog.com/gyn/category/7722.html</link><description>Win32下的Perl，无用的select，停滞的Tk，结束吧....</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 14:22:17 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 14:22:17 GMT</pubDate><ttl>60</ttl><item><title>TclTk Socket编程的测试</title><link>http://www.cnitblog.com/gyn/archive/2010/03/25/64822.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 25 Mar 2010 07:04:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2010/03/25/64822.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/64822.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2010/03/25/64822.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/64822.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/64822.html</trackback:ping><description><![CDATA[最近写了一个tcltk的rpc脚本，用来远程执行tcl脚本。基本上的思路就是，客户端发出一连串的脚本命令，只要是tcl的都行，函数啊什么的；服务
器端接受后，检测一下，没有语法错误的话，就把运行结果返回给客户端，同时清空缓冲区并等待接下来接收的命令。具体的解释以后再说，也可能不写了。我的想
法是把这个脚本安在一个服务器上，作为一个以tcl脚本为基础的通用服务，执行来自不同客户端的各个任务。<br />
大抵这种两端跑的程序，写的时候没什么，测试的时候就颇为麻烦了。开两个cmd，一边一个server，另一边client，完了为了停下来还得两头按
Control-C，真是一个手忙脚乱啊！<br />
我想这样的测试，一般都是起了服务端，再客户端发一些命令，然后看接受效果就差不多了。完全可以搞在一起，把测试弄成一个脚本来执行，完了一起退出。当然
服务器端脚本和客户端脚本要在不同的环境中运行。这里有两个选择，要么建两个interp，要么用多线程。前段时间用interp用得有点腻味，包括这个
rpc脚本也是用interp来处理不同的客户端连接的，所以这次换用多线程。具体的脚本如下，存为test_in_thread.tcl文件：<br />
package require Thread<br />
package require ltools<br /><br />
foreach file $argv command {server_commands client_commands} {<br />
    set $command "source $file"<br />
}<br /><br />
set serv_thread [thread::create $server_commands]<br />
set cli_thread  [thread::create $client_commands]<br /><br />
after 5000 {<br />
    leach [list $::cli_thread $::serv_thread] [@ {thread} {<br />
        thread::release $thread<br />
    }]<br />
    set delay 1<br />
}<br /><br />
vwait delay<br />
其实很简单，执行的参数包含两个脚本名，分别是服务器端和客户端的；接着，起两个线程，程序等待在delay变量上，5秒之后重设delay并完成退出。
这样以后测试socket程序就方便多了。如上面说的rpc程序，写完之后运行：tcl86 test_in_thread.tcl rpc.tcl 
rpc_test.tcl，看看结果就行了。<br /><a href="/Files/gyn/test_in_threads.rar">附件下载</a><br /><img src ="http://www.cnitblog.com/gyn/aggbug/64822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2010-03-25 15:04 <a href="http://www.cnitblog.com/gyn/archive/2010/03/25/64822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tcl闭包</title><link>http://www.cnitblog.com/gyn/archive/2010/03/15/64656.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 15 Mar 2010 12:26:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2010/03/15/64656.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/64656.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2010/03/15/64656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/64656.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/64656.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:华文中宋;
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
@font-face
	{font-family:"\@华文中宋";
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:华文中宋;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">Tcl</span>
				<span style="font-family: 华文中宋;">中没有闭包，但是以字符串为基础的构建使得类似功能的实现并不是一件很困难的事情。在平时的</span>
				<span lang="EN-US">coding</span>
				<span style="font-family: 华文中宋;">中倒是经常为一些</span>
				<span lang="EN-US">Tcl</span>
				<span style="font-family: 华文中宋;">的规则所困扰。比如说，需要一个用过即丢弃的功能，由于</span>
				<span lang="EN-US">Tcl</span>
				<span style="font-family: 华文中宋;">并没有匿名函数一说，为此不得不建立一个命名函数，这个随无伤大雅但在代码的结构上看来却有点扎眼，很让人不爽。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">我没有对闭包做深入的研究，所以对于类似闭包功能的使用，仅仅实现了以下的几个功能。第一，一个容易读懂的代码段；第二，具备上下文环境的信息；第三，可在运行时接收参数。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">这里所谓容易懂的代码是指不用双引号包围的字符串，虽然使用双引号可以很方便地融入上下文环境中，但是由于转义和执行等情况的存在，不仅不易于编写而且更不容易读明白，因此最好还是用花括号来包围。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">第二个问题比较麻烦。对于在花括号中定义的字符串，一般可以使用</span>
				<span lang="EN-US">subst</span>
				<span style="font-family: 华文中宋;">来做一些替换工作，但事实上</span>
				<span lang="EN-US">subst</span>
				<span style="font-family: 华文中宋;">除了提供延时替换以及</span>
				<span lang="EN-US">nobackslashes</span>
				<span style="font-family: 华文中宋;">、</span>
				<span lang="EN-US">nocommand</span>
				<span style="font-family: 华文中宋;">控制特征之外，与双引号没有本质上的区别，有些时候甚至不如双引号方便。而即使是用双引号包围了的代码段，依然可能在不经意间造成错误。假设有以下一个程序：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
		</p>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:华文中宋;
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
@font-face
	{font-family:"\@华文中宋";
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:华文中宋;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set a jack</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set code “ set a mike; puts $a “</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
		</p>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:华文中宋;
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
@font-face
	{font-family:"\@华文中宋";
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:华文中宋;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">在全局环境中，定义了一个值为</span>
				<span lang="EN-US">jack</span>
				<span style="font-family: 华文中宋;">的变量</span>
				<span lang="EN-US">a</span>
				<span style="font-family: 华文中宋;">；接着，又定义了一个名为</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">的字符串，其中也定义了变量</span>
				<span lang="EN-US">a</span>
				<span style="font-family: 华文中宋;">，但是由于存在转义，事实上这个</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">变成了：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set a mike; puts jack</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">也就是说，如果用</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">来实现闭包的功能，那么将无法在定义与全局中同名的变量。这显然不是很方便，当在类闭包中定义了一个变量的时候，它的作用域应该是属于当前的，而与外层的环境无关，只有没有显式定义的参数我们才需要将其置换为上下文环境中定义的值。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">到这里就涉及到一个如何引入上下文环境的问题了，一种就像上面所写的，直接进行变量替换，但是这样做存在副作用；另一种办法是，添加参数定义，即搜索类闭包中的参数，之后在类闭包的开始处添加使用上下文环境的值的定义。还是上面那个例子，使用这个办法，</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">将变为：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set a jack</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set a mike; puts $a</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">倘若</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">中没有</span>
				<span lang="EN-US">a</span>
				<span style="font-family: 华文中宋;">的显式定义，则是：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set a jack</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">puts $a</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">由于添加的定义永远先于类闭包中代码段的内容，所以无论是否定义同名参数，都不会影响到实际的执行效果。这是一种本地优先的规则，类闭包中没有定义的变量将使用全局替换，而定义了的变量，即使是上下文环境同名变量，依然会使用类闭包中定义的值。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">显然作为后一种方法，是恰好能满足我们需要的，不过也面临一个问题，即找出在类比包中的变量名。我用了一个正则判断来得到所有的变量，之后进行筛选以剔除重复并使用</span>
				<span lang="EN-US">info</span>
				<span style="font-family: 华文中宋;">函数来验证的确存在该变量。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set unique_vars {}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">foreach w [regexp -all -inline {\$[:\w]+} $code] {</span>
		</p>
		<p class="MsoNormal" style="text-indent: 38.85pt;">
				<span lang="EN-US">foreach u $unique_vars {</span>
		</p>
		<p class="MsoNormal" style="text-indent: 59.85pt;">
				<span lang="EN-US">if {$u == $w} { continue }</span>
		</p>
		<p class="MsoNormal" style="text-indent: 41.05pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 41.05pt;">
				<span lang="EN-US">lappend unique_vars $w</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">set buf {}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">foreach w $unique_vars {</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>set w [string trimleft $w
\$]</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>if [uplevel 1 info exists
$w] {</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>upvar 1 $w var</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>set buf "$buf set
$w $var;"<span style="">    </span></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">最终得到的</span>
				<span lang="EN-US">buf</span>
				<span style="font-family: 华文中宋;">将被放置在</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">之前，实现上下文环境对类比包的作用。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">第三问题说明，这个类闭包可以接收传入参数，比如一个类闭包被赋值给名为</span>
				<span lang="EN-US">lambda</span>
				<span style="font-family: 华文中宋;">的变量，那么它支持形如</span>
				<span lang="EN-US">”yield lambda $var”</span>
				<span style="font-family: 华文中宋;">形式的调用。至于支持传入几个参数，就像</span>
				<span lang="EN-US">proc</span>
				<span style="font-family: 华文中宋;">一样，在定义类闭包的时候需要显式说明。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">参数传入的实现，在原理上与第二个问题的解决办法类似，但这里的关键在于在与生成的类闭包对象。事实上，该对象包含了两个部分，分别是传入参数的定义和代码段。当执行类闭包的时候，传入的值将和定义的参数结合，被放置于</span>
				<span lang="EN-US">code</span>
				<span style="font-family: 华文中宋;">的前端。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 华文中宋;">最后为了方便使用，我将创建和运行类闭包的命令</span>
				<span lang="EN-US">fenbie </span>
				<span style="font-family: 华文中宋;">定义为“</span>
				<span lang="EN-US">@</span>
				<span style="font-family: 华文中宋;">”和“</span>
				<span lang="EN-US">~</span>
				<span style="font-family: 华文中宋;">”。以下是一个例子：</span>
		</p>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:华文中宋;
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
@font-face
	{font-family:"\@华文中宋";
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:华文中宋;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">if 1 {</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>set name1 jack<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>set name2 mike<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>set lamb [ @ {{id 1}} { <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>if {$id == {}} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">            </span>puts {nothing to
puts}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">            </span>return<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>while {$id &gt; 0} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">            </span>puts "hello,
$name1 and $name2"<span style="">     </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">            </span>incr id -1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>} ]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>~ $lamb</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
		</p>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:华文中宋;
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
@font-face
	{font-family:"\@华文中宋";
	panose-1:2 1 6 0 4 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:647 135200768 16 0 262303 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:华文中宋;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">
				<span style="">    </span>puts {}</span>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>foreach id {1 2 3} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>puts "$id
time(s):"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>~ $lamb $id<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">        </span>puts {}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<a href="/Files/gyn/closure.rar">closure包下载</a>
						<br />
				</span>
		</p>
		<p>
		</p>
		<p>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/64656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2010-03-15 20:26 <a href="http://www.cnitblog.com/gyn/archive/2010/03/15/64656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ATS：TclTk IDE下载</title><link>http://www.cnitblog.com/gyn/archive/2009/12/21/63264.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 21 Dec 2009 07:01:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/12/21/63264.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/63264.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/12/21/63264.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/63264.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/63264.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt">
				<span style="FONT-FAMILY: 黑体">
						<a href="/Files/gyn/ats.rar">ATS for windwos下载</a> （别放在桌面运行，程序对中文路径支持不好）<br />   最近很不想写随笔，其实是怕写出来丢人。以前啥都不懂的时候，什么都敢写，也不怕出洋相，而现在却害怕拿出来丢人了，就像我现在写文章没</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">5000</span>
				<span style="FONT-FAMILY: 黑体">字也不敢出去发。某种意义上说，算是水平有点了吧，虽然这个说法很是贻笑大方。</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">
						<?xml:namespace prefix = o /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt">
				<span style="FONT-FAMILY: 黑体">今天，我把前段时间做的一个用于开发</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">TclTk</span>
				<span style="FONT-FAMILY: 黑体">的</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">IDE</span>
				<span style="FONT-FAMILY: 黑体">工具用</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">TDK</span>
				<span style="FONT-FAMILY: 黑体">打了个包，传上来。从做完到修掉大多数</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">bug</span>
				<span style="FONT-FAMILY: 黑体">，之间隔了一段时间，一个原因是做完之后精神一下子放松下来了，没有了干劲；第二个，毕竟是一个人的作品，很难做到面面俱到，不过我也算是尽力而为了。目前的作品是可以拿出来用的，至少我自己是用它来写程序的，一面修改一些</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">bug</span>
				<span style="FONT-FAMILY: 黑体">。这次打包的程序中，除了对</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">Tcl</span>
				<span style="FONT-FAMILY: 黑体">的支持，还有对</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">python</span>
				<span style="FONT-FAMILY: 黑体">的语法着色和缩进支持，但只是很简略的，主要还是为了</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">Tcl</span>
				<span style="FONT-FAMILY: 黑体">。</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt">
				<span style="FONT-FAMILY: 黑体">接下来，有空的时候，我会再给它增加几个菜单栏，至少要让它有模有样起来。其实一开始我是打算先做菜单的，因为这个我有经验。相反地对于工具栏我没有什么信心，也不知道该放点什么功能上去，于是花了大力气在这方面，最后反而冷落了菜单的设置。我想这个不难，只是要花点功夫。另外，就以前写的一个提词软件，感谢崔姓同学的建议和提供的国外软件样本，有时间我会改写的。</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt">
				<span style="FONT-FAMILY: 黑体">前段时间，我还参与了联汇公司的</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">link pro</span>
				<span style="FONT-FAMILY: 黑体">音频工作站测试和部署工作。逻辑功能是比较完善，不过</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">UI</span>
				<span style="FONT-FAMILY: 黑体">乱且不说，简直惨不忍睹，国内的软件普遍有这个坏毛病。不过，把管理站建立在</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">web</span>
				<span style="FONT-FAMILY: 黑体">中，我个人认为是一个好的方向，以后可以考虑更多一点的富客户端应用，甚至把整个系统都搬到</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">web</span>
				<span style="FONT-FAMILY: 黑体">上去，这也不是不可能，而且无论从安全性还是性能、外观都会上一个台阶。不过，就目前的这个管理站的</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">ASP.Net</span>
				<span style="FONT-FAMILY: 黑体">开发水平，这些开发员怕还是不够看。</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt">
				<span style="FONT-FAMILY: 黑体">年终将近，铁塔的工程牵扯了我大半的精力，到目前为止竣工已经不再是遥遥无期的事情了，但还需要加把劲争取在年前完成。以前很喜欢听</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">911</span>
				<span style="FONT-FAMILY: 黑体">的歌，后来</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">coldplay</span>
				<span style="FONT-FAMILY: 黑体">，间或一直在听</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">sting</span>
				<span style="FONT-FAMILY: 黑体">的歌，现在变得只能听班得瑞了</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">…</span>
				<span style="FONT-FAMILY: 黑体">人啊总是在朝一个方向走的，什么都拉不住</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">…</span>
				<span style="FONT-FAMILY: 黑体">下午的天气很好，休息，休息一下</span>
				<span lang="EN-US" style="FONT-FAMILY: Arial">….</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt">
				<span lang="EN-US" style="FONT-FAMILY: Arial">
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/8564/r_ats.png" />
						<br />
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/63264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-12-21 15:01 <a href="http://www.cnitblog.com/gyn/archive/2009/12/21/63264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类Emacs窗体分割之我见</title><link>http://www.cnitblog.com/gyn/archive/2009/09/29/61631.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Tue, 29 Sep 2009 11:42:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/09/29/61631.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/61631.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/09/29/61631.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/61631.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/61631.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">其实也并非</span>
				<span lang="EN-US">
						<font face="Arial">Emacs</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">专有，像</span>
				<span lang="EN-US">
						<font face="Arial">Vim</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">或者</span>
				<span lang="EN-US">
						<font face="Arial">UE</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">也有类似的功能，只是我用</span>
				<span lang="EN-US">
						<font face="Arial">Emacs</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">比较多，所以才取了这个题目。总之，就是将在编辑的一个文本框分割为垂直或者水平的两个相同大小的文本，对于同一个编辑目标，两者保持相同的内容变更，但两者又可分别显示不同的编辑对象，被分割出来的两个文本框又可自行再次分割，以此类推。如果看的迷糊的，自己试试</span>
				<span lang="EN-US">
						<font face="Arial">Emacs</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">去，“</span>
				<span lang="EN-US">
						<font face="Arial">Control x 2</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">（</span>
				<span lang="EN-US">
						<font face="Arial">3</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">）”就行。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这么做的好处在于可以同时观察到两个相关的代码段，有助于查找需要的信息，或者其中一个编辑另一个执行某个如</span>
				<span lang="EN-US">
						<font face="Arial">tclsh</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的命令，等等。差不多就是一个多任务的形式，思维比较活跃的人多是喜欢这样开好几个窗口干活。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这个看似简单易用的玩意儿，实现起来却有点让人无从下手。首先，要让两个同编辑目标的文本框保持同步更新；第二，同一个文本框中切换不同编辑对象时，需要保证如语法渲染之类的操作不影响切换速度；第三，保证分割出来的文本框不会改变父窗体的大小。也许还有别的问题，但这三个是让我有点茫然的东西。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">经过一番思量，对于第一个问题，应该可以用</span>
				<span lang="EN-US">
						<font face="Arial">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">注入代码完成。这在我之前写的文章里有很多涉及，这里就具体不讲。只是需要判断一下两个文本框的编辑对象是否一致。如此一来，对于第二个问题，则需要在每次切换的时候将涉及到渲染或者计算的部分以一定结构的数据形式将结果存储起来以备后用，比如将用于作色渲染的</span>
				<span lang="EN-US">
						<font face="Arial">tag</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">标记都</span>
				<span lang="EN-US">
						<font face="Arial">dump</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">出来，还有复制内容，当前插入点等等。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">不过，在这里我采用了另一种更加优雅的方式，其实是使用了在</span>
				<span lang="EN-US">
						<font face="Arial">Tk8.5</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中新加入的</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">组件命令：</span>
				<span lang="EN-US">
						<font face="Arial">peer</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，在</span>
				<span lang="EN-US">
						<font face="Arial">actovetcl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的</span>
				<span lang="EN-US">
						<font face="Arial">demo</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中也可以看到相关的例子。就是对于一个已建的</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">组件，通过</span>
				<span lang="EN-US">
						<font face="Arial">peer</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">命令生成它的镜像对象，这两个对象是完全相同的，对任一个的才做都会影响其他对象的变现。事实上，对于一个新建的文本编辑对象，我<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:personname w:st="on" productid="都首">都首</st1:personname>先生成了一个不被</span>
				<span lang="EN-US">
						<font face="Arial">geometry</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">对象，用术语说就是</span>
				<span lang="EN-US">
						<font face="Arial">buffer</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，再针对这个</span>
				<span lang="EN-US">
						<font face="Arial">buffer</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">来</span>
				<span lang="EN-US">
						<font face="Arial">peer</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">出所有需要显示的文本框窗体。那么对于第二个问题，就不是某个</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">组件中内容之间的切换了，而是不同</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">组件之间的切换，可以通过</span>
				<span lang="EN-US">
						<font face="Arial">forget</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">来完成。这么做的好处在于，我肯本不用考虑切换时状态存储，而且</span>
				<span lang="EN-US">
						<font face="Arial">peer</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">可以更好地保证编辑对象的一致性要求。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">而第三个问题的解决让我对</span>
				<span lang="EN-US">
						<font face="Arial">geometry</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中的</span>
				<span lang="EN-US">
						<font face="Arial">place</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">命令有了全新的认识。众所周知，</span>
				<span lang="EN-US">
						<font face="Arial">geometry</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的三种方法中，最被广泛使用的是</span>
				<span lang="EN-US">
						<font face="Arial">pack</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，其次是</span>
				<span lang="EN-US">
						<font face="Arial">grid</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，最后才是</span>
				<span lang="EN-US">
						<font face="Arial">place</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">。无论那本介绍</span>
				<span lang="EN-US">
						<font face="Arial">Tk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的书籍，都是按照这个顺寻来编写的。也许是应为</span>
				<span lang="EN-US">
						<font face="Arial">pack</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的命令最短，也更通俗易懂一些。但在这里，我不得不使用</span>
				<span lang="EN-US">
						<font face="Arial">place</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">。对于一个需要被分割的文本框，以下的代码很难控制父窗体的大小。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span lang="EN-US" style="FONT-FAMILY: 'Courier New'">package require Tk<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span lang="EN-US" style="FONT-FAMILY: 'Courier New'">text .t1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span lang="EN-US" style="FONT-FAMILY: 'Courier New'">text .t2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span lang="EN-US" style="FONT-FAMILY: 'Courier New'">pack .t1 –fill both –expand 1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span lang="EN-US" style="FONT-FAMILY: 'Courier New'">pack forget .t1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span lang="EN-US" style="FONT-FAMILY: 'Courier New'">pack .t1 .t2 -side left –fill both –expand 1<o:p></o:p></span>
		</p>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">事实上，这么做的结果是使父窗体加宽了一倍。即使你小心地设定了</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 黑体; mso-bidi-font-size: 12.0pt">text</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">组件的</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 黑体; mso-bidi-font-size: 12.0pt">width</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">，一旦</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 黑体; mso-bidi-font-size: 12.0pt">fill</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">开来就面目全非了。在这里只能使用</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 黑体; mso-bidi-font-size: 12.0pt">place</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">，结合相对起点与相对长宽，精确设定分割窗体大小。以下是一个实现类以上所讲到和没讲到的功能的完整</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 黑体; mso-bidi-font-size: 12.0pt">demo</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">，有兴趣的可以看看。其中还包含了切换和关闭</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 黑体; mso-bidi-font-size: 12.0pt">buffer</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-hansi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">的快捷键。<br /><a href="/Files/gyn/split.rar">split.tcl文件下载</a></span>
<img src ="http://www.cnitblog.com/gyn/aggbug/61631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-09-29 19:42 <a href="http://www.cnitblog.com/gyn/archive/2009/09/29/61631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tcl中的输出重定向</title><link>http://www.cnitblog.com/gyn/archive/2009/09/25/61573.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 25 Sep 2009 06:50:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/09/25/61573.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/61573.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/09/25/61573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/61573.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/61573.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">有时候重定向是得到执行信息的必要手段，比如我在调试某个程序时需要将调试的输出结果存放到某个文件中以便于日后查看。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">1.close stdout<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">2.set stdout [open out.txt w]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">我关闭并重定义了</span>
				<span lang="EN-US">
						<font face="Courier New">stdout</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，使其成为某个被打开文件的</span>
				<span lang="EN-US">
						<font face="Courier New">channel</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，那么执行</span>
				<span lang="EN-US">
						<font face="Courier New">puts</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">事实上是完成了对于文本的写操作。在还有一些情况中，是将</span>
				<span lang="EN-US">
						<font face="Courier New">stdout</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的结果显示到比如</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">这样的</span>
				<span lang="EN-US">
						<font face="Courier New">Tk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">组件上，以上的办法显然是无能为力了。作为</span>
				<span lang="EN-US">
						<font face="Courier New">stdout</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">本身必须是一个</span>
				<span lang="EN-US">
						<font face="Courier New">channel</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，它不能作为一个变量或者其他什么的，所以一个替代的办法是使用</span>
				<span lang="EN-US">
						<font face="Courier New">Memchan</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">模块，以下是在</span>
				<span lang="EN-US">
						<font face="Courier New">tcl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">wiki</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">上的一段代码。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">1.package require Tk<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">2.package require Memchan<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>3.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">4.text .t<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">5..t tag configure stdout -font {Courier 10}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">6..t tag configure stderr -font {Courier 10} -foreground red<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">7.pack .t<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>8.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">9.# install new stdout<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">10.close stdout<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">11.set stdout [fifo]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">12.fileevent $stdout readable ".t insert end \[read $stdout\] stdout; .t see end"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">13.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">14.# install new stderr<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">15.close stderr<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">16.set stderr [fifo]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">17.fileevent $stderr readable ".t insert end \[read $stderr\] stderr; .t see end"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">18.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">19.# test it<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">20.puts "this is stdout"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">21.puts stderr "this is stderr"<span style="mso-tab-count: 1"></span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">通过</span>
				<span lang="EN-US">
						<font face="Courier New">fileevent</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，以上程序提供了一个非常优雅的重定向办法，但是带程序的作者还附加了一句话。事实上，这段代码是无法正确执行的，因为重定义的</span>
				<span lang="EN-US">
						<font face="Courier New">stdout</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">并没有被创建，而且该</span>
				<span lang="EN-US">
						<font face="Courier New">bug</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">似乎至今没有被修复。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">warning: the current distribution has a bug, I have submitted a patch to the author<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">在</span>
				<span lang="EN-US">
						<font face="Courier New">cucumber<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.1.1</st1:chsdate></font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">tclsh</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中需要将</span>
				<span lang="EN-US">
						<font face="Courier New">puts</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的内容如同</span>
				<span lang="EN-US">
						<font face="Courier New">return</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的结果一样写入</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">文本组件中，但考虑到循环打印的情况，又不能仅仅将</span>
				<span lang="EN-US">
						<font face="Courier New">puts</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">当做</span>
				<span lang="EN-US">
						<font face="Courier New">return</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">来对待，从而导致执行代码的中止。我的解决办法依然是使用</span>
				<span lang="EN-US">
						<font face="Courier New">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，在</span>
				<span lang="EN-US">
						<font face="Courier New">puts</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">之前注入代码。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">1.con eval {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>2.<span style="mso-spacerun: yes">   </span>rename puts _puts<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>3.<span style="mso-spacerun: yes">   </span>proc puts {args} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>4.<span style="mso-spacerun: yes">       </span>putsstdout $args<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>5.<span style="mso-spacerun: yes">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">6.}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">7.interp alias con putsstdout {} putsstdout<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5; mso-para-margin-left: .01gd">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">8.proc putsstdout {msg} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">
						<span style="mso-spacerun: yes"> </span>9.<span style="mso-spacerun: yes">   </span>.console insert end "$msg\n"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">10.<span style="mso-spacerun: yes">   </span>.console see end<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: -0.1pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">11.}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 0.1pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">模拟</span>
				<span lang="EN-US">
						<font face="Courier New">tclsh</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的过程是发生在名为</span>
				<span lang="EN-US">
						<font face="Courier New">con</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的子解析器里的，需要使用</span>
				<span lang="EN-US">
						<font face="Courier New">alias</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">将子解析器中的数据交由主解析器中的函数来更新</span>
				<span lang="EN-US">
						<font face="Courier New">.console</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中的显示。以上代码中的第</span>
				<span lang="EN-US">
						<font face="Courier New">4</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">行便是重定向的关键所在，当然我们还可以将数据以传统形式输出到</span>
				<span lang="EN-US">
						<font face="Courier New">stdout</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中，这就看具体情况而定了。事实上，这种办法并不算是真正意义上的重定向，但是得到了相同的效果。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/61573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-09-25 14:50 <a href="http://www.cnitblog.com/gyn/archive/2009/09/25/61573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tk中实现文本局部只读</title><link>http://www.cnitblog.com/gyn/archive/2009/09/25/61571.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 25 Sep 2009 05:36:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/09/25/61571.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/61571.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/09/25/61571.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/61571.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/61571.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">如果用过</span>
				<span lang="EN-US">
						<font face="Courier New">Python</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">idle</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">或者之类的文本型命令行编辑器，你就会发现使用这类工具的可以随意复制黏贴的好处，这比传统的命令行工具方便了很多。但是，传统的优势在于，已执行的命令及得到的返回结果是只读的，不必担心因为误操作破坏历史记录，而这点在</span>
				<span lang="EN-US">
						<font face="Courier New">Tk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">组件很难实现。就是说，</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">天然并不支持在一个文本框对象中实现部分只读，而另一部分可写的状态。</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">state</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">选项只能是整个对象处于只读或者可写的状体。那么像</span>
				<span lang="EN-US">
						<font face="Courier New">idle</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">这样的工具是怎么实现局部只读的呢？特别是</span>
				<span lang="EN-US">
						<font face="Courier New">idle</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">本身即是用</span>
				<span lang="EN-US">
						<font face="Courier New">Tk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">写成的。最初我认为这可能是使用了</span>
				<span lang="EN-US">
						<font face="Courier New">canvas</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">组件里实现类</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">功能，但之后我还是使用了</span>
				<span lang="EN-US">
						<font face="Courier New">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">办法在</span>
				<span lang="EN-US">
						<font face="Courier New">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">insert</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">和</span>
				<span lang="EN-US">
						<font face="Courier New">delete</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">命令前注入代码，从而实现这一功能。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">1.proc init_region_readonly {text} {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">2.<span style="mso-spacerun: yes">    </span>rename $text fake<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">3.<span style="mso-spacerun: yes">    </span>proc $text {args} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">4.<span style="mso-tab-count: 1"></span><span style="mso-spacerun: yes">       </span>switch [lindex $args 0] {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">5. <span style="mso-tab-count: 1">   </span><span style="mso-spacerun: yes">       </span>"insert" {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">6.<span style="mso-tab-count: 2">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>if [fake compare insert &gt;= $::com_region_readonly] { <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">7.<span style="mso-tab-count: 2">    </span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>uplevel 1 fake $args<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">8.<span style="mso-tab-count: 2">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; mso-char-indent-count: .5">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">9.<span style="mso-tab-count: 1"></span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">10.<span style="mso-tab-count: 1"></span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">   </span>"delete" {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">11.<span style="mso-tab-count: 2">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>if [fake compare insert &gt; $::com_region_readonly] { <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">12.<span style="mso-tab-count: 2">    </span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>uplevel 1 fake $args<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">13.<span style="mso-tab-count: 2">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">14.<span style="mso-tab-count: 1"></span><span style="mso-spacerun: yes">   </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">15.<span style="mso-tab-count: 1"></span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">   </span>"default" {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">16.<span style="mso-tab-count: 2">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">       </span>uplevel 1 fake $args<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">17.<span style="mso-tab-count: 1"></span><span style="mso-spacerun: yes">    </span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">18.<span style="mso-tab-count: 1"></span><span style="mso-tab-count: 1">    </span><span style="mso-spacerun: yes">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">19.<span style="mso-spacerun: yes">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Consolas">20.}<o:p></o:p></span>
		</p>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">在第</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">6</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">行和第</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">11</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">行里，我增加了对于输入点的判断，也就是说只有当输入点的</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">index</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">处于以一个名为</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">com_region_readonly</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的全局变量所指定的位置后时，输入才是有效的，否则将丢弃本次操作。这被应用于</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">cucumber<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.1.1</st1:chsdate></span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">中所集成的</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">tclsh</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">命令行工具中，当然这个工具实现的不仅仅模拟</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">tclsh</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">，还有类似于</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">vim</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的文本操作命令，这是基于几个</span>
		<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">alias</span>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 黑体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">给子解析器的命令实现的，以后再作介绍。</span>
<img src ="http://www.cnitblog.com/gyn/aggbug/61571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-09-25 13:36 <a href="http://www.cnitblog.com/gyn/archive/2009/09/25/61571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cucumber2的语法高亮代码分析</title><link>http://www.cnitblog.com/gyn/archive/2009/09/24/61556.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 24 Sep 2009 12:45:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/09/24/61556.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/61556.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/09/24/61556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/61556.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/61556.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso" />
		<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
		<o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chsdate">
		</o:smarttagtype>
		<o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chmetcnv">
		</o:smarttagtype>
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<!--[if !mso]><object
 classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:modern;
	mso-font-pitch:fixed;
	mso-font-signature:-1610611985 1073750091 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
p.MsoCaption, li.MsoCaption, div.MsoCaption
	{mso-style-noshow:yes;
	mso-style-next:正文;
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1034"/>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1"/>
 </o:shapelayout></xml><![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在写代码的时候，不应该仅仅追求完成某件功能，而是需去寻找一个尽量优雅的方法解决。我不单是这么想，而且也的的确确这么做的。在处理</span>
				<span lang="EN-US">cucumber</span>
				<span style="font-family: 黑体;">的语法高亮模块时，我思考了很久。最后选择了</span>
				<span lang="EN-US">rename</span>
				<span style="font-family: 黑体;">办法，即是通过</span>
				<span lang="EN-US">rename</span>
				<span style="font-family: 黑体;">和重载原命令来得到命令参数，实现代码注入。举个例子：</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1.package require Tk<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">2.text .t<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">3.pack .t<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">4.rename .t t<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">5.proc .t {args} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">6.<span style="">    </span># injected code<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">7.<span style="">  </span><span style="">  </span>uplevel #1 t $args<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">8.}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">对于复杂的对象，处于简化使用或者其他的目的，往往会隐藏一些底层的方法，而仅仅提供高级的抽象功能。比如</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">组件的剪切功能，将删除、赋值和标记设定等命令以一定的方式顺序组合在一起，对程序员提供一个指令来完成这一系列的事件。以上的办法为在执行这些底层命令前提供了捕获控制的机会。在高亮的解决方案中，通过这种机制，介入所有的</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">组件指令，筛选出</span>
				<span lang="EN-US">insert</span>
				<span style="font-family: 黑体;">、</span>
				<span lang="EN-US">delete</span>
				<span style="font-family: 黑体;">、</span>
				<span lang="EN-US">mark set</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">see insert</span>
				<span style="font-family: 黑体;">这四个指令，完成当发生包括输入，黏贴、删除，剪切、撤销和重做等事件时的文本高亮渲染。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在这个基本思想的基础上，</span>
				<span lang="EN-US">cucumber<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">1.1.1</st1:chsdate></span>
				<span style="font-family: 黑体;">版本实现了关键词、变量、注解和引号语句的高亮，但如在实现顺序上有错疏忽，虽然可能不会对破坏的渲染结果，但是会极大影响大文本渲染的效率。为什么单指大文本，因为对于文本输入一般包括键盘输入和大段文本的载入如打开文件或者黏贴。与电脑的处理相比无论打字速度多快，其中的间歇都是足够渲染处理打入的单个符号的上下文环境；而大文本的载入首先是一次操作完成的，与下一个操作之间只有一次间隔，第二需要渲染的内容很多，这么一来渲染效率的瓶颈边出现在大文本处理上了。所以，我所说的效率可以理解为特指大文本渲染效率。在第二个版本里我是使用了以下的一系列优化代码。在这里我首先通过一下函数完成捕获</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1.proc _tool_core_fake {cucumber fake} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">2.<span style="">    </span>set ::$fake [regsub
{(.*)\..+$} $cucumber {\1.linumColumn}]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">3.<span style="">   </span><span style=""> </span>rename $cucumber $fake<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">4.<span style="">    </span>eval "proc $cucumber
{args} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">5.<span style="">        </span>after idle
\[_tool_core_sortMap $fake \$args\]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">6.<span style="">        </span>uplevel 1 $fake
\$args<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">7.<span style="">    </span>}"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">8.}<o:p></o:p></span>
		</p>
		<p class="MsoCaption" style="text-align: center;" align="center">
				<span lang="EN-US">_tool_core_fake</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 黑体;">行是设置了一个与当前</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">文本相对应的行号显示组件变量，这里就不再多说了。真正的高亮渲染注入发生在第</span>
				<span lang="EN-US">5</span>
				<span style="font-family: 黑体;">行，通过以下的函数返回需要执行的指令集。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1.proc
_tool_core_sortMap {fake args} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">2.<span style="">    </span>eval "set args $args"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">3.<span style="">    </span>switch -glob -- $args {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">4.<span style="">        </span>insert* {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">5.<span style="">            </span>set from [$fake index [lindex $args
1]]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">6. <span style="">           </span>set to "$from+[string length
[lindex $args 2]]c"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">7.<span style="">            </span>return "<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">8.<span style="">            </span>_tool_core_hiContent $fake $from
$to; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">9.<span style="">            </span>_tool_incrLinum $fake;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">10.<span style="">           
</span>_tool_core_hiLine $fake<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">11.<span style="">            </span>"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">12.<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">13.<span style="">        </span>delete* {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">14.<span style="">            </span>set from [$fake
index [lindex $args 1]]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">15.<span style="">            </span>return "<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">16.<span style="">          </span><span style="">  </span>_tool_core_hiContent $fake $from $from;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">17.<span style="">            </span>_tool_decrLinum
$fake<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">18.<span style="">           
</span>_tool_core_hiLine $fake<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">19.<span style="">            </span>"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">20.<span style="">        </span>}<span style="">        </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">21.<span style="">        </span>{mark set insert*} {
return "_tool_core_hiLine $fake" }<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">22.<span style="">        </span>{see insert} {
return "_tool_core_hiLine $fake" }<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">23.<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">24.}<o:p></o:p></span>
		</p>
		<p class="MsoCaption" style="text-align: center;" align="center">
				<span lang="EN-US">_tool_core_sortMap</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第二行的作用是消除字符串外的大括号，将如“</span>
				<span lang="EN-US">{insert end nihao}</span>
				<span style="font-family: 黑体;">”变化为“</span>
				<span lang="EN-US">insert end nihao</span>
				<span style="font-family: 黑体;">”。之后使用</span>
				<span lang="EN-US">glob</span>
				<span style="font-family: 黑体;">匹配的</span>
				<span lang="EN-US">switch</span>
				<span style="font-family: 黑体;">来筛选命令参数。在</span>
				<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">
						<span lang="EN-US">1.1.1</span>
				</st1:chsdate>
				<span style="font-family: 黑体;">版本的筛选函数中，首先我没有加入用于筛选高亮当前行显示的</span>
				<span lang="EN-US">insert</span>
				<span style="font-family: 黑体;">标记判断，而是在单独的模块中通过绑定事件来完成，这显然是累赘的；第二，最初使用</span>
				<span lang="EN-US">none</span>
				<span style="font-family: 黑体;">函数来处理非匹配的指令，这个自以为保证代码一致性的手法在事后证明是一个画蛇添足的举动，因为即使是一个空函数，也存在执行消耗，而大量累加执行的结果就是拖慢渲染的速度，这在</span>
				<span lang="EN-US">1.1.1</span>
				<span style="font-family: 黑体;">中已经被删除了；另外，在处理</span>
				<span lang="EN-US">insert</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">delete</span>
				<span style="font-family: 黑体;">时，存在值得商榷的渲染级别。在目前代码中可以看见，事实上渲染发生在以上代码的第</span>
				<span lang="EN-US">8</span>
				<span style="font-family: 黑体;">行和第</span>
				<span lang="EN-US">16</span>
				<span style="font-family: 黑体;">行里的</span>
				<span lang="EN-US">_tool_core_hiContent</span>
				<span style="font-family: 黑体;">函数里。顺便提一下，在该函数以下的两个命令，跟行号和当前行指示有关，这里不做详解。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1.proc _tool_core_hiContent {fake from to} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">2.<span style="">    </span>set temp $from<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">3.<span style="">    </span>set temp
[_tool_core_hiWord $fake $temp]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">4.<span style="">    </span>while {[$fake compare
$temp &lt;= $to]} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">5.<span style="">        </span>set temp
[_tool_core_hiWord $fake $temp]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">6.<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">7.<span style="">    </span>_tool_core_hiQuoteContext
$fake<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">8.<span style="">   
</span>_tool_core_hiCommentContext $fake $from $to<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">9.}<o:p></o:p></span>
		</p>
		<p class="MsoCaption" style="text-align: center;" align="center">
				<span lang="EN-US">_tool_core_hiContent</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在</span>
				<span lang="EN-US">_tool_core_hiConetnt</span>
				<span style="font-family: 黑体;">的文本渲染函数中，包含了三个同层次的渲染，分别是处于</span>
				<span lang="EN-US">index</span>
				<span style="font-family: 黑体;">位于</span>
				<span lang="EN-US">from</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">to</span>
				<span style="font-family: 黑体;">之间的单词循环渲染和各行注解渲染，以及一次全文引号渲染。这么安排的道理在于，一般情况系关键词和变量都是以单词的形式出现的，可以统一在</span>
				<span lang="EN-US">_tool_core_hiWord</span>
				<span style="font-family: 黑体;">中处理；注解可能占据一行或者后半行，与其在每次单词渲染时判断是否存在注解起始符，不如在处理完所有的单词之后统一检索当前文本段，前者是单词数量级的运算，而后者是行数量级的运算，显然后者更为高效；引号数量的单双数变化，会造成全文渲染范围的颠倒，但考虑到引号数量与单词相比可能相差两三个数量级，因此这种全文渲染变化是很快速的，尤其是我更引入了延迟渲染的机制，消耗更是可以忽略不计。以下是这三个函数。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1.proc
_tool_core_hiWord {fake id} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">2.<span style="">    </span>if [_tool_ifInWord $fake $id] {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>3.<span style="">       </span>set head [_tool_indexWordHead $fake $id]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>4.<span style="">  </span><span style="">     </span>set end<span style=""> 
</span>[_tool_indexWordEnd $fake $id]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>5.<span style="">       </span>foreach hi {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>6.<span style="">           </span>_tool_core_hiTextContext <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>7.<span style="">           </span>_tool_core_hiVariableContext <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>8.<span style="">       </span>} { $hi $fake $head $end}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>9.<span style="">       </span>return "$end +<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">10.<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">11.<span style="">    </span>return "$id +<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">12.}<o:p></o:p></span>
		</p>
		<p class="MsoCaption" style="text-align: center;" align="center">
				<span lang="EN-US">_tool_core_hiWord</span>
				<span style="font-family: Consolas;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1</span>
				<span style="font-family: 黑体;">．</span>
				<span style="font-family: Consolas;" lang="EN-US">proc
_tool_core_hiCommentContext {fake from to} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>2.<span style="">   </span>set f [_tool_linum $fake $from]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>3.<span style="">   </span>set t [_tool_linum $fake $to]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>4.<span style="">   </span>while {$f &lt;= $t} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>5.<span style="">       </span>$fake tag remove Com "$f.0"
"$f.0 lineend"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>6.<span style="">       </span>if {[$fake search -regexp
$::hi_comment_regexp "$f.0" "$f.0 lineend"] != {}} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>7.<span style="">           </span>$fake tag add Com [$fake search
-regexp $::hi_comment_symbol "$f.0" "$f.0 lineend"]
"$f.0 lineend"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>8.<span style="">       </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">
						<span style=""> </span>9.<span style="">       </span>incr f<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">10.<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">11.}<o:p></o:p></span>
		</p>
		<p class="MsoCaption" style="text-align: center;" align="center">
				<span lang="EN-US">_tool_core_hiCommentContext</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">1.proc
_tool_core_hiQuoteContext {fake} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">2. <span style="">   </span>after cancel [list _hiQuoteContext $fake]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">3. <span style=""> </span><span style="">  </span>after
1000 [list _hiQuoteContext $fake]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">4.}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">5.proc
_hiQuoteContext {fake} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">6.<span style="">    </span>if {[$fake get 1.0] == "\""}
{ set rid [list 1.0] } else { set rid {} }<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">7.<span style="">    </span>set qid [$fake search -nolinestop -overlap
-all -regexp {[^\\]\"} 1.0 end]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">8.<span style="">    </span>foreach id $qid { lappend rid [$fake index
[$fake index "$id + <st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>"]]
}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 5.25pt; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">9.<span style="">    </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">10.<span style="">    </span>if ![set e [llength
$rid]] {return}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">11.<span style="">    </span>set now [lindex $rid 0]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">12.<span style="">    </span>$fake tag remove Quo 1.0
$now<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">13</span>
				<span style="font-family: 黑体;">．</span>
				<span style="font-family: Consolas;" lang="EN-US">
						<span style="">   </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">14.<span style="">    </span>set i 1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">15.<span style="">    </span>while {$i &lt; $e} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">16.<span style="">        </span>set old $now<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">17.<span style="">        </span>set now [lindex $rid
$i]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">18.<span style="">        </span>if [expr $i % 2] {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">19.<span style="">            </span>$fake tag add
Quo $old "$now +<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>"<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">20.<span style="">        </span>} else {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">21.<span style="">            </span>$fake tag remove
Quo "$old +<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>" $now<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">22.<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">23.<span style="">        </span>incr i<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">24.<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">25.<span style="">    </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">26.<span style="">    </span>if [expr $e % 2] {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">27.<span style="">        </span>$fake tag add Quo
"$now +<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>" end<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">28.<span style="">    </span>} else {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">29.<span style="">        </span>$fake tag remove Quo
"$now +<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>" end<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">30.<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
				<span style="font-family: Consolas;" lang="EN-US">31.}<o:p></o:p></span>
		</p>
		<p class="MsoCaption" style="text-align: center;" align="center">
				<span lang="EN-US">_tool_core_hiQuoteContext</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/61556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-09-24 20:45 <a href="http://www.cnitblog.com/gyn/archive/2009/09/24/61556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cucumber2的工程</title><link>http://www.cnitblog.com/gyn/archive/2009/09/21/61510.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 21 Sep 2009 09:02:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/09/21/61510.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/61510.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/09/21/61510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/61510.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/61510.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<font face="黑体">最近一直在做<span lang="EN-US">cucuber</span>的第二个版本。为什么要做第二个呢？这是因为，在对<span lang="EN-US">cucuber</span>做了大量修改之后，目前稳定的版本是<span lang="EN-US">1.1.1</span>版，基本上应付日程的代码编写已经没有什么大问题了，支持包括语法高亮、自动补全、自动缩进和正则查找等，但是还是存在一些问题。比如说，绝大多数的函数直接使用了<span lang="EN-US">Tk</span>的组件路径，于是乎除非重写所有函数，不然无法支持多文档显示。另外，应该更清晰地割离不同语言的语法高亮，包括关键词，注解，变量等。还有一个最重要的待改进环节就是提升高亮的渲染速度。在早些时候写目前高亮引擎的时候，我采用了高亮的过程与快捷键绑定的方式，导致了代码非常臃肿且结构混杂。基本上就是一个打补丁的过程，哪个事件的高亮不对就修改哪个，虽然目前看来确实是对高亮支持地很好，但是代码已经面目全非，另外注解和字符串渲染的时机也有些问题，导致了很多重复的操作，降低了整体速度。现在在赛扬<span lang="EN-US">D3.33G</span>、<span lang="EN-US">512</span>兆内存的环境下<span lang="EN-US">,</span>打开一个<span lang="EN-US">20k</span>左右的文件，渲染速度约为<span lang="EN-US">4</span>秒，即使对于<span lang="EN-US">TclTk</span>这样的脚本，这个时长也是很难让人满意的。</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<font face="黑体">所以这次工程的目标就此确定，重写所有函数为可复用，提高渲染速度，重新编写工程架构为可扩展多文档显示，最后添加一个整理代码的工具。目前的渲染部分代码工作基本完成，速度提高了<span lang="EN-US">4-5</span>倍，对于小文件基本上做到载入即可渲染完成，<span lang="EN-US">80k</span>左右的代码也只需<span lang="EN-US">4</span>秒。</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71">
				<font face="黑体">
						<a href="/Files/gyn/cucumber-release-1.1.1-source.rar">
								<span lang="EN-US">Cucumber1.1.1</span>代码下载</a>
				</font>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/61510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-09-21 17:02 <a href="http://www.cnitblog.com/gyn/archive/2009/09/21/61510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于缩进与高亮</title><link>http://www.cnitblog.com/gyn/archive/2009/05/30/58907.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 30 May 2009 15:13:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/05/30/58907.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/58907.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/05/30/58907.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/58907.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/58907.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">其实这是两个完全不一样的东西，应该分开来讲，这里和在一起是因为只是打算做一个介绍，谈点个人的看法和一些关键点，并不需要摊开来讲，因此如若单独切开来就显得太少了，索性和在一起吧。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">缩进基本上就是说在某一块或者上下文环境中的程序代码前添加若干空白，以使得程序结构清晰。就</span>
				<span lang="EN-US">
						<font face="Arial">TclTk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">来说，可能需要的一般有三种情况：在花括号中、在方括号中和反斜杠后。对于花括号的判断，我考察了一些编辑器的做法，最偷懒的可能就是查找前一行的缩进位置了，这几乎费不了什么资源和时间，但害处也是显而易见的，倘若前一行缩进发生错误，则之后的都会跟着出错。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">一种正确的做法是查询行所在的上下文环境的起始行的缩进，比如</span>
				<span lang="EN-US">
						<font face="Arial">if</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">或者</span>
				<span lang="EN-US">
						<font face="Arial">while</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">所处行的缩进。期间我试验了多种方法，最后还是选择了向后的正则查询，这是基于对</span>
				<span lang="EN-US">
						<font face="Arial">TclTk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">正则匹配速度的信任所做出的决定。一开始的时候，考虑到大文本的处理性能，我打算为每一行维护信息队列，包括了正反花括号的数量与位置，这样当需要查找当前行所在上下文环境时，只需要对比该位置之前的正反括号数量即可。打个比方：</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<font face="Arial">{{} {}</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-tab-count: 1">       </span>{}</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 4.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">你好</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 4.0">
				<span lang="EN-US">
						<font face="Arial">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<font face="Arial">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">其中各行正反花括号的数量信息如下：</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">1:<span style="mso-spacerun: yes">  </span>’{‘ =&gt; 3, ‘}’ =&gt; 2</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">2:<span style="mso-spacerun: yes">  </span>‘{’ =&gt; 1, ‘}’ =&gt; 1</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">3:<span style="mso-spacerun: yes">  </span>‘{’ =&gt; 0, ‘}’ =&gt; 0</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">4:<span style="mso-spacerun: yes">  </span>‘{’ =&gt; 0, ‘}’ =&gt; 1</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">5:<span style="mso-spacerun: yes">  </span>‘{’ =&gt; 0, ‘}’ =&gt; 0</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">以上的这种情况中，我们是如何得到你好的缩进位置的呢？首先，“你好“处在第三行，它的上下文环境应考虑第</span>
				<span lang="EN-US">
						<font face="Arial">3</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">行之前的信息，这里是第</span>
				<span lang="EN-US">
						<font face="Arial">1</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">、</span>
				<span lang="EN-US">
						<font face="Arial">2</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">行；令</span>
				<span lang="EN-US">
						<font face="Arial">’{’</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">值为</span>
				<span lang="EN-US">
						<font face="Arial">1</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，</span>
				<span lang="EN-US">
						<font face="Arial">’}’</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">值为</span>
				<span lang="EN-US">
						<font face="Arial">-1</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，将第二行相加可得值为</span>
				<span lang="EN-US">
						<font face="Arial">0</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，则继续向上查询；将第一行信息相加得到</span>
				<span lang="EN-US">
						<font face="Arial">1</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">为正值，即说明第三行所在上下文的起始行即为第一行。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这种方法在即使是巨大的上下文环境时也可以将性能消耗控制在线性范围内，但是维护这么一个信息组也不是一件容易的事情。对于行插入或者删除的情况，都需要对该信息组进行操作，可能需要在</span>
				<span lang="EN-US">
						<font face="Arial">list</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中移动上万个单元。幸好</span>
				<span lang="EN-US">
						<font face="Arial">lreplace</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的性能及时在百万级的数据下，也表现得不错，应该是够用了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">至于为什么用到之后选择反向正则匹配，是因为我在</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中拷贝了《</span>
				<span lang="EN-US">
						<font face="Arial">wxPython in action</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">》的某一章的全部内容并进行了匹配试验，发现速度竟然比使用信息组的性能还要好，而一般的单个程序文件我想不会有这么多字吧。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">至于方括号也大致如此，事实上我是用了一个统一的函数来进行处理的。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">proc myLeft {id_1 id_2 l r} {</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>set id_1 [.f.content search -backward -nolinestop -regexp "\\$l" $id_1 1.0]</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>set id_2 [.f.content search -backward -nolinestop -regexp "\\$r" $id_2 1.0]</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>if {$id_1 eq {}}<span style="mso-spacerun: yes">  </span>{return {}}</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>if {$id_2 eq {}}<span style="mso-spacerun: yes">  </span>{return $id_1}</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>if {[.f.content compare $id_1 &lt; $id_2]} {return [myLeft $id_1 $id_2 $l $r]}</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>return $id_1</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">以上的函数用来得到第一个正向括号，是</span>
				<span lang="EN-US">
						<font face="Arial">"{"</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">还是“</span>
				<span lang="EN-US">
						<font face="Arial">[</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”则可以通过复制</span>
				<span lang="EN-US">
						<font face="Arial">l</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">和</span>
				<span lang="EN-US">
						<font face="Arial">r</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">参数来决定。基本上这是一个递归，每次比较得到的相向括号的位置前后。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">最后的反斜杠的处理，这是最简单的，只需要查询上一行的位置即可，然后缩进</span>
				<span lang="EN-US">
						<font face="Arial">4</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">个空格。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这个差不多花费了我一周的时间来解决，最后还是因为一件不相关的事情而得到了启发。一般地，我们会考虑将作色绑定在可能使文本内容发生改变的事件上，但是这并不是一件简单的事情，应该说存在着若干个截然不同的情况。比如说，删除动作之后，我们应该考虑当前插入点的前后文本的变化；而在拷贝事件时，需要考虑被插入文本的前后端以及本身的内容，但如果之前有范围选择存在，则还需要首先考虑选择区域应被删除。总之这是一件很复杂的事情，很难保证代码的清晰易懂，也很有可能随之带来</span>
				<span lang="EN-US">
						<font face="Arial">bug</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，因此这个思路被暂时搁置了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在确定</span>
				<span lang="EN-US">
						<font face="Arial">&lt;modified&gt;</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">事件是发生在文本发生改变之后，我试图寻找一个简洁的办法来得到事件前后的文本差异，但是似乎只能寄希望于极耗时间的全文比对，这种着色引擎只适用于大文本的载入情况，而对于实时渲染显然非常低效。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">考虑再三，我还是选择了绑定各个事件的办法，但编写调试的过程相当痛苦，充满了复杂的逻辑和奇怪的问题。这个时间里，群里有人大约是在讨论关于</span>
				<span lang="EN-US">
						<font face="Arial">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的必要性，我记忆里隐约记得是有这么一个看似毫无价值的命令的存在。随手</span>
				<span lang="EN-US">
						<font face="Arial">google</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">了一下权作放松，可恰恰是这次搜索使得高亮的进展柳暗花明。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">在</span>
				<span lang="EN-US">
						<font face="Arial">tcltk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的</span>
				<span lang="EN-US">
						<font face="Arial">wiki</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">上，有一篇关于在</span>
				<span lang="EN-US">
						<font face="Arial">text</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">中通过</span>
				<span lang="EN-US">
						<font face="Arial">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的办法得到实际操作指令的的例子。具体的讲，比如一个</span>
				<span lang="EN-US">
						<font face="Arial">copy</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，可能会被分解为选择，删除和插入等几个步骤，通过</span>
				<span lang="EN-US">
						<font face="Arial">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">我们可以在具体的指令操作发生之前捕捉到它。对于高亮而言，事实上需要关心的只是文本的变化，也就是说我只要能够捕捉到插入和删除这两个基本事件就可以了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这个技巧很诡异：</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">text .t</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">pack .t</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">rename .t fake</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">proc .t {args} {</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">
								<span style="mso-spacerun: yes">    </span>puts "catch: $args"</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">uplevel #1 fake $args</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.2pt; mso-char-indent-count: 2.02">
				<span lang="EN-US">
						<font face="Arial">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">“</span>
				<span lang="EN-US">
						<font face="Arial">rename</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”应该是会注销掉“</span>
				<span lang="EN-US">
						<font face="Arial">.t</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”的命令，但由于</span>
				<span lang="EN-US">
						<font face="Arial">tk</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">本身的命名规则，“</span>
				<span lang="EN-US">
						<font face="Arial">.t</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”依然会被使用到，因此我们必须将其重新定义为一个接收参数的过程，在该过程中使用“</span>
				<span lang="EN-US">
						<font face="Arial">fake</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”来真正执行指令，显然在此之前我们已经捕获了它。需要注意的是，别在真正执行指令之后插入别的代码，因为该过程在最后会对全局带来一些必要的副作用，不能将其覆盖。因此，诸如着色的操作代码必须写在真正指令之前。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这算是一个矛盾的事情，着色代码放在了引发着色事件的前面，这岂不是在当前操作未来的内容。幸好还有“</span>
				<span lang="EN-US">
						<font face="Arial">after idle</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”，用来缓冲代码的命令。纵观整个程序，充满了“</span>
				<span lang="EN-US">
						<font face="Arial">after idle</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">”，实在是非同小可的东西。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/58907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-05-30 23:13 <a href="http://www.cnitblog.com/gyn/archive/2009/05/30/58907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈Tcl的代码热替换</title><link>http://www.cnitblog.com/gyn/archive/2009/05/17/57276.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sun, 17 May 2009 09:08:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/05/17/57276.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/57276.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/05/17/57276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/57276.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/57276.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">热替换的好处就不提了，至少是有用处的。如果没有</span>
				<span lang="EN-US">Erlang</span>
				<span style="font-family: 黑体;">，我想迟早也会去关注这个话题。尤其是在</span>
				<span lang="EN-US">Tk</span>
				<span style="font-family: 黑体;">中绑定事件处理函数时或者在调试的时候，根据不同的需要，可以动态的改变代码功能，这显然非常方便。但是如果实现的过程本身可能破坏原来代码的结构，我想这就有点得不偿失了。最起码的，应该有一套方便并且可遵循的规则。下面就两种办法进行分析。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">先来设定一个最基本的实验环境：一个用来显示结果的文本框和一个用来激发事件的按钮，足矣。需要达到的目的是，在运行过程中，动态改变按钮的绑定处理函数。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第一种做法</span>
				<span lang="EN-US"> -- </span>
				<span style="font-family: 黑体;">嵌入</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">的代码集成，包括</span>
				<span lang="EN-US">package</span>
				<span style="font-family: 黑体;">等，多是建立在</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">load</span>
				<span style="font-family: 黑体;">的基础上的，说白了</span>
				<span lang="EN-US">package require</span>
				<span style="font-family: 黑体;">不过也是在</span>
				<span lang="EN-US">pkgIndex.tcl</span>
				<span style="font-family: 黑体;">中找到相应的文件并</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">之。所以第一种思路是在按钮的绑定函数中</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">文件，主要的代码片段如下：</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">text .t</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">button .bt -text test -command {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">    </span>source
b.tcl</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">pack .t .bt</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">我不得不将</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">放在函数中的原因在于，必须在每次运行时检测文件，以确保运行了最新修改过的代码。其中，</span>
				<span lang="EN-US">b.tcl</span>
				<span style="font-family: 黑体;">的代码为</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">.t insetr end “1\n”</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">用来在文本框中新插入一行，内容为</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 黑体;">。如果将</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 黑体;">改为</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 黑体;">，程序将自动变换为插入内容为</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 黑体;">的一行。但是这里有两个问题存在，首先这种检测很多时候是多余的，我们并不需要修改代码；第二，</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">本身是对文件的读入操作，这不可避免地引入了</span>
				<span lang="EN-US">IO</span>
				<span style="font-family: 黑体;">，也就是说影像了性能。这种热替换方式，不大适合与巨大的事件处理函数，或者可能遭遇频繁调用的情况。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第二种做法</span>
				<span lang="EN-US">–- socket</span>
				<span style="font-family: 黑体;">指令</span>
				<span lang="EN-US">:</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在修改完</span>
				<span lang="EN-US">b.tcl</span>
				<span style="font-family: 黑体;">之后，需要有人告诉运行程序一声，“喂，你的按钮该换代码了！”，接着主程序兴冲冲地去找按钮处理函数的源代码。这里讲的其实是一个进程间通信的问题，于是选择了</span>
				<span lang="EN-US">socket</span>
				<span style="font-family: 黑体;">。我把这个过程写了两个文件，一个是名为</span>
				<span lang="EN-US">hot.tm</span>
				<span style="font-family: 黑体;">的包，提供了两个主要函数：</span>
				<span lang="EN-US">init</span>
				<span style="font-family: 黑体;">，用来指定可以被替换的函数及其相对应的文件；</span>
				<span lang="EN-US">update</span>
				<span style="font-family: 黑体;">，用来具体实施热替换。其实替换的过程也是一个</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">，不同之处在于</span>
				<span lang="EN-US">source</span>
				<span style="font-family: 黑体;">的内容是一个函数，而非第一种情况里函数中的一段代码，这样新的函数将覆盖之前的版本。这是</span>
				<span lang="EN-US">a.tcl</span>
				<span style="font-family: 黑体;">的代码需要有所修改：</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">lappend auto_path [file dirname [info
script]]</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">package require hot</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">hot::init b b.tcl</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">text .t</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">button .bt -text test –command b</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">pack .t .bt</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在</span>
				<span lang="EN-US">hot</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">namespace</span>
				<span style="font-family: 黑体;">中，维护着一个函数名到源文件的</span>
				<span lang="EN-US">array</span>
				<span style="font-family: 黑体;">，在初始化时需要指明哪些函数是可以被热替换的。我可不想随便哪个函数都可以被替换，这就乱套了。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">另一个文件时</span>
				<span lang="EN-US">hotc.tcl</span>
				<span style="font-family: 黑体;">，用来在修改完代码之后通知运行程序来进行热替换，当然这个过程只能依靠人工来完成了。比如在这里需要替换</span>
				<span lang="EN-US">b</span>
				<span style="font-family: 黑体;">函数，那么就执行一下</span>
				<span lang="EN-US">hotc.tcl b</span>
				<span style="font-family: 黑体;">。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">最后我想，这应该是一个比较可以被接受的方法了。其实即使是标榜着热替换的</span>
				<span lang="EN-US">erlang</span>
				<span style="font-family: 黑体;">，也需要在修改代码之后</span>
				<span lang="EN-US">compile</span>
				<span style="font-family: 黑体;">的，这就好比执行了</span>
				<span lang="EN-US">hotc.tcl</span>
				<span style="font-family: 黑体;">，只不过</span>
				<span lang="EN-US">erlang</span>
				<span style="font-family: 黑体;">的做法是语言级的。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">
						<a href="/Files/gyn/hot.rar">代码下载</a>
						<br />
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/57276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-05-17 17:08 <a href="http://www.cnitblog.com/gyn/archive/2009/05/17/57276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>双text滚动——scrollbar的那点事儿</title><link>http://www.cnitblog.com/gyn/archive/2009/05/05/56944.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Tue, 05 May 2009 14:43:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/05/05/56944.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/56944.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/05/05/56944.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/56944.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/56944.html</trackback:ping><description><![CDATA[
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctadao%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C05%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
h3
	{mso-style-next:正文;
	margin-top:13.0pt;
	margin-right:0cm;
	margin-bottom:13.0pt;
	margin-left:0cm;
	text-align:justify;
	text-justify:inter-ideograph;
	line-height:173%;
	mso-pagination:lines-together;
	page-break-after:avoid;
	mso-outline-level:3;
	font-size:16.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在前面一贴关于</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">的杂论中，我使用了双</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">的拼接来实现</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">，关于其优点主要在于只读属性的设置。但在涉及到纵向的</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">时，我们不得不面对一个问题：如何使</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">和文本内容跟随</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">一齐滚动？</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">一般而言，</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">是绑定与一个可</span>
				<span lang="EN-US">scroll</span>
				<span style="font-family: 黑体;">组件的，比如</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">或者</span>
				<span lang="EN-US">list</span>
				<span style="font-family: 黑体;">。显然，没有相应的</span>
				<span lang="EN-US">scrollcommand</span>
				<span style="font-family: 黑体;">命令的组件，例如容器组件就不属于可</span>
				<span lang="EN-US">scroll</span>
				<span style="font-family: 黑体;">组件，也就无法绑定到</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的。因此，我们不能使用</span>
				<span lang="EN-US">frame</span>
				<span style="font-family: 黑体;">作为一个统一的外部包裹来绑定</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">。</span>
				<span lang="EN-US">canvas</span>
				<span style="font-family: 黑体;">是很好的替换选择，但有鉴于</span>
				<span lang="EN-US">canvas</span>
				<span style="font-family: 黑体;">过于强大，除非需要实现特定效果，我个人不倾向于使用这种大型组件。另外，要提一下的经验是，对于单组件绑定</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">，最好是使用</span>
				<span lang="EN-US">widget::scrolledwindow</span>
				<span style="font-family: 黑体;">，它带</span>
				<span lang="EN-US">optional</span>
				<span style="font-family: 黑体;">特征，只有在必要的时候才会显示</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">本身。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">办法终归是有的，但是需要首先知道</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">到底是怎么工作的。从实际出发，我们会在两种大的情况下触发到滚动事件，第一个是直接操作</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">；第二个是操作文本内容，包括插入和光标上下移动。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.85pt;">
				<span style="font-family: 黑体;">对于第一种情况，比如我们点击</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">中的下标时，首先发生的并非是改变滑条的位置，相反的文本框的内容整体下移了一行，此时出发了文本框的滚屏事件，而在该事件相关的处理程序再设置</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的滑条到相应的位置。也就是说，对于</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的操作，最终还是要落实到</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">上来完成的。而相对与第二种情况，</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">其实只是指定了文本框的滚屏形式，例如点击下标是下滚一行，点击滑条上方的空白条是上滚一页，拖动则是滚屏一定数值。在第二种情况中，滚屏完全由</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">自身控制，比如绑定一个滚屏到文本开头的快捷键，则</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">也将相应地滑动到最上端。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.85pt;">
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">command</span>
				<span style="font-family: 黑体;">以及</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">x(y)scrollcommand</span>
				<span style="font-family: 黑体;">命令是很需要注意的，它们其实是被其他过程用来产生命令的参数，并不直接执行。在</span>
				<span lang="EN-US">ttk::scrollbar</span>
				<span style="font-family: 黑体;">中有如下一段定义：</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">proc ttk::scrollbar::Scroll {w n units} {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">   
</span>set cmd [$w cget -command]</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">   
</span>if {$cmd ne ""} {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">
						</span>uplevel
#0 $cmd scroll $n $units</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">    </span>}</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.85pt;">
				<span style="font-family: 黑体;">显然“</span>
				<span lang="EN-US">$w
cget -command</span>
				<span style="font-family: 黑体;">”得到的比如“</span>
				<span lang="EN-US">.txt yview</span>
				<span style="font-family: 黑体;">”与之后参数结合，最后真正执行的是“</span>
				<span lang="EN-US">.txt yview scroll 1 unit</span>
				<span style="font-family: 黑体;">”这样的命令。这么做其实是限制了对</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的操作，由于实际的使用是一个很死板的命令，除非修改</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的定义或者使用</span>
				<span lang="EN-US">snit</span>
				<span style="font-family: 黑体;">重新构造一个，不然除了“</span>
				<span lang="EN-US">$w yview</span>
				<span style="font-family: 黑体;">”和“</span>
				<span lang="EN-US">$w xview</span>
				<span style="font-family: 黑体;">”，我们不可能得到任何有益的副作用。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.85pt;">
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">command</span>
				<span style="font-family: 黑体;">相对好一点，它为绑定的函数添加了两个参数，分别表示可视区域的最上端和最下端处于全文的相对位置。事实上这么做是提供了编写规范，即为了设置滑块的位置，在绑定函数中一定要有</span>
				<span lang="EN-US">scrollbar</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">set</span>
				<span style="font-family: 黑体;">命令。除此之外总还是有一些自由的，双</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">滚动的</span>
				<span lang="EN-US">hack</span>
				<span style="font-family: 黑体;">就在此处进入。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.85pt;">
				<span style="font-family: 黑体;">当文本组件发生滚屏事件时，一方面需要设置滑条位置，另外再引发</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">产生滚屏，如此便打到了双滚屏的效果，这里改变的无非是一个先来后到的顺序问题，要实现多组件滚动的话也是一个道理。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.85pt;">
				<span style="font-family: 黑体;">要设置滑条位置需要的是自动传入的两个参数，而</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">滚屏用到的则是其中的第一个参数。命令如下：</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">.scrollbar set $first $last</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.85pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">.linum yview moveto $first</span>
		</p>
		<span style="font-size: 10.5pt; font-family: 黑体;">是的，这是最后的命令，只是多了一行“</span>
		<span style="font-size: 10.5pt; font-family: Arial;" lang="EN-US">moveto</span>
		<span style="font-size: 10.5pt; font-family: 黑体;">”，这点事儿我却写了半天，见笑了。</span>
<img src ="http://www.cnitblog.com/gyn/aggbug/56944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-05-05 22:43 <a href="http://www.cnitblog.com/gyn/archive/2009/05/05/56944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tk实现带line number的text</title><link>http://www.cnitblog.com/gyn/archive/2009/05/02/56873.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 01 May 2009 23:45:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/05/02/56873.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/56873.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/05/02/56873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/56873.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/56873.html</trackback:ping><description><![CDATA[
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctadao%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Ctadao%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso" />
		<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
		<o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chmetcnv">
		</o:smarttagtype>
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<!--[if !mso]><object
 classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:楷体_GB2312;
	panose-1:2 1 6 9 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:modern;
	mso-font-pitch:fixed;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@楷体_GB2312";
	panose-1:2 1 6 9 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:modern;
	mso-font-pitch:fixed;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
h3
	{mso-style-next:正文;
	margin-top:13.0pt;
	margin-right:0cm;
	margin-bottom:13.0pt;
	margin-left:0cm;
	text-align:justify;
	text-justify:inter-ideograph;
	line-height:173%;
	mso-pagination:lines-together;
	page-break-after:avoid;
	mso-outline-level:3;
	font-size:16.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">关于</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">这个组件，说起来简单，其实却是又相当复杂，今天我从一个带</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">出发，管中窥豹，以期抛砖引玉。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">使用</span>
				<span lang="EN-US">emacs</span>
				<span style="font-family: 黑体;">的大多会安装行号显示，便于</span>
				<span lang="EN-US">debug</span>
				<span style="font-family: 黑体;">时的定位，比较常用的便是</span>
				<span lang="EN-US">linum.el</span>
				<span style="font-family: 黑体;">。这里的</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">是</span>
				<span lang="EN-US">line number</span>
				<span style="font-family: 黑体;">的意思。现在我们来实现这种效果，以达到当发生输入、粘贴、删除或者退格事件时，左侧行号自动匹配实际文本行数。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="" lang="EN-US">
						<!--[if gte vml 1]><v:shapetype
 id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
 path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:66.75pt;
 height:64.5pt'>
 <v:imagedata src="file:///C:\DOCUME~1\tadao\LOCALS~1\Temp\msohtml1\01\clip_image001.png"
  o:title=""/>
</v:shape><![endif]-->
						<!--[if !vml]-->
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/linum.PNG" alt="linum.PNG" width="89" border="0" height="86" />
						<br />
						<!--[endif]-->
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">首先需要设置行号的显示方式，这是最基础但却是很重要的一个决定。倘若是在单</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">组件中使用</span>
				<span lang="EN-US">tag</span>
				<span style="font-family: 黑体;">实现</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">，那么有两个问题。第一，无法保证</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">的只读状态；第二，复制时会包含行号，大多数情况下这是多余的。这里我选择了两个组件的粘合，事实上是将两个</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">拼在一起，当然也可以使用</span>
				<span lang="EN-US">entry</span>
				<span style="font-family: 黑体;">或者</span>
				<span lang="EN-US">canvas</span>
				<span style="font-family: 黑体;">，只是前者比较方便，容易保持代码的一致性。在此之前，最好设置一个用于记录最后行号值的变量</span>
				<span lang="EN-US">linum</span>
				<span style="font-family: 黑体;">，初始化为</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 黑体;">。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">package require Tk</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">set linum 1</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">frame .f</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">text .f.linum -width 1 -bg gray -bd 0</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">.f.linum insert end "1"</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">.f.linum configure -state disable </span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">text .f.content -bd 0</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">pack .f.linum -side left -expand 1 -fill y</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">pack .f.content -side left -expand 1 -fill
both</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">pack .f</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">我们得到了如下图片显示的记事本，当然目前它还不能正常添加或删除行号，需要定义并绑定一系列过程。另外，随着行号的增加，应该相应设置左侧灰带的宽度来正常显示行号。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75"
 style='width:77.25pt;height:49.5pt'>
 <v:imagedata src="file:///C:\DOCUME~1\tadao\LOCALS~1\Temp\msohtml1\01\clip_image003.png"
  o:title=""/>
</v:shape><![endif]-->
						<!--[if !vml]-->
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/tk_linum_1.png" alt="tk_linum_1.png" width="103" border="0" height="66" />
						<br />
						<!--[endif]-->
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">无论是因为何种文本编辑操作使得文本行数发生改变，在改变行号之前，我们都必须得到文本行的数量。这里有几种办法，比如</span>
				<span lang="EN-US">count</span>
				<span style="font-family: 黑体;">或者</span>
				<span lang="EN-US">index</span>
				<span style="font-family: 黑体;">，我们使用后者，顺便对</span>
				<span lang="EN-US">index</span>
				<span style="font-family: 黑体;">进行介绍。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">proc linum {w} {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">   
</span>return [expr int([$w index "end - <st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>"])]</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span lang="EN-US">
						<span style="">
						</span>
				</span>
				<span style="font-family: 黑体;">此处的</span>
				<span lang="EN-US">index</span>
				<span style="font-family: 黑体;">是“</span>
				<span lang="EN-US">end
– <st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv></span>
				<span style="font-family: 黑体;">”，表示文本的最后的前一个位置。事实上，这就是文本的实际最后位置，只不过因为</span>
				<span lang="EN-US">end</span>
				<span style="font-family: 黑体;">被定义为“</span>
				<span lang="EN-US">the character just after the last newline</span>
				<span style="font-family: 黑体;">”，一个不存在字符，所以必须在</span>
				<span lang="EN-US">end</span>
				<span style="font-family: 黑体;">的位置处再向前减去一个</span>
				<span lang="EN-US">character</span>
				<span style="font-family: 黑体;">，可以简写为“</span>
				<span lang="EN-US">- <st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv></span>
				<span style="font-family: 黑体;">”。同样的，如果要得到待插入行的最后一个字符的位置，应使用“</span>
				<span lang="EN-US">insert lineend</span>
				<span style="font-family: 黑体;">”；向前一个字符就是“</span>
				<span lang="EN-US">insert lineend – <st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv></span>
				<span style="font-family: 黑体;">”，如此类推。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">现在要切实做一些绑定了，一般地我们使用回车和退格来进行换行，其中回车是必然转换为一个换行符的，而退格则在遇到换行符时才会通过一系列的操作实现换行。还是应该提一下，通过</span>
				<span lang="EN-US">ascii</span>
				<span style="font-family: 黑体;">码我们可以看到回车并不是换行，换行的码值是</span>
				<span lang="EN-US">10</span>
				<span style="font-family: 黑体;">，而回车是</span>
				<span lang="EN-US">13</span>
				<span style="font-family: 黑体;">，所以需要转换；而退格换行的行为，在实际中行数并不会立即发生变化，在退格时先增加一个退格符，再将该退格符连同上一个换行符一起删除。需要注意的是，文本永远在其最后保留一个换行符。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">明白了这个细节，接下来的事情就好办了。由于我们还需要响应长按的情况，所以必须绑定是</span>
				<span lang="EN-US">KeyPress</span>
				<span style="font-family: 黑体;">过程，但无论是</span>
				<span lang="EN-US">KeyPress</span>
				<span style="font-family: 黑体;">还是</span>
				<span lang="EN-US">KeyRelease</span>
				<span style="font-family: 黑体;">，当遇到换行时</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">都会在之后做做一些以上描述的小手脚，所以真正的绑定处理过程必须发生在这些小手脚完成之后。这是一个矛盾，但并非不可调和。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">after idle incrLinum</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在绑定中，使用“</span>
				<span lang="EN-US">after idle</span>
				<span style="font-family: 黑体;">”的小技巧便可以轻松应对。它让</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">先干完想干的，一旦空下来就立即执行真正的处理过程。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">除了回车和退格，还应该增加对一些常用的比如粘贴或删除操作的支持。对于粘贴，通常的快捷键是“</span>
				<span lang="EN-US">ctrl v</span>
				<span style="font-family: 黑体;">”，对应的事件是“</span>
				<span lang="EN-US">&lt;Control-Key-v&gt;</span>
				<span style="font-family: 黑体;">”，当然也可以是如</span>
				<span lang="EN-US">emacs</span>
				<span style="font-family: 黑体;">中的“</span>
				<span lang="EN-US">ctrl y</span>
				<span style="font-family: 黑体;">”。使用以下的形式可以方便地增加对事件的支持。</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">foreach keysum {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">   
</span>&lt;KeyPress-Return&gt;</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">   
</span>&lt;Control-Key-v&gt;</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">} {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">   
</span>bind .f.content $keysum {</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">
						</span>after
idle incrLinum</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">
						<span style="">    </span>}</span>
		</p>
		<p class="MsoNormal" style="background: silver none repeat scroll 0% 0%; text-indent: 17.95pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
		</p>
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctadao%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">
						<a href="/Files/gyn/linumtext.rar">点击下载代码</a>。</span>
				<span style="font-family: 黑体;">另外，添加比如语法着色也并非难事，只是肯定会相当复杂，以后再说了。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/56873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-05-02 07:45 <a href="http://www.cnitblog.com/gyn/archive/2009/05/02/56873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Button命令与作用域</title><link>http://www.cnitblog.com/gyn/archive/2009/04/24/56685.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 24 Apr 2009 00:58:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/04/24/56685.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/56685.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/04/24/56685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/56685.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/56685.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctadao%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C04%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:宋体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimSun;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@宋体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:宋体;
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal">
				<span style="font-family: 黑体;">关于</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">最诡异的事情大概就是与变量作用域相关的命令了。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">事件是作用域全局域下而非任何过程函数中。如果</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">是在一个过程函数中创建的，那么该</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">的命令之后将在不同的作用域中执行。即使是使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">binding</span>
				<span style="font-family: 黑体;">的事件处理，也将在全局域中执行。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">我认为这是一个关于定义与执行的时间问题。举例来说，当定义一个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">时可以使用到一组变量，但在使用该</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">的时候却用的是另一组变量。当遇到混合上下文环境的情况，这就变得很混乱了。以下例子中的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">命令使用到了两个变量：</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">val</span>
				<span style="font-family: 黑体;">。其中</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">是在执行中需要使用的全局变量，，本地变量</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">val</span>
				<span style="font-family: 黑体;">在定义</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">时使用。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">proc Trouble
{args} {<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span>set b 0<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span># Display the value of x, a global variable<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span>label .label -textvariable x<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span>set f [frame .buttons -borderwidth 10]<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span># Create buttons that multiply x by their
value<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span>foreach val $args {<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">      </span>button $f.$b -text $val \<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">         </span>-command "set x \[expr \$x *
$val\]"<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">      </span>pack $f.$b -side left<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">      </span>incr b<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<span style="">   </span>pack .label $f<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">set x 1<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Trouble -1 4
7 36<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">这个例子用了一个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">label</span>
				<span style="font-family: 黑体;">来设置</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">textvariable</span>
				<span style="font-family: 黑体;">属性来显示</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">的当前值，该</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">总是一个全局变量。在这里，因为</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">不在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Trouble</span>
				<span style="font-family: 黑体;">中使用（只是被定义），所以不用使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">global</span>
				<span style="font-family: 黑体;">来说明</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">是全局变量（当然，用了也没关系）。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">命令之后则将在全局范围被使用。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">但是这个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">命令的定义非常丑陋，在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">foreach</span>
				<span style="font-family: 黑体;">中的定义的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Button</span>
				<span style="font-family: 黑体;">使用了本地的变量</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">val</span>
				<span style="font-family: 黑体;">，而其他变量的实值替换将发生在之后的全局范围内。因此需要前缀反斜杠使</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">$x</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">expr</span>
				<span style="font-family: 黑体;">不在双引号被转义。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">set x \[expr
\$x * $val\]<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">我们举个反例来说，以下的这里例子中给</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">x</span>
				<span style="font-family: 黑体;">在定义过程中被直接赋值了一个常量，因而无法达到上面例子中的目的，显然是不正确的。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">button $f.$b
-text $val -command "set x [expr $x * $val]"<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">另外一个不正确的做法是对整个命令使用花括号（就是</span>
				<span style="font-family: 黑体;">“”</span>
				<span style="font-family: 黑体;">）。这么做则是过犹不及了，所有的变量都将在全局范围内执行时被实值替换，这个时候</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tcl</span>
				<span style="font-family: 黑体;">解析器可能发生提示发生错误，说找不到某些变量。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/56685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-04-24 08:58 <a href="http://www.cnitblog.com/gyn/archive/2009/04/24/56685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用snack包播放音频时存在卡的问题的解决</title><link>http://www.cnitblog.com/gyn/archive/2009/02/01/54105.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sun, 01 Feb 2009 11:21:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/02/01/54105.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/54105.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/02/01/54105.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/54105.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/54105.html</trackback:ping><description><![CDATA[
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;
	text-underline:single;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal">
		</p>
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<span style="font-size: 10.5pt; font-family: 黑体;">
		</span>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">界面处理还是延用了</span>
				<span lang="EN-US">bugd</span>
				<span style="font-family: 黑体;">的组件，为了方便修改，这次在</span>
				<span lang="EN-US">lib</span>
				<span style="font-family: 黑体;">文件夹里直接使用了</span>
				<span lang="EN-US">tcl</span>
				<span style="font-family: 黑体;">文件，而不是以往用到的</span>
				<span lang="EN-US">tbc</span>
				<span style="font-family: 黑体;">。总之，这一系列的程序应该都是</span>
				<span lang="EN-US">foobar-like</span>
				<span style="font-family: 黑体;">的。音频处理方面使用了</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">，也有人用</span>
				<span lang="EN-US">lame</span>
				<span style="font-family: 黑体;">的，但是</span>
				<span lang="EN-US">lame</span>
				<span style="font-family: 黑体;">没有专门的模块，需要</span>
				<span lang="EN-US">dll</span>
				<span style="font-family: 黑体;">来调用，因此不是很方便，就更别提文档了。在</span>
				<span lang="EN-US">
						<a href="http://www.speech.kth.se/snack/">http://www.speech.kth.se/snack/</a>
				</span>
				<span style="font-family: 黑体;">中有详细的文档和例子，很容易上手。另外，也可以参考</span>
				<span lang="EN-US">snackAmp</span>
				<span style="font-family: 黑体;">的源代码。在功能上，和我的设想有类似之处，比如说除了普通的播放之外，还可以作为网络服务器，提供在线广播收听。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">OK</span>
				<span style="font-family: 黑体;">，要做到这步显然是需要花大功夫的，目前先作为一个正常的播放器来解决。但恰恰使这个“正常”让我花费了好大功夫。故障的表现是这样的，当使用</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">播放音乐时，无论是最小化、最大化</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">程序还是其他的任何桌面窗体，播放都会卡一下。但是，当我使用</span>
				<span lang="EN-US">snackAmp</span>
				<span style="font-family: 黑体;">来播放的时候却不会有这个现象，而它也是调用</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">的。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">起初，我的想法是可能</span>
				<span lang="EN-US">snackAmp</span>
				<span style="font-family: 黑体;">中的</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">版本和我使用的不一样，于是做了替换，结果依旧。之后，我怀疑是因为</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">的原始</span>
				<span lang="EN-US">Tk</span>
				<span style="font-family: 黑体;">界面占用资源，于是将它</span>
				<span lang="EN-US">withdraw</span>
				<span style="font-family: 黑体;">了，也没有作用。没办法之下，研究起</span>
				<span lang="EN-US">snackAmp</span>
				<span style="font-family: 黑体;">的源代码起来。话说回来，这个程序写得真是糟糕，虽然分成了几十个</span>
				<span lang="EN-US">package</span>
				<span style="font-family: 黑体;">，但是相关性太高，到了你中有我我中有你的境界</span>
				<span lang="EN-US">,</span>
				<span style="font-family: 黑体;">绝大多数根本无法重用，看起来也云里雾里。最后终于定位到了</span>
				<span lang="EN-US">macro</span>
				<span style="font-family: 黑体;">中的</span>
				<span lang="EN-US">Play</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">soundCtrol</span>
				<span style="font-family: 黑体;">中的</span>
				<span lang="EN-US">play</span>
				<span style="font-family: 黑体;">两个函数，仔细分析之下发现真正涉及到播放的部分竟然非常普通，没有特别之处。打印出来的</span>
				<span lang="EN-US">snack::sound</span>
				<span style="font-family: 黑体;">对象属性基本雷同。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">事实上，我忽略了最重要也是最有效的工具，文档。当发给</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">snackAmp</span>
				<span style="font-family: 黑体;">作者的</span>
				<span lang="EN-US">email</span>
				<span style="font-family: 黑体;">石沉大海数日之后，我万念俱灰，却偶尔发现了在</span>
				<span lang="EN-US">manual</span>
				<span style="font-family: 黑体;">关于</span>
				<span lang="EN-US">snack</span>
				<span style="font-family: 黑体;">：：</span>
				<span lang="EN-US">audio</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">playLatency</span>
				<span style="font-family: 黑体;">介绍中有一句“</span>
				<span lang="EN-US">A low value makes new sound
samples reach the loudspeakers quickly at the risk of gaps in the output stream</span>
				<span style="font-family: 黑体;">”。不会是它吧！连忙对比了默认状态下和</span>
				<span lang="EN-US">snackAmp</span>
				<span style="font-family: 黑体;">中的</span>
				<span lang="EN-US">playLantency</span>
				<span style="font-family: 黑体;">参数，一个</span>
				<span lang="EN-US">250</span>
				<span style="font-family: 黑体;">，一个</span>
				<span lang="EN-US">2000</span>
				<span style="font-family: 黑体;">，</span>
				<span lang="EN-US">8</span>
				<span style="font-family: 黑体;">倍！就是这个！问题迎刃而解。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/54105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-02-01 19:21 <a href="http://www.cnitblog.com/gyn/archive/2009/02/01/54105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlite schedule-用于管理sqlite计划事件的GUI工具（下载）</title><link>http://www.cnitblog.com/gyn/archive/2009/01/13/53748.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Tue, 13 Jan 2009 11:41:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/01/13/53748.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/53748.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/01/13/53748.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/53748.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/53748.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">
						<img height="1" src="/WebResource.axd?d=pLXXeGbWF7eXU8SMs2-GFZvUWY2JNH05dFx5YzJhGUYAYJAFEaTEq36NAhTPy7_KekvzDFwt8wvQWdByvJIGWdEq6x2KpKD80&amp;t=633043190666685000" width="1" />
						<a href="/Files/gyn/sqlite%20schedule.rar">点击下载</a> （刚修订了一些bug，甚至连逻辑也改了，所以下面的内容也就没什么意义，要源代码的可电邮我<a href="mailto:gyn_tadao@yahoo.com.cn">gyn_tadao@yahoo.com.cn</a>，要运行下载代码请先安装TCL解析器<a href="http://www.activestate.com/activetcl/downloads/">http://www.activestate.com/activetcl/downloads/</a>）因为对</span>
				<span lang="EN-US">
						<font face="Courier New">bugd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中的</span>
				<span lang="EN-US">
						<font face="Courier New">item</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">状态需要定时地进行判断，以确定其是否过期。也就是说，对于</span>
				<span lang="EN-US">
						<font face="Courier New">due</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中的值小于当前日期但</span>
				<span lang="EN-US">
						<font face="Courier New">status</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">却未</span>
				<span lang="EN-US">
						<font face="Courier New">fixed</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的，可以认为该</span>
				<span lang="EN-US">
						<font face="Courier New">item</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">就是过期的了，需要将</span>
				<span lang="EN-US">
						<font face="Courier New">status</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">更新为</span>
				<span lang="EN-US">
						<font face="Courier New">outdated</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。这种事情对于</span>
				<span lang="EN-US">
						<font face="Courier New">sqlserver</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">之类的数据库，一般只需要做一个简单的</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">就可以了，但是在</span>
				<span lang="EN-US">
						<font face="Courier New">bugd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中我采用的是</span>
				<span lang="EN-US">
						<font face="Courier New">sqlite</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">作为服务器端的数据库，所以这个</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">不得不自己编了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">之前，我使用</span>
				<span lang="EN-US">
						<font face="Courier New">perl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">来写了一个，之后思索着索性写一个</span>
				<span lang="EN-US">
						<font face="Courier New">sqlite</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">工具吧，最好还是带</span>
				<span lang="EN-US">
						<font face="Courier New">GUI</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的。这并不难，</span>
				<span lang="EN-US">
						<font face="Courier New">bugd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中的组件正好可以利用。说干就干，两天的功夫就完成了。跟</span>
				<span lang="EN-US">
						<font face="Courier New">bugd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">很像，算是一个派生物了吧，但是复杂度小了很多，一则实现的功能比较单一，不需要复杂的界面配套；二来，不是</span>
				<span lang="EN-US">
						<font face="Courier New">CS</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的结构，考虑的问题都集中在本地。真正的难点是怎么维护一个对各个事件需要发生的时间的判断，同时又可以方便地增加和删除</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">事件。在这里，我维护了</span>
				<font face="Courier New">
				</font>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">一个名为</span>
				<span lang="EN-US">
						<font face="Courier New">rl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的队列，意思是</span>
				<span lang="EN-US">
						<font face="Courier New">runing-list</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，将需要进入</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的事件名称放入到该队列中，要停止的时候再将其从该队列中移除，由专门的函数循环处理该队列。<br /></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">
						<img height="338" alt="sqlites.PNG" src="http://www.cnitblog.com/images/cnitblog_com/gyn/sqlites.PNG" width="310" border="0" />
						<br />该函数叫</span>
				<span lang="EN-US">
						<font face="Courier New">runSchedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，形式如下。其中的</span>
				<span lang="EN-US">
						<font face="Courier New">yet</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">用于判断是否已经在当天检查了时间队列</span>
				<span lang="EN-US">
						<font face="Courier New">rl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc runSchedule {} {<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>global rl loop_interval yet<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>update idletask<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>if [at 00:00:00] {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>if $yet {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>schedule $rl<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>set yet 0<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>after [expr $loop_interval * 1000] runSchedule<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">在原来的函数中，我是使用</span>
				<span lang="EN-US">
						<font face="Courier New">after idle</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">来进行循环的，由于使用了</span>
				<span lang="EN-US">
						<font face="Courier New">update idletasks</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，该程序界面运行第很流畅，但是在资源管理器中</span>
				<span lang="EN-US">
						<font face="Courier New">cpu</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的使用率达到了</span>
				<span lang="EN-US">
						<font face="Courier New">100%</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，没办法是能改为一个秒级的</span>
				<span lang="EN-US">
						<font face="Courier New">interval</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">每个新的一天到来的时候，真正的队列处理在</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">被处理。该函数如下：</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc schedule {rl} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>global cmd scdl dbl<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>set sep1 @<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>set sep2 |<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>foreach n $rl {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>set m [dict get $cmd $n]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>set s [dict get $scdl $n]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>set d [dict get $dbl $n]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>foreach {ery dy tm} [split $s $sep1] {}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>switch $ery {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>month {<span style="mso-tab-count: 1">    </span>set d [clock format [clock seconds] -format "%d"]}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>week<span style="mso-spacerun: yes">  </span>{<span style="mso-tab-count: 1"></span>set d [clock format [clock seconds] -format "%a"]}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>default {}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>if [info exists d] {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>foreach e [split $dy $sep2] {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 4">              </span>if {$e eq $d} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 5">                  </span>runCommand $tm $d $m<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 4">              </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>
								<span style="mso-tab-count: 1">    </span>} else {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>runCommand $tm $m<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>}<span style="mso-tab-count: 1">   </span><o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">在</span>
				<span lang="EN-US">
						<font face="Courier New">schedule</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中，根据</span>
				<span lang="EN-US">
						<font face="Courier New">rl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中的事件名称，将通过</span>
				<span lang="EN-US">
						<font face="Courier New">cmd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">、</span>
				<span lang="EN-US">
						<font face="Courier New">scdl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">和</span>
				<span lang="EN-US">
						<font face="Courier New">dbl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">三个</span>
				<span lang="EN-US">
						<font face="Courier New">dict</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，调出对应的命令，运行时间和所在的数据库。之后通过</span>
				<span lang="EN-US">
						<font face="Courier New">runCommand</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">来根据具体时间来运行</span>
				<span lang="EN-US">
						<font face="Courier New">SQL</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">命令。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc runCommand {tm db cmd} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>global loop_interval<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>if ![at $tm] {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>update idletask<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>after [expr $loop_interval * 1000] [list runCommand $tm $cmd]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>} else {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>sqlite3 d $db<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>if [catch {d eval $cmd} err] {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 3">           </span>updateStatusInfo [join $err _]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>d close<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">最后需要说明的是</span>
				<span lang="EN-US">
						<font face="Courier New">at</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">函数，它是用来判断是否过了所给定的时间的，也就是说只要当前时间大于输入参数，它就返回为真，不然为否。所以真正意义上应该叫做</span>
				<span lang="EN-US">
						<font face="Courier New">after</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，但是</span>
				<span lang="EN-US">
						<font face="Courier New">after</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">已经是</span>
				<span lang="EN-US">
						<font face="Courier New">tcl</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">默认函数了，所以改成了</span>
				<span lang="EN-US">
						<font face="Courier New">at</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc at {tm} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>global yet<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>if {[clock scan $tm] &gt;= [clock seconds]} {set yet 1; return 1}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>return 0<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">}</font>
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/53748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-01-13 19:41 <a href="http://www.cnitblog.com/gyn/archive/2009/01/13/53748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重做了bugd的toolbar并增加了一个着色的style</title><link>http://www.cnitblog.com/gyn/archive/2009/01/11/53655.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 10 Jan 2009 16:16:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/01/11/53655.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/53655.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/01/11/53655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/53655.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/53655.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">有时候做出一点决定是很烦人的，特别是之前付出了很多努力，现在却要改弦易张。对于</span>
				<span lang="EN-US">
						<font face="Courier New">bugd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">toolbar</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，我最后还是决定改了，特别是去除了之前花了大力气做的一个控件</span>
				<span lang="EN-US">
						<font face="Courier New">menucombobox</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。很遗憾，我越看它越不爽，最重要的是我不认为它有什么用处。当我打算削减用户的</span>
				<span lang="EN-US">
						<font face="Courier New">select</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">操作时，就注定了它的命运。另外，加了</span>
				<span lang="EN-US">
						<font face="Courier New">5</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">个用于显示不同状态列表的</span>
				<span lang="EN-US">
						<font face="Courier New">radiobutton</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，这几个图标是在一个相同的底图标的基础上</span>
				<span lang="EN-US">
						<font face="Courier New">copy</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">小修饰得到的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">之后，对</span>
				<span lang="EN-US">
						<font face="Courier New">status</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">处于</span>
				<span lang="EN-US">
						<font face="Courier New">outdated</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">item</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的</span>
				<span lang="EN-US">
						<font face="Courier New">background</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">着色以明显突出，但是为了尽量不影像其他代码，在原先的</span>
				<span lang="EN-US">
						<font face="Courier New">addItem</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">之外又包了一个叫</span>
				<span lang="EN-US">
						<font face="Courier New">judgeAddItem</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的函数，用于判断</span>
				<span lang="EN-US">
						<font face="Courier New">item</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">状态，从而给与新定义了橘黄颜色的</span>
				<span lang="EN-US">
						<font face="Courier New">style</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。<br /><img height="354" alt="newbugd.PNG" src="http://www.cnitblog.com/images/cnitblog_com/gyn/newbugd.PNG" width="708" border="0" /></span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/53655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-01-11 00:16 <a href="http://www.cnitblog.com/gyn/archive/2009/01/11/53655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bugd进程过半</title><link>http://www.cnitblog.com/gyn/archive/2009/01/08/53603.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 08 Jan 2009 09:14:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/01/08/53603.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/53603.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/01/08/53603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/53603.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/53603.html</trackback:ping><description><![CDATA[
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal">
				<span lang="EN-US">bugd</span>
				<span style="font-family: 黑体;">无论使界面还是内部功能的设计，大约是完成了一半了。今天完成了几个对条目状态进行判断和提示的函数，另外由于数据库是</span>
				<span lang="EN-US">sqlite</span>
				<span style="font-family: 黑体;">的，所以不得不写一个件事程序用于事务管理，来保证数据的更新。感觉这种</span>
				<span lang="EN-US">CS</span>
				<span style="font-family: 黑体;">形式的程序，最好还是不要用这种没有自带网络服务的数据库，实在是很麻烦。虽然现在用得还好，我是打算换成</span>
				<span lang="EN-US">pgsql</span>
				<span style="font-family: 黑体;">了。还好是用</span>
				<span lang="EN-US">DBI</span>
				<span style="font-family: 黑体;">写的，只需要修改一个数据库连接就行了。在数据库方面，</span>
				<span lang="EN-US">dump</span>
				<span style="font-family: 黑体;">一下应该没问题，我用的数据类型还是比较普通的。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/bugd.PNG" alt="bugd.PNG" width="708" border="0" height="354" />
						<br />
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/53603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-01-08 17:14 <a href="http://www.cnitblog.com/gyn/archive/2009/01/08/53603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tk中维护顶层显示的堆栈及其方法</title><link>http://www.cnitblog.com/gyn/archive/2009/01/05/53510.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 05 Jan 2009 08:30:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/01/05/53510.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/53510.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/01/05/53510.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/53510.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/53510.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">在</span>
				<span lang="EN-US">
						<font face="Courier New">bugd</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中，总是会需要弹出一些信息框来收集一些用户选项，其中不乏类似于</span>
				<span lang="EN-US">
						<font face="Courier New">combobox</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">这样提供一串信息的。针对不同的弹出框，应该有不同的信息来填充。更一般的说，针对不同的框，应该有其特有的一组数据。为了区别这些框，不得不维护一个全局变量来存储显示在最外层的</span>
				<span lang="EN-US">
						<font face="Courier New">toplevel</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的路径，在其退出之后再被重新赋予下一个层次的</span>
				<span lang="EN-US">
						<font face="Courier New">toplevel</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，直至到“</span>
				<span lang="EN-US">
						<font face="Courier New">.</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">”。这不是一个好办法，因为为了存储这一系列的变化，必须对应数量可观的全局变量，至少两个：一个前一次，一个当前，而这仅仅是应对单层次弹出的情况。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">其实很容易想到的一个办法是维护一个堆栈，一旦有新的</span>
				<span lang="EN-US">
						<font face="Courier New">toplevel</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">出现，就被压入堆栈，销毁的时候在</span>
				<span lang="EN-US">
						<font face="Courier New">pop</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">出来。我们不需要为此修改每一个</span>
				<span lang="EN-US">
						<font face="Courier New">toplevel</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的构造函数，只需要建立</span>
				<span lang="EN-US">
						<font face="Courier New">&lt;Map&gt;</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">和</span>
				<span lang="EN-US">
						<font face="Courier New">&lt;Destroy&gt;</font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的事件句柄。举个例子如下：</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">bind Toplevel &lt;Map&gt;<span style="mso-spacerun: yes">   </span>{_tPush %W}<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">bind Toplevel &lt;Destroy&gt; {_tPop<span style="mso-spacerun: yes">  </span>%W}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p>
								<font face="Courier New"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc _tPush {w} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>global top_stack<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>if {[lindex $top_stack 0] ne $w} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>set top_stack [linsert $top_stack 0 $w]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p>
								<font face="Courier New"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc _tPop {w} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>global top_stack<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>if {[lindex $top_stack 0] eq $w} {<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 2">       </span>set top_stack [lreplace $top_stack 0 0]<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">}</font>
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/53510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-01-05 16:30 <a href="http://www.cnitblog.com/gyn/archive/2009/01/05/53510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个界面逻辑与数据分离的例子</title><link>http://www.cnitblog.com/gyn/archive/2009/01/03/53380.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 03 Jan 2009 03:30:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2009/01/03/53380.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/53380.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2009/01/03/53380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/53380.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/53380.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">在写</span>
				<span lang="EN-US">
						<font face="Courier New"> bugd </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">的用户控制板块的时候，涉及到了比较多的弹出选项，虽然有差别，但是总体上还是比较类似的。比如说，在左侧的一列是用于说明的</span>
				<span lang="EN-US">
						<font face="Courier New"> label </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，中间是接收输入的</span>
				<span lang="EN-US">
						<font face="Courier New"> entry </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，右侧是可选的通过显示或隐藏错误图标来表示可用性的</span>
				<span lang="EN-US">
						<font face="Courier New"> label </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。从行角度讲，除了信息输入项外，可能有用到</span>
				<span lang="EN-US">
						<font face="Courier New"> checkbuton </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。<br /><img height="257" alt="user-configure.PNG" src="http://www.cnitblog.com/images/cnitblog_com/gyn/user-configure.PNG" width="346" border="0" /><br /></span>
				<span lang="EN-US">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">在还没有意识到重复性之前，我是一个接着一个地写这些代码的，最后弄得程序巨大而拖沓。因此想做一个抽象，来分离显示界面的逻辑与数据的分离，从而达到仅通过修改数据即可得到预期界面的效果。</span>
				<font face="Courier New">
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">首先，需要一个方便可用的</span>
				<span lang="EN-US">
						<font face="Courier New"> geometry manager </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，可以考虑</span>
				<span lang="EN-US">
						<font face="Courier New"> pack </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">和</span>
				<span lang="EN-US">
						<font face="Courier New"> grid </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。使用</span>
				<span lang="EN-US">
						<font face="Courier New"> pack </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">，除非设置好组件的宽度，不然很难对齐，但不同的组件对于宽度的单位也各不相同，会给抽象增加复杂性，所以在这种明显需要对齐的情况中，我个人比较倾向与使用</span>
				<span lang="EN-US">
						<font face="Courier New"> grid </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">。</span>
				<font face="Courier New">
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">接着，组件的数据表示要简洁而必要且一目了然，在这点上我花了点功夫，最后还是套用了在</span>
				<span lang="EN-US">
						<font face="Courier New"> bugd </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">中用于</span>
				<span lang="EN-US">
						<font face="Courier New"> C/S </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">间传递数据的格式。</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">proc frameData {} { <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span># widget:state:width:pathname:text <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>return { <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>{label:::unl:username entry:readonly:40:une: label::3:veriunl:} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>{label:::pwdl:password entry::40:pwde:} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>{{checkbutton:::chkadmin:if admin?} {}} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">
								<span style="mso-tab-count: 1">    </span>} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="Courier New">} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">用</span>
				<span lang="EN-US">
						<font face="Courier New"> 4 </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">个“</span>
				<span lang="EN-US">
						<font face="Courier New"> : </font>
				</span>
				<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: 'Courier New'">”来作为分隔符（当然也可以用其他的）的一串信息，对应上面的注解。为了达到扩展的目的，使用空串来说明该位子由前一个可用组件来占据。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/53380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2009-01-03 11:30 <a href="http://www.cnitblog.com/gyn/archive/2009/01/03/53380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对Tk中checkbutton的几点看法</title><link>http://www.cnitblog.com/gyn/archive/2008/12/29/53218.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 29 Dec 2008 09:07:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/12/29/53218.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/53218.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/12/29/53218.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/53218.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/53218.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 12" />
		<meta name="Originator" content="Microsoft Word 12" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
		<link rel="themeData" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
		<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:DontVertAlignCellWithSp/>
   <w:DontBreakConstrainedForcedTables/>
   <w:DontVertAlignInTxbx/>
   <w:Word11KerningPairs/>
   <w:CachedColBalance/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val=-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-font-kerning:1.0pt;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-hansi-font-family:"Courier New";
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.5pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Calibri","serif";
	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;
	mso-font-kerning:1.0pt;}
</style>
<![endif]-->
		<p class="MsoNormal">
				<span style="font-family: 黑体;">在处理到用户管理列表的时候，我还是新建了一个</span>
				<span lang="EN-US">toplevel</span>
				<span style="font-family: 黑体;">，原打算是要抽象用户自管理程序的，但是似乎有点麻烦，留着以后再做了。其中用到了借个</span>
				<span lang="EN-US">checkbotton</span>
				<span style="font-family: 黑体;">，是</span>
				<span lang="EN-US">ttk</span>
				<span style="font-family: 黑体;">版的。从文档里可以看出</span>
				<span lang="EN-US">ttk</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">checkbutton</span>
				<span style="font-family: 黑体;">省略了不少选项和命令，但反观原生的，也存在诸多不便。首先，它没有直接取得被选择状态数值的命令，只有一个</span>
				<span lang="EN-US">variable</span>
				<span style="font-family: 黑体;">选项，所以状态的操作必须围绕这个</span>
				<span lang="EN-US">variable</span>
				<span style="font-family: 黑体;">；第二，还是和这个</span>
				<span lang="EN-US">variable</span>
				<span style="font-family: 黑体;">有关，挡在过程中生成</span>
				<span lang="EN-US">checkbutton</span>
				<span style="font-family: 黑体;">而</span>
				<span lang="EN-US">variable</span>
				<span style="font-family: 黑体;">是非</span>
				<span lang="EN-US">global</span>
				<span style="font-family: 黑体;">的时候，显示出来的</span>
				<span lang="EN-US">checkbutton</span>
				<span style="font-family: 黑体;">是无法看出是否被</span>
				<span lang="EN-US">toggle</span>
				<span style="font-family: 黑体;">的，而反过来一旦被</span>
				<span lang="EN-US">toggle</span>
				<span style="font-family: 黑体;">上，这个</span>
				<span lang="EN-US">variable</span>
				<span style="font-family: 黑体;">就自动变成</span>
				<span lang="EN-US">global</span>
				<span style="font-family: 黑体;">的了。为了不必要的麻烦</span>
				<span lang="EN-US">,</span>
				<span style="font-family: 黑体;">我的解决办法是，在要使用到</span>
				<span lang="EN-US">checkbutton</span>
				<span style="font-family: 黑体;">的过程中直接设置</span>
				<span lang="EN-US">global</span>
				<span style="font-family: 黑体;">变量供</span>
				<span lang="EN-US">checkbutton</span>
				<span style="font-family: 黑体;">设为</span>
				<span lang="EN-US">variable</span>
				<span style="font-family: 黑体;">，当包含该</span>
				<span lang="EN-US">checkbutton</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">toplevel</span>
				<span style="font-family: 黑体;">销毁时一道</span>
				<span lang="EN-US">destroy</span>
				<span style="font-family: 黑体;">掉</span>
				<span lang="EN-US">global</span>
				<span style="font-family: 黑体;">变量。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 黑体;">
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/userAdmin.PNG" alt="userAdmin.PNG" width="320" border="0" height="251" />
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/53218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-12-29 17:07 <a href="http://www.cnitblog.com/gyn/archive/2008/12/29/53218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[TclTk]给主持人用的提词软件</title><link>http://www.cnitblog.com/gyn/archive/2008/12/05/52222.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 05 Dec 2008 02:03:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/12/05/52222.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/52222.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/12/05/52222.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/52222.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/52222.html</trackback:ping><description><![CDATA[
		<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;">
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">（<a href="/Files/gyn/simple.rar">学生简化版下载</a>）写一个给主持人用的提词软件，包括两个部分。其一是满屏滚词，就是用来将接收到的文字滚动显示到屏幕上的软件，其中用到了两个主要命令和一个socket服务器。第一个命令是“wm attribute PATH </font>
				</span>
				<span style="font-size: 10.5pt; font-family: 'Courier New';">–</span>
				<span style="font-size: 10.5pt; font-family: '黑体';">fullscreen 1”<font face="黑体">，用于设置全屏；第二个是“TXT_PATH yview scroll NUM UNITS”用于滚屏，其中NUM是滚过的数量，它可以是一个负数，说明滚动是反向的，UNITS是</font></span>
				<span style="font-size: 10.5pt; font-family: '黑体';">NUM</span>
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">的单位，可以是pixel或者line等。</font>
				</span>
				<span style="font-size: 10.5pt; font-family: 'Courier New';">S</span>
				<span style="font-size: 10.5pt; font-family: '黑体';">ocket<font face="黑体">服务器就是将接收来的数据分门别类，用于文字显示或者设置滚动速度和字体。还有一个软件是用来输入文字和设置滚动速度和字体的软件，从socket角度讲就是一个客户端，虽然代码量比前者大，但功能比较简单，</font></span>
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">没什么好说的</font>
				</span>
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">。（<a title="点击下载" href="/Files/gyn/scrollscreen.rar">点击下载</a>）</font>
				</span>
		</p>
		<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;">
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">
								<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/roll.PNG" alt="roll.PNG" width="839" border="0" height="451" />
								<br />
						</font>
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/52222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-12-05 10:03 <a href="http://www.cnitblog.com/gyn/archive/2008/12/05/52222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析TclTk中的tooltip</title><link>http://www.cnitblog.com/gyn/archive/2008/11/11/51332.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Tue, 11 Nov 2008 08:48:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/11/11/51332.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/51332.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/11/11/51332.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/51332.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/51332.html</trackback:ping><description><![CDATA[
		<div class="Section0" style="">
				<p class="p0" style="text-indent: 17.955pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">
										<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/tagtip.PNG" alt="tagtip.PNG" width="404" border="0" height="181" />
										<br />
								</font>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.955pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">最近一直在写一个文件传阅系统，其中涉及到一个包含显示文件状态的text的notebook。虽然和本文无关，但还是要说一下的是，text最好指定一个height，不然在fill和expand之后，会在notebook中占据显示空间，我在这里用到的数值是7。还有的是，在布局notebook时可以考虑使用panedwindow，它可以缩放组件占据面积的大小。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.955pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">言归正传，tooltip是用来为比如像工具栏中的按钮提供动态提示的组件。查看源代码，我们可以看到，被bind的Tooltip不是具体关于tooltip本身的，通过bindtag它被添加到需要被显示信息的组件的事件处理队列中。一旦比如Enter或者Leave事件发生，将运行tooltip中相应的函数。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.955pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">具体用于显示信息的路径名为.__tooltip__的toplevel中只有一个label，有时候我们需要增加一些显示信息，比如图片之类的时候，就显得很不够。我们可以通过在.__tooltip__中增加一个canvas或者text来实现。对于原存在的label，我建议最多做一些configure，将其的anchor、bd、bg分别设为w、0、#ffffff，它便如个title一样，不会对显示效果产生太大影响。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.955pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">但是还是存在一些局限，例如同时存在需要显示原状和增加了现实效果这两种tip时，上面的这种办法就无能为力了，因为.__tooltip__是被共享的，修改就意味着所有需要显示tip的组件都将为此使用新的风格。所以，可以确定的是，我们需要有两种显示状态。解决的办法按照深度可分为三种：第一种，在原先的.__tooltip__中针对不同的组件来withdrawn新增的效果，这需要做出一些判断，甚至在构造函数中增加一个选项；第二，在tooltip的hash变量G中除了TOPLEVEL之外，再增加一个例如TOPLEVEL_2这样的key值，也就是说再造一个专门用于显示特殊效果的组件，当然判断还是需要的；第三种也是最简单的一种，重建一个用来显示特殊效果tip的package，说起来好像很难，其实只是替换tooltip和Tooltip这两个关键词即可。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
		</div>
<img src ="http://www.cnitblog.com/gyn/aggbug/51332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-11-11 16:48 <a href="http://www.cnitblog.com/gyn/archive/2008/11/11/51332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tk最新实现dateentry（取代iwidgets::dateentry）</title><link>http://www.cnitblog.com/gyn/archive/2008/10/30/50865.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 30 Oct 2008 05:34:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/10/30/50865.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/50865.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/10/30/50865.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/50865.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/50865.html</trackback:ping><description><![CDATA[
		<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">最近一直在研究Tcl/Tk，而且有点乐不思蜀了，这里的“蜀”说的是Perl，因为一直用Perl的缘故，现在倒是有点冷落它了。介绍一下最近实现的一个dateentry，其实借鉴了很多iwidgets::dateentry的思路，但是由于该package年代久远，现在看来却是有点惨不忍睹，所以不得不重新写一个。</font>
				</span>
		</p>
		<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
				<span style="font-size: 10.5pt; font-family: '黑体';">
						<font face="黑体">
								<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/cal2.PNG" alt="cal2.PNG" width="317" border="0" height="273" />
								<br />
						</font>
				</span>
		</p>
		<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
				<span style="font-size: 10.5pt; font-family: '黑体';">
				</span>
		</p>
		<div class="Section0" style="">
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">以上就是最终的控件样式，因为比较喜欢苹果的风格，所以总体上以白色为主，比较清新。代码的实现上，主要是解决一下几个问题。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">首先，如何布局，因为使用canvas的缘故，所有的内部组件必须使用x、y坐标的形式放置，如此一来就不得不小心地控制所有组件的位置。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">第二，其中的日期按钮都是复用的，也就是说某个月中产生的日期按钮在下一个月份更新时并不会被注销，而是改变了text。这么一来解决了组件路径冲突的问题，而8.6中将可能可以使用%来自动生成随机数。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">第三，日历的显示，使用了overrideredirect来隐藏了toplevel的边框。使用geometry，并根据dateentry的label位置，来定位日历，使其能够紧贴控件显示。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">第四，点击除日历外的任意位置，都会注销日历。这么作完全是为了符合windows使用的习惯，当然这样也很方便。需要使用“grub -global $toplevel”将事件的捕获限定在当前显示的日历中，然后通过判定鼠标位置是否在日历内，来决定是否该注销日历。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<font face="黑体">这是一个示例，并没有打包，使用的时候，直接运行即可，但需要安装tcltk解析器。如需应用到具体程序中可电邮我，独家发布，欢迎使用。</font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<a href="/Files/gyn/cal2.rar">
								<span style="font-size: 10.5pt; font-family: '黑体';">download</span>
						</a>
				</p>
				<p class="p0" style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;">
						<br />
						<a href="/Files/gyn/cal2.rar">
								<span style="font-size: 10.5pt; font-family: '黑体';">
								</span>
						</a>
						<span style="font-size: 10.5pt; font-family: '黑体';">
								<o:p>
								</o:p>
						</span>
				</p>
		</div>
<img src ="http://www.cnitblog.com/gyn/aggbug/50865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-10-30 13:34 <a href="http://www.cnitblog.com/gyn/archive/2008/10/30/50865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用TclTk重新编写录制程序的几个细节</title><link>http://www.cnitblog.com/gyn/archive/2008/10/16/50300.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 16 Oct 2008 01:11:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/10/16/50300.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/50300.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/10/16/50300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/50300.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/50300.html</trackback:ping><description><![CDATA[
		<div class="Section0" style="">
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">用</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">TclTk</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">重写了视频录制程序，其中有些细节不便在前一篇《</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Perl</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">程序转换为</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Tcl/Tk</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">实例一则》中细述，因为它主要是讲用两种语言来实现的差别。另外，后来我又对程序做了一些修改，所以不得不再费力写下来了。</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">首先对于在</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Tk</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">中使用到的命令，因为循环的关系，我们不需要将它放置在</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Tk</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">界面代码之前。但是如果在循环之外使用，那么就只能在用到什么之前，就定义什么。这是一个细节，还是要注意一下，免得调试的时候手忙脚乱。</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">最主要提到的有两方面，其一是关于如何正确关闭管道。如果只是简单地</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">close</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">掉管道，除非子进程会自动关闭，不然可能一直运行下去。比如：</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">catch {open "|ping 127.0.0.1 -t"} output</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">close $output</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">（使用</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">catch</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">来捕捉错误，阻止烦人的错误提示）</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">打开任务管理器，你会看见</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">ping</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">进程依然在执行，因此这并没有达到彻底关闭的效果，这在</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Perl</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">里也是一样的。需要显示地将进程关闭掉，我们可以使用一下的命令：</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">catch {exec taskkill /F /PID [pid $pipe]}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">在这里，调用了系统命令</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">taskkill</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">来关闭进程，</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">pid</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的作用是返回一个管道子进程的</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">pid</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">值，如果没有该进程将返回一个错误，并被外围的</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">catch</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">捕获。</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">另外的一个是关于如何输出的问题，我们使用</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">gets $pipe line</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">来得到管道的输出，之后通过一定的过滤，最终显示到</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Text</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">上，我用两种结尾的输出试验了一下。用“</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">\r</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">”的时候，</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">cpu</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">使用率一度达到</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">100%</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">，最终程序僵死，甚至连子进程都无法正常退出。用“</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">\n</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">”则恢复正常了，</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">cpu</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">使用率很低，亦不会出现阻塞。另外，为了不输出空行，做了一些必要的检测：</span>
						<span style="font-size: 10.5pt; font-family: 'Arial';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Arial';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">set line [string trim $line]</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">if [string compare $line {}] {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   $log insert end [string trim $line]\n</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   $log see end</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="background: rgb(217, 217, 217) none repeat scroll 0% 0%; text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; margin-bottom: 0pt; margin-top: 0pt;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
										<br />
								</o:p>
						</span>
				</p>
		</div>
<img src ="http://www.cnitblog.com/gyn/aggbug/50300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-10-16 09:11 <a href="http://www.cnitblog.com/gyn/archive/2008/10/16/50300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl程序转换为Tcl/Tk实例一则</title><link>http://www.cnitblog.com/gyn/archive/2008/10/11/50093.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 11 Oct 2008 08:40:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/10/11/50093.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/50093.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/10/11/50093.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/50093.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/50093.html</trackback:ping><description><![CDATA[
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">每种语言都有其擅长和不足的地方，在某项工作甚至工作的某一部分中选择合适的语言往往可以达到事半功倍的效果。所以，多掌握一些知识是很有必要的，当然了也可以用一些大语言，比如说</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">C</span>
				<span style="font-family: 黑体;">或者</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Java</span>
				<span style="font-family: 黑体;">，它们几乎是可以通吃一切问题的，但是付出的代价一样高昂，一些可以用几行</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">或者</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Python</span>
				<span style="font-family: 黑体;">实现的功能，换作</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Java</span>
				<span style="font-family: 黑体;">可能需要花费几倍的工作量，所以这里就不谈了。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">在很久以前，为了方便工作人员录制电视节目，我用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">写了一个基于</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tk</span>
				<span style="font-family: 黑体;">的设置界面。界面如下图：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/tkcl.PNG" alt="tkcl.PNG" width="592" border="0" height="48" />
						<br />
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
		</p>
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">大致上就是设置一个时间，然后在该时间点自动启动一个录制程序。当时由于时间仓促，本着够用就好的精神，很快就写好了，所以难免留下一些</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">bug</span>
				<span style="font-family: 黑体;">。比如说设置完之后，没有将按钮重置为退出。这还是小事，最主要的还是一旦录制程序启动，整个界面就被阻塞，这是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">下</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">的老毛病了，几乎无药可救。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">其实即便如此，这个程序还是可以顺利使用的，但是作为一个解决长时间运算阻塞界面的办法，将它移植到</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">上，还是有一些意义的。在上一篇随笔中，我大致讲到了</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">filevent</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">select</span>
				<span style="font-family: 黑体;">在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">下的差别，正好可以在这里验证一下，同时通过移植的过程，也可以更清楚地了解和区分两种语言在某些功能上的不同实现办法。最终实现的工具如下图</span>
				<span style="font-family: 黑体;">：</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">
						<img src="http://www.cnitblog.com/images/cnitblog_com/gyn/chonglu.PNG" alt="chonglu.PNG" width="649" border="0" height="186" />
						<br />
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<br />
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
		</p>
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">这里将代码拆分开来进行分析。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">首先是界面部分，这一部分其实是最简单的，所以在实现上几乎一样，只不过是语法上的差别而已。有一点值得注意的是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">中是不需要的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">mainloop</span>
				<span style="font-family: 黑体;">这样的命令来显式地启动主循环。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第二，因为定时启动需要计算启动时间与当前事件的差值，所以需要处理一些时间相关的参数。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">中可以使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">localtime</span>
				<span style="font-family: 黑体;">来得到年份、月、日和秒等共</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">9</span>
				<span style="font-family: 黑体;">个值，供组合使用。在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">中，有一个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">clock</span>
				<span style="font-family: 黑体;">命令，通过</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">format</span>
				<span style="font-family: 黑体;">可以实现类似的功能，感觉上</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">的更方便一些。相同的感觉也处理时间差值时也存在，因为</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">中需要拆分一个某种形式的时间表达式，提取必要参数给</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">timelocal</span>
				<span style="font-family: 黑体;">计算总秒数，而</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">clock</span>
				<span style="font-family: 黑体;">有</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">scan</span>
				<span style="font-family: 黑体;">可以直接生成。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第三，在像</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">BrowseEntry</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ComboBox</span>
				<span style="font-family: 黑体;">的下拉框中，经常会插入一串连续的数字。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">可以使用形如“（</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">1..10</span>
				<span style="font-family: 黑体;">）”来表示</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">1-10</span>
				<span style="font-family: 黑体;">这</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">10</span>
				<span style="font-family: 黑体;">个数字，但是在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">里没有类似的命令，所以当遇到大数组表达式的时候，最好是写一个方法来模拟</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">中的这种功能。</span>
		</p>
		<div class="Section0" style="">
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">proc listOfNum {from to {step 1}} {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">set lst [list ]</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">set index $from</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">while {$index &lt;= $to} {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">lappend lst $index</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">set index [expr $index + $step]</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
						</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   	</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">return $lst</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="border: medium none ; padding: 1pt 4pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第四，为了确保录制任务在制定的时间点启动，需要有检查是否超时。在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">里这个实现因为有</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">after</span>
				<span style="font-family: 黑体;">变得很轻松，只要指定一个需要等待时间戳，</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">就会在过晚这段时间之后启动需要执行的指令，而</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">就麻烦多了。在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tk</span>
				<span style="font-family: 黑体;">的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">mainloop</span>
				<span style="font-family: 黑体;">中，使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">repeat(1000, sub {…})</span>
				<span style="font-family: 黑体;">使其每隔一秒钟执行一次检查，看是否超时。一旦检查到超时则停止检查并启动录制；若没有则提示继续下次检查。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第五，在如何启动录制这点上，两者使用了不同的手段。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Tcl</span>
				<span style="font-family: 黑体;">使用管道来启动进程，使得自身不被阻塞（不过在使用producer的时候还是会阻塞，用ping就没问题，这个很奇怪），并且使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">filevent</span>
				<span style="font-family: 黑体;">监测打开句柄的状态。而</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">因为不可靠的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">select</span>
				<span style="font-family: 黑体;">，我们只能使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">system</span>
				<span style="font-family: 黑体;">，通过阻塞的办法来获知任务是否完成，这也是一个无可奈何的事情了。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">（<a href="/Files/gyn/chonglu.rar">代码下载</a>）<br /></span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<br />
		<span style="font-family: 黑体;">
		</span>
		<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
				<o:p>
				</o:p>
		</span>
		<br />
		<span style="font-family: 黑体;">
		</span>
		<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
				<o:p>
				</o:p>
		</span>
<img src ="http://www.cnitblog.com/gyn/aggbug/50093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-10-11 16:40 <a href="http://www.cnitblog.com/gyn/archive/2008/10/11/50093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl与Tcl/Tk事件驱动的比较</title><link>http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 20 Sep 2008 14:08:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/49317.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/49317.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/49317.html</trackback:ping><description><![CDATA[
		<div class="Section0" style="">
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">因为在用</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Perl-Tk </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">或者</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Socket </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">时，经常会需要监视某些打开的句柄而不至于阻塞主循环，</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<font face="宋体">对于这些 win32 </font>
						</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">下的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Perl</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">表现远不如</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Linux</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">下来得得心应手，但这时候我基本没有什么办法。这和</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">windows</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的底层</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">select</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">实现有关，而</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Perl</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">恰恰是调用它的，但我一直认为肯定有别的替代办法，因为</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">Tcl/Tk</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">fileevent</span>
						<span style="font-size: 10.5pt; font-family: '黑体';">就表现得很好。</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">下面是一个例子，用来显示</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> ping </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的结果。这里有两个组件，一个是按钮，用来开始和停止</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> ping </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">；另一个是</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> text </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">用来显示</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> ping </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的结果。分别用</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Perl </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">和</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Tcl/Tk </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">代码来实现，看看他们有什么不同。</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">use Tk;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$count = 4;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$host = '127.0.01';</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$mw = MainWindow-&gt;new;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$bt = $mw-&gt;Button(-text =&gt; 'Clink to start ping', -command =&gt; \&amp;RunPing);</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$bt-&gt;pack(-fill =&gt; 'x');</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$tx = $mw-&gt;Text(-width =&gt; 50, -height =&gt; 30);</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">$tx-&gt;pack;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">MainLoop;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">sub RunPing {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   open $fd, "ping -n $count $host|";</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   $mw-&gt;fileevent($fd, 'readable' =&gt; sub {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">      sysread $fd, $buf, 30;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">      $tx-&gt;insert('end', $buf);</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">      });</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   $bt-&gt;configure(-text =&gt; 'close', -command =&gt; \&amp;ClosePing);</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">sub ClosePing {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   close $fd;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   undef $fd;</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   $bt-&gt;configure(-text =&gt; 'Clink to start ping', -command =&gt; \&amp;RunPing);</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">运行的结果很让人失望，在</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> readable </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的事件中加入</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> print </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">后而已更清楚地看到，事实上</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> readable </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">事件是没有被触发过的。这里的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> fileevent </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">是</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Tk </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">中处理事件触发的函数，它为句柄的两个状态（</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> readable </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">，</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> writable </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">）设定触发函数，其本质上使用了系统的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> select </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">或者</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> poll </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">，换句话说即便是用</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Perl </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> select </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">或者</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> IO::Seelct </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">也是于事无补。文档里的原话佐证了这点“</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> A file is considered to be readable on same basis as the system's select() (or poll()). </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">”。</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">所以可以这么讲，</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> win32 </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">下的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Perl </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">是不大适合处理事件响应的，因而也就很难处理好处理网络相关或者界面需要运行后台长时间操作的情况。接下来换作是使用</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Tcl/Tk </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">来实现这一功能，值得一提的是在</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Perl </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">下</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> 50 </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">宽度的</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> button </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">和</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> text </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">是不等长的，所以索性在</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> pack </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">里用</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> fill </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">自动拓宽了，而在</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Tcl/Tk </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">中没有这个问题。</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">package require Tk</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">set pingcount 4</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">set host {127.0.0.1}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">button .btn -text {Clink to start ping} -command "RunPing $host $pingcount" -width 50</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">text .text -width 50 -height 30</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">pack .btn .text</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">proc RunPing {host count} {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   set fd [open "|ping -n $count $host"]</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   ;#fconfigure $fd -blocking 0</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   fileevent $fd readable "onPingRead $fd $count $host"</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   .btn configure -text "close" -command "closeFd $fd $count $host"</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">proc onPingRead {fd count host} {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   if {[eof $fd]} {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">      closeFd $fd $count $host</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   } else {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">      set buf [gets $fd]</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">      .text insert {end} "$buf\n"</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   }</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">proc closeFd {fd count host} {</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   close $fd</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">   .btn configure -text {Clink to start ping} -command "RunPing $host $count"</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="padding: 0pt; background: rgb(217, 217, 217) none repeat scroll 0% 0%; margin-bottom: 0pt; margin-top: 0pt; text-align: justify; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
						<span style="font-size: 10.5pt; font-family: 'Courier New';">}</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">为了使用同样条件的管道，屏蔽了设置非阻塞的代码行，但这么作</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">因为系统不得不等待管道中的进程运行结束，所以</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">也使得</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> close </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">没有起到应有的作用。</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="p0" style="text-indent: 17.95pt; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
						<span style="font-size: 10.5pt; font-family: '黑体';">运行的结果很令人满意，</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> test </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">没有被阻塞，在显示</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> ping </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">结果的同时，依然可以在</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> text </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">中执行输入，而且</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> button </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">也可以被顺利按下。这么看来</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Tcl/Tk </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">比之</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> Perl </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">在</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';"> win32 </span>
						<span style="font-size: 10.5pt; font-family: '黑体';">下，显然在事件处理上占有优势，而且这个占优的方面是极其重要的。</span>
						<span style="font-size: 10.5pt; font-family: 'Courier New';">
								<o:p>
								</o:p>
						</span>
				</p>
		</div>
<img src ="http://www.cnitblog.com/gyn/aggbug/49317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-09-20 22:08 <a href="http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为Q3526E交换机日志导出脚本</title><link>http://www.cnitblog.com/gyn/archive/2007/01/01/21383.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 01 Jan 2007 01:46:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2007/01/01/21383.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/21383.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2007/01/01/21383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/21383.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/21383.html</trackback:ping><description><![CDATA[package require Expect<br />set params [open params.txt r]<br />array set params_arr [list ]<br />while {![eof $params]} {<br /> set line [gets $params]<br /> if [regexp {\[(.*)\](.*)} $line full name value] { set params_arr([string trim $name]) [string trim $value] }<br />}<br />close $params<br />proc q3526e {arr} {<br /> upvar $arr params<br /> set buffer [list ]<br /> if [catch {spawn telnet $params(hostname)} result] { puts $result; exit 1 }<br /> expect -re {Password} { exp_send "$params(password)\r" } eof { exit 1 }<br /> expect -re $params(prompt) { exp_send "sup\r" }<br /> expect -re {Password} { exp_send "$params(password)\r" } eof { exit 1 }<br /> expect -re $params(prompt) { exp_send "dis log\r" }<br /> expect -re {More ----} {<br />  foreach ele [split $expect_out(buffer) "\n"] { lappend buffer $ele } <br />  exp_send "\r" <br />  while { [regexp {More ----} $expect_out(buffer)] } { <br />   expect -re {More ----} { <br />    foreach ele [split $expect_out(buffer) "\n"] { lappend buffer $ele }<br />    exp_send "\r"<br />   } -re "$params(prompt)" {<br />    foreach ele [split $expect_out(buffer) "\n"] { lappend buffer $ele }<br />    writelog buffer<br />    exp_send "\r"<br />   } eof { exit 1 }<br />  }<br /> } -re $params(prompt) {<br />  foreach ele [split $expect_out(buffer) "\n"] { lappend buffer $ele }<br />  writelog buffer<br />  exp_send "\r"<br /> } eof { exit 1 }<br />}<br />proc writelog {buf} {<br /> upvar $buf buffer<br /> set curr [clock format [clock seconds] -format %D]<br /> regexp {([0-9]{2})/([0-9]{2})/([0-9]{2})} $curr match month day year<br /> set curr "20$year$month$day"<br /> set log [open [format "%s_%s%s" {c:/3526log} $curr {.txt}] w]<br /> foreach ele $buffer { puts $log $ele }<br /> flush $log<br /> close $log<br />}<br />if [catch {eval [string trim $params_arr(act)]} result] {puts $result; exit}<br /><br />参数文件：<br />[hostname]网关ip地址<br />[password]交换机密码<br />[prompt]&lt;Q3526E&gt;<br />[act]q3526e params_arr<img src ="http://www.cnitblog.com/gyn/aggbug/21383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2007-01-01 09:46 <a href="http://www.cnitblog.com/gyn/archive/2007/01/01/21383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tcl文本操作示例</title><link>http://www.cnitblog.com/gyn/archive/2006/11/27/19617.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 27 Nov 2006 02:16:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/11/27/19617.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/19617.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/11/27/19617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/19617.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/19617.html</trackback:ping><description><![CDATA[因为要在windows上使用expect的缘故，所以学习了tcl。还是用我在上一篇随笔中使用的例子来入门。<br /><br />set seconds [clock seconds]<br />set timer [clock format $seconds -format %D]<br /><br />regexp {([0-9]{2})/([0-9]{2})/([0-9]{2})} $timer match month day year<br />set rep_smp "20$year$month$day"<br />set rep_full "20$year-$month-$day"<br /><br />set rpjf [open {shixian.rpjf} r]<br />set tmp [open {tmp.txt} w]<br /><br />while {[expr ![eof $rpjf]]} {<br />    gets $rpjf content<br />    set content [regsub {([0-9]{4})-([0-9]{2})-([0-9]{2})} $content $rep_full]<br />    set content [regsub {[0-9]{4}[0-9]{2}[0-9]{2}} $content $rep_smp]<br />    puts $tmp "$content"<br />    }<br /><br />flush $tmp<br />close $rpjf<br />close $tmp<br /><br />tcl语法用一句话概括的话就是：命令加参数。相比perl与python来说，tcl的语法相对简单一些，但是这并不代表就不如以上两者，各有各的特点而已。在tk和expect上tcl不仅仅是先驱而且也是做得最好的。<br /><img src ="http://www.cnitblog.com/gyn/aggbug/19617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-11-27 10:16 <a href="http://www.cnitblog.com/gyn/archive/2006/11/27/19617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>