﻿<?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>博客园-流浪的蝴蝶</title><link>http://www.cnblogs.com/Kane/</link><description>程序员？或许只是热爱程序吧。</description><language>zh-cn</language><lastBuildDate>Sun, 07 Sep 2008 20:25:01 GMT</lastBuildDate><pubDate>Sun, 07 Sep 2008 20:25:01 GMT</pubDate><ttl>60</ttl><item><title>Silverlight的大小自适应中存在的一个问题</title><link>http://www.cnblogs.com/Kane/archive/2008/07/28/1254762.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Mon, 28 Jul 2008 06:22:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2008/07/28/1254762.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/1254762.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2008/07/28/1254762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/1254762.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/1254762.html</trackback:ping><description><![CDATA[<p>由于希望Silverlight程序在浏览器中可以随着浏览器的大小而自适应，以便给客户带来更好的体验，在网上搜索了一下代码，大概原理是：</p>
<p>设置SilverlightHost的大小为100%（这在Silverlight2 beta2中似乎已经自动设置了，程序的大小为640*480）</p>
<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">partial</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Page&nbsp;:&nbsp;UserControl<br />
<img id="Codehighlighter1_42_781_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_781_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_42_781_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_781_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_42_781_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_781_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_42_781_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_781_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_42_781_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_42_781_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Page()<br />
<img id="Codehighlighter1_62_226_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_62_226_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_62_226_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_62_226_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_62_226_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_62_226_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_62_226_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_62_226_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_62_226_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_62_226_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Required&nbsp;to&nbsp;initialize&nbsp;variables</span><span style="color: #008000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.Current.Host.Content.Resized&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;EventHandler(BrowserHost_Resize);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BrowserHost_Resize(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
<img id="Codehighlighter1_303_781_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_303_781_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_303_781_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_303_781_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_303_781_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_303_781_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_303_781_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_303_781_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_303_781_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_303_781_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Content&nbsp;contentObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Application.Current.Host.Content;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;xscale&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;contentObject.ActualWidth&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Width;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;yscale&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;contentObject.ActualHeight&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Height;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScaleTransform&nbsp;scale&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ScaleTransform();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scale.ScaleX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;xscale;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scale.ScaleY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;yscale;<br />
</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RenderTransform&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;scale;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span></span></span>
<p><span id="Codehighlighter1_42_781_Open_Text"><span id="Codehighlighter1_303_781_Open_Text"><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span> <br />
</p>
</div>
<p>
通过以前代码可以实现Silverlight程序随着浏览器的大小而变化了，可是在实际应用发现，实际上这样只能实现Silverlight程序随着浏览器变大，而不是能缩小。也就是说当浏览器的容器的大小大于Silverlight原始大小时，Silverlight程序随之变大，但当浏览器容器的大小小于Silverlight程序的原始大小时，会出现Silverlight程序显示不全的情况，如下图所示：</p>
<p><br />
</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kane/Snap1.jpg" border="0" width="669" height="621" /></p>
<p>图1<br />
</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kane/Snap2.jpg" border="0" width="463" height="417" /><br />
&nbsp;</p>
<p>图2</p>
<p>&nbsp;</p>
<p>在图1中可看出，当Host的尺寸大于程序大小时，显示正常，而在图2中则消失了一部分。<br />
</p>
<p>经过分析，我认为是因为Rezised事件是后于浏览器大小变化而激发的，但此时浏览器已经遮挡了一部分程序画面，而Transform的变换只依靠当前显示的画面进行变换，所以出现了这种现象。</p>
<p>结论：我也不知道这种情况该如何处理，不晓得有没有达人知道，还请告知，谢拉。<br />
</p>
<p>
</p><img src ="http://www.cnblogs.com/Kane/aggbug/1254762.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42134/" target="_blank">[新闻]JavaScript将成Silverlight的最大对手?</a>]]></description></item><item><title>自动化数据采集平台构想</title><link>http://www.cnblogs.com/Kane/archive/2005/12/24/304075.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Sat, 24 Dec 2005 15:51:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2005/12/24/304075.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/304075.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2005/12/24/304075.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/304075.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/304075.html</trackback:ping><description><![CDATA[摘要: 近段时间，在一个国有大型铁矿企业做自动化工程。经过一些项目的总结，并根据客户的需要，提出一个数据采集平台的基本框架。希望能把在纯软件系统结构中的经验也应用到自动化中，还有部分没有完成。不足之处还请各位指教。 第1章 概述1.1 概述 （删去） 1.2 现状（删去） 1.3 参考资料n 《基于Modbus协议的工业自动化网络规范》中华人民共和国国家质量监督检验检疫总局 中国国家标准化管理委员会 n &nbsp;&nbsp;<a href='http://www.cnblogs.com/Kane/archive/2005/12/24/304075.html'>阅读全文</a><img src ="http://www.cnblogs.com/Kane/aggbug/304075.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42133/" target="_blank">[新闻]没有谷歌就活不下去的四个网站</a>]]></description></item><item><title>软件开发复用问题的若干思考</title><link>http://www.cnblogs.com/Kane/archive/2005/09/14/236785.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Wed, 14 Sep 2005 06:39:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2005/09/14/236785.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/236785.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2005/09/14/236785.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/236785.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/236785.html</trackback:ping><description><![CDATA[<DIV>
<P><SPAN>这是我以前写的一个关于公司软件开发方面的东西，算是我在软件开发方面思考的一个结果。</SPAN></P>
<P>&nbsp;</P>
<P><SPAN>随着公司的不断开展的各项工程，无论是政府的信息管理，还是企业的工业控制，都在有条不紊的进行。然而在这些进行的项目中，我们也相应的发现了一些问题，比如项目的进度控制问题，软件的复用问题等，在这里我想着重说一下软件复用的问题。</SPAN></P>
<P>
<P>
<P>
<P><SPAN>软件复用的好处</SPAN></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>1、</FONT><SPAN>&nbsp; </SPAN></SPAN><FONT face=宋体><U>开发成本的降低</U>。如果在一个项目中，能够直接用到以前项目中的代码，控件，模块，作为一个软件企业，显然的可以把开发成本降低。</FONT></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>2、</FONT><SPAN>&nbsp; </SPAN></SPAN><FONT face=宋体><U>开发层次的提升</U>。大家知道，罗马不是一天建成的，同样的，在软件开发上，也不会一蹴而就的写出高质量的代码。当我们有意识的进行复用时，我们会在每次重复使用某段代码或者控件的过程中，发现其不足的地方，从而加以改进，这样就会逐渐的提升我们的开发层次，提升整个公司开发的层次，使得公司的软件与其他公司有着根本的不同。<U></U></FONT></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>3、</FONT><SPAN>&nbsp; </SPAN></SPAN><FONT face=宋体><U>产品化的必然阶段</U>。在我们公司目前没有明确的开发产品的现阶段，那么对软件复用的使用，就是我们产品化的一个途径，我们在不断的复用的过程中，不断的强化我们的代码的功能，直至有了一定固定功能，运行稳定，扩展性好的软件，这样一个产品就可以自然而然的产生了。<U></U></FONT></P>
<P>
<P>
<P>
<P>
<P>
<P><SPAN>软件复用的层次</SPAN></P>
<P>
<P><SPAN><FONT face=宋体>我将软件复用的层次分为<B><SPAN>代码级</SPAN></B>，<B><SPAN>控件级</SPAN></B>，<B><SPAN>模块级</SPAN></B>，<B><SPAN>构架级</SPAN></B>，这四个级别在概念上依次上升。</FONT></SPAN></P>
<P>
<P><FONT face=宋体><B><SPAN>代码级</SPAN></B>：代码级这个层级就是指在源代码中可以重复使用的一些算法，函数，对象。</FONT></P>
<P>
<P><FONT face=宋体><B><SPAN>控件级</SPAN></B>：我们目前使用的主力开发工具为<SPAN lang=EN-US>Borland Delphi</SPAN>，<SPAN lang=EN-US>Microsoft .Net VS2003</SPAN>。这两种开发工具的核心思想之一就是快速开发，运用大量的已有控件。控件是封装了源代码，并提供可视化的编辑，对于开发生产力的提高有着革命性的提升。</FONT></P>
<P>
<P><FONT face=宋体><B><SPAN>模块级</SPAN></B>：在我们开发的项目或者产品中，会发现大量重复的功能模块，比如用户管理，权利管理，新闻发布等等，如果我们在这些模块设计的时候，注重一下扩展性，那么可以应用到有其类似功能的项目中。在这个级别需要一定的项目的积累，否则在模块功能上以及实用性上会遭遇风险。</FONT></P>
<P>
<P><FONT face=宋体><B><SPAN>构架级</SPAN></B>：构架级在设计概念上最为高级的一种。它相当于一个平台或者思想，在这个平台上，可以开发出根据此平台思想稳定而又高效的软件产品。打个比方，数据库中的设计范式可以看成是一个小的构架，你按照范式来设计数据库，一般来说设计质量是有保重的。再举个例子，<SPAN lang=EN-US>Windows</SPAN>中的消息机制也算是一个构架，就是说在<SPAN lang=EN-US>Windows</SPAN>中所有运行的程序都遵循它的这个机制，并且在这个机制的保证下，运行的顺畅良好，<SPAN lang=EN-US>Linux</SPAN>中的<SPAN lang=EN-US>IP Chains</SPAN>也是一个非常优秀的网络防火墙构架，这这个构架中其他人可以方便进行外挂程序的嵌入。我拿我们将要开发的公司内部的物资管理系统来举个例子，在这个系统中，有一个很重要的功能，那就是审批，如何把审批这个功能做好，有良好的扩展性，并且可以沿用到其他的也有审批功能的项目中，就是一个我们需要思考的问题（此处仅拿此举例，考虑到实际情况并不一定要做到这么高级）。</FONT></P>
<P>
<P>
<P>
<P><SPAN>如何做到软件复用</SPAN></P>
<P>
<P><SPAN><FONT face=宋体>如何能做到软件的复用，首先在我们的头脑中要有这样的一个思想，在平时的工作中，能够<B>随时的想到这些问题</B>。在制度上，第一，我们可以建立一个公司内部软件复用的树状图，如下图所示。这样在开发时，可以做到时时检视。</FONT></SPAN></P>
<P><SPAN><FONT face=宋体></FONT></SPAN>&nbsp;<IMG alt=" " src="http://www.uuzone.com/images/upload/959000/kane200509141425281_big.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align=baseline></P>
<P></P>
<P>
<P>
<P><SPAN lang=EN-US><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" /><STROKE joinstyle="miter" /><FORMULAS /><F eqn="if lineDrawn pixelLineWidth 0" /><F eqn="sum @0 1 0" /><F eqn="sum 0 0 @1" /><F eqn="prod @2 1 2" /><F eqn="prod @3 21600 pixelWidth" /><F eqn="prod @3 21600 pixelHeight" /><F eqn="sum @0 0 1" /><F eqn="prod @6 1 2" /><F eqn="prod @7 21600 pixelWidth" /><F eqn="sum @8 21600 0" /><F eqn="prod @7 21600 pixelHeight" /><F eqn="sum @10 21600 0" /></FORMULAS /><PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /><LOCK v:ext="edit" aspectratio="t" /></SHAPETYPE /></SPAN></P>
<P>
<P><SPAN><FONT face=宋体>第二，加强项目设计方案的<B>讨论</B>，<B>审核机制</B>，通过讨论审核，群策群力，不断的对整个公司的软件开发体系进行培育。</FONT></SPAN></P>
<P>
<P>
<P>
<P><SPAN>软件复用的难点</SPAN></P>
<P>
<P><SPAN><FONT face=宋体>在我们实现软件复用的过程中，一定也会遇到很多困难，比如：</FONT></SPAN></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>1、</FONT><SPAN>&nbsp; </SPAN></SPAN><SPAN><FONT face=宋体>客户对我们已形成的功能，界面不满意，仍要定制开发。对于此类问题，从一个方面我们平时要注意功能的设计使得能够灵活的进行功能的扩展，界面的更改，另一方面也要认识到，即使我们不做复用的工作，客户仍会有要求，而我们也必须开发。</FONT></SPAN></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>2、</FONT><SPAN>&nbsp; </SPAN></SPAN><SPAN><FONT face=宋体>对软件功能进行复用是一项艰巨的任务，必将耗费人力，所以在平时的开发过程中，对哪些功能进行复用，复用到什么程度，要把握好一个度。</FONT></SPAN></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>3、</FONT><SPAN>&nbsp; </SPAN></SPAN><SPAN><FONT face=宋体>对软件功能复用，需要拥有良好的设计能力，过人的眼光。这对我们自身的要求也必然提高，也就需要从事软件开发的同事提升不断的自己。</FONT></SPAN></P>
<P>
<P align=left><SPAN lang=EN-US><SPAN><FONT face=宋体>4、</FONT><SPAN>&nbsp; </SPAN></SPAN><SPAN><FONT face=宋体>在构架的复用上，就需要我们的项目或者产品有一定的延续性，如果今天做工业控制，明天做流程管理，就很难，也没有必要做构架级的设计，所以对负责市场的同事们是个要求。</FONT></SPAN></P>
<P></P>
<P><FONT face=宋体>&nbsp;</FONT></P>
<P></P>
<P><FONT face=宋体>&nbsp;</FONT></P>
<P></P>
<P>&nbsp;</P>
<P></P>
<P><FONT face=宋体>&nbsp;</FONT></P>
<P></P>
<P><FONT face=宋体>&nbsp;</FONT></P>
<P></P>
<P><FONT face=宋体>&nbsp;</FONT></P></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><img src ="http://www.cnblogs.com/Kane/aggbug/236785.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42132/" target="_blank">[新闻]Google 10周岁生日</a>]]></description></item><item><title>Ajax.Net之入阶篇</title><link>http://www.cnblogs.com/Kane/archive/2005/08/19/218358.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Fri, 19 Aug 2005 04:09:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2005/08/19/218358.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/218358.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2005/08/19/218358.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/218358.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/218358.html</trackback:ping><description><![CDATA[<P>前两天写了那篇Ajax.Net的体会，有朋友问题这个东东应该怎么配置，代码应该怎么写。其实在它的example里面有一个QuickGuide.txt说的比较清楚，但是我还是这里来根据我的亲身体验来一步一步的演示一下。我的开发环境是Windows XP SP2，VS.Net 2005 Beta2。</P>
<P>首先到<A href="http://ajax.schwarz-interactive.de/download/AjaxSample.zip">http://ajax.schwarz-interactive.de/download/AjaxSample.zip</A> 下载Demo包，或者在这儿<A href="http://ajax.schwarz-interactive.de/download/ajax.zip">http://ajax.schwarz-interactive.de/download/ajax.zip</A> 直接下载ajax.dll。</P>
<P>1、在VS.Net中新建一个Web Project，引用ajax.dll。<BR>2、修改web.config，在里面增加<BR>&lt;configuration&gt;<BR>&nbsp; &lt;system.web&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;httpHandlers&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" /&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/httpHandlers&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp; ...<BR>&nbsp; &lt;system.web&gt;<BR>&lt;/configuration&gt;<BR>这是利用HttpHandlers来动态生成Javascript用的。</P>
<P>3、我们新建一个实现业务逻辑的类，并在里面增加一个方法。<BR>public class class1<BR>{<BR>&nbsp;[Ajax.AjaxMethod()]<BR>&nbsp;public int ServerSideAdd(int firstNumber, int secondNumber)<BR>&nbsp;{<BR>&nbsp;&nbsp;return firstNumber + secondNumber;<BR>&nbsp;}<BR>}<BR>4、在default.aspx.cs的Page_Load事件中增加一行<BR>&nbsp;&nbsp;&nbsp; protected void Page_Load(object sender, EventArgs e)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.Utility.RegisterTypeForAjax(typeof(class1));<BR>&nbsp;&nbsp;&nbsp; }<BR>5、在default.aspx页面文件中，写上这如下Javascript代码<BR>&lt;script&gt;<BR>function f1(a,b)<BR>{<BR>&nbsp; alert(class1.ServerSideAdd(a,b).value);<BR>}<BR>&lt;/script&gt;<BR>意思是调用class1的ServerSiderAdd函数，并显示出来<BR>6、在页面中再增加一个链接来触发这个函数<BR>&lt;a href="javascript:f1(2,3);"&gt;calculate&lt;/a&gt;&lt;br&gt;<BR>好，现在编译运行一下看看。当你点击页面上的&#8220;calculate&#8221;链接时，是不是如你所愿的出现了5？<BR>而这一切都是后台计算，并且浏览器页面没有刷新。</P>
<P>后记：<BR>如果所有步骤做完，你会在生成页面的源代码中发现如下代码：<BR>&lt;script type="text/javascript" src="/WebSite1/csharpwrapper/common.ashx"&gt;&lt;/script&gt;<BR>&lt;script type="text/javascript" src="/WebSite1/csharpwrapper/class1,App_Code.94psvga2.ashx"&gt;&lt;/script&gt;<BR>你可以把这两个script下载并打开看看，Ajax.Net到底在里面做了些什么，而有如此神奇的功能。<BR></P><img src ="http://www.cnblogs.com/Kane/aggbug/218358.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42131/" target="_blank">[新闻]祝Google 10周岁生日快乐</a>]]></description></item><item><title>OPC在自控系统的应用</title><link>http://www.cnblogs.com/Kane/archive/2004/09/22/45629.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Wed, 22 Sep 2004 10:24:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2004/09/22/45629.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/45629.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2004/09/22/45629.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/45629.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/45629.html</trackback:ping><description><![CDATA[<DIV><IMG src="http://www.opcfoundation.org/images/opc_logo.gif" onload="javascript: img_auto_size(this,450,true);">这段时间一直在做工业自动控制方面的项目，PLC使用的是<A href="http://www.ad.siemens.de/simatic/portal/html_76/produkt.htm" target=_blank>Siemens</A>，当时上位机用的是Siemens的<A href="http://www.ad.siemens.de/hmi/html_76/products/software/wincc/index.htm" target=_blank>WinCC</A>，其使用的改的不伦不类的C，让我实在无法忍受，缺少事件驱动，简直不能称之为现代软件。在Siemens的<A href="http://www.ad.siemens.com.cn/club/bbs/" target=_blank>BBS</A>上潜水多日以及跟北京的工程师浪费无数口水之后，终于找到了我认为是将来自控软件应用的方向，<A href="http://www.opcfoundation.org/" target=_blank>OPC</A>。</DIV>
<DIV>OPC分两大部分，一是OPC Server，一是OPC Client。OPC Server是基于DCOM的组件对象，负责连通PLC，类似一个Adapter，各个PLC厂家分别有针对自己PLC的OPC Server，也有第三方提供的。</DIV>
<DIV>OPC Client其实只是根据OPC协议而自己实现的应用程序。目前有很多第三方厂商提供For .Net或者Delphi的OPC Client的Components。应用开发者只需使用组件读取OPC Server提供的数据即可。</DIV>
<DIV>所以OPC类似ADO所起的作用，只是分成了Client和Server而已。应用程序通过ADO可以方便的Connect各种数据库，而不必考虑连接的具体实现。同样的，只要配好了OPC Server至PLC的连接，应用程序的撰写者便无需考虑该调用什么Lib去连PLC，只需通过标准的OPC Client去连OPC Server即可。</DIV>
<DIV>OPC Client的Components厂商有很多，在<A href="http://www.opcconnect.com/" target=_blank>OPC Programmer's Connection</A>上有介绍，我本来用的是<A href="http://www.kassl.de/" target=_blank>Kassl</A>的dOPC，但只有trial的，附带源码的全套要500$，trial的使用起来也没什么不妥，只是程序启动时，会跳出一个提示框，以提醒你去它的网站看看。</DIV>
<DIV>结果有一天因为要用到工控界面组件，所以下载了<A href="http://www.iocomp.com/" target=_blank>ioComp</A>，结果意外的发现ioComp也实现了OPC的Client，看来即使在略显保守的工业控制行业，新技术以及标准化的步伐仍然是抵挡不住的。</DIV>
<DIV>
<DIV>&nbsp;</DIV>
<DIV>使用OPC的好处有如下几点：</DIV>
<DIV>1、因为通过OPC连接PLC，所以应用程序的开发可以使用任何开发工具，例如Delphi，C＃，VB等，而无需局限在PLC厂商提供的蹩脚的开发工具，从而降低程序员的学习成本和公司的用人成本。</DIV>
<DIV>2、由于OPC是一个Adapter，所以如果PLC发生了变化，上位机与PLC的互连只需更换一个OPC Server即可。</DIV></DIV>
<DIV>毫不夸张的说，OPC代表了下位机与上位机互连的方向，有了OPC，我们可以按自己喜好选择上位开发工具，生产力的提高是显而易见的。</DIV>
<DIV>&nbsp;</DIV>
<DIV>相关资料：</DIV>
<DIV>&nbsp;</DIV>
<DIV>西门子自动化：<A href="http://www.ad.siemens.de/meta/index_76.htm">http://www.ad.siemens.de/meta/index_76.htm</A></DIV>
<DIV>西门子中文论坛：<A href="http://www.ad.siemens.com.cn/club/">http://www.ad.siemens.com.cn/club/</A></DIV>
<DIV>OPC Foundation <A href="http://www.opcfoundation.org/">http://www.opcfoundation.org/</A></DIV>
<DIV>OPC Connection <A href="http://www.opcconnect.com/">http://www.opcconnect.com/</A></DIV>
<DIV>Kassl <A href="http://www.kassl.de/">http://www.kassl.de/</A></DIV>
<DIV>ioComp <A href="http://www.iocomp.com/">http://www.iocomp.com/</A></DIV>
<DIV>&nbsp;</DIV><img src ="http://www.cnblogs.com/Kane/aggbug/45629.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42130/" target="_blank">[新闻]Google十年市值达1500亿美元 创造奇迹</a>]]></description></item><item><title>再论软工</title><link>http://www.cnblogs.com/Kane/archive/2004/08/05/30430.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Thu, 05 Aug 2004 08:27:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2004/08/05/30430.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/30430.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2004/08/05/30430.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/30430.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/30430.html</trackback:ping><description><![CDATA[<DIV>刚才撇大条的时候，看到《程序员》杂志2004年第6期的一篇文章《银弹，中国造》，里面提及到软件开发的流水线问题。记得念大学的时候，也曾考虑过这个问题，但这篇文章配的插图，让我突然觉得，软件开发不可能实现流水线化。这幅插图是福特公司的汽车生产流水线，福特的流水线是划时代的管理产物，国内软件业欲说明软件开发流水线无不用此图。但是这幅图很清楚告诉我们，流水线上只能造一种产品，或者说按既定程序造固定模式的产品，即使是Dell的按单生产，它也只能生产出PC机而不是波音747。</DIV>
<DIV>那么我们的软件开发呢？难道我们是流水线，今天开发一套Win2000，明天再来一套Win2000？从这里看出，工业生产与软件生产有这本质的不同，工业生产是对同一产品进行重复的制造，而软件，是必须有创造性的，否则就没有开发新软件的必要了。我觉得软件开发应该跟制造流水线来类比，开发出来的软件本身是流水线，具体的业务人员是利用软件这套流水线进行作业。而我从来没有听说过可以流水线的开发流水线，因为这是创造性的劳动。</DIV>
<DIV>软件开发与生产流水线对比之我见：</DIV>
<DIV>
<TABLE style="WIDTH: 230px; HEIGHT: 108px" borderColor=#000000 cellSpacing=1 cellPadding=1 border=0>
<TBODY>
<TR>
<TD bgColor=#808080>软件开发</TD>
<TD bgColor=#00ffff>流水线开发</TD></TR>
<TR>
<TD bgColor=#808080>软件</TD>
<TD bgColor=#00ffff>流水线</TD></TR>
<TR>
<TD bgColor=#808080>构件</TD>
<TD bgColor=#00ffff>构造流水线的构件</TD></TR>
<TR>
<TD bgColor=#808080>UML</TD>
<TD bgColor=#00ffff>AutoCAD</TD></TR>
<TR>
<TD bgColor=#808080>软件使用者</TD>
<TD bgColor=#00ffff>流水线工人</TD></TR>
<TR>
<TD bgColor=#808080>...</TD>
<TD bgColor=#00ffff>...</TD></TR></TBODY></TABLE></DIV><img src ="http://www.cnblogs.com/Kane/aggbug/30430.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42129/" target="_blank">[新闻]GMail:回过头来支持IE6</a>]]></description></item><item><title>刷iPAQ为Linux（zz Hi-PDA）</title><link>http://www.cnblogs.com/Kane/archive/2004/07/15/24345.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Thu, 15 Jul 2004 01:49:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2004/07/15/24345.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/24345.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2004/07/15/24345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/24345.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/24345.html</trackback:ping><description><![CDATA[有段时间没上Hi-PDA了，几天上去一看，发现不少有趣的东西，转载一下。<BR>详细内容请看<A href="http://www.hi-pda.com/forum/viewthread.php?tid=188525&amp;page=1#pid1806722">http://www.hi-pda.com/forum/viewthread.php?tid=188525&amp;page=1#pid1806722</A><BR><img src ="http://www.cnblogs.com/Kane/aggbug/24345.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42128/" target="_blank">[新闻]Google十年大变样</a>]]></description></item><item><title>博客圆的RSS怎么不能用呢</title><link>http://www.cnblogs.com/Kane/archive/2004/06/25/18596.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Fri, 25 Jun 2004 05:11:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2004/06/25/18596.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/18596.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2004/06/25/18596.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/18596.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/18596.html</trackback:ping><description><![CDATA[在NewsGator里面引用RSS的时候报&#8220;基础链接已关闭：无法连接到远程服务器&#8221;，这是什么原因啊，指点一下。<BR>请参看图片：<BR><IMG height=608 src="http://www.cnblogs.com/images/cnblogs_com/kane/error.JPG" width=1024 border=0><img src ="http://www.cnblogs.com/Kane/aggbug/18596.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42127/" target="_blank">[新闻]谷歌十年创新路</a>]]></description></item><item><title>TAPI的使用</title><link>http://www.cnblogs.com/Kane/archive/2004/06/24/18326.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Thu, 24 Jun 2004 07:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2004/06/24/18326.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/18326.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2004/06/24/18326.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/18326.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/18326.html</trackback:ping><description><![CDATA[最近写一个小程序，很简单，就是从邮件服务器上获取信件，并根据信件的内容电话通知用户。本来用语音卡做过，提供专用的API函数，结果用户要节约成本，希望用Modem来代替，上网搜了一把，发现<STRONG><A href="http://sourceforge.net/projects/tpapro">TurboPower Async Professional</A></STRONG>被开源了，真是狂爽，拖下来用了再说，源码嘛，以后再慢慢研究，嘿嘿。<img src ="http://www.cnblogs.com/Kane/aggbug/18326.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42126/" target="_blank">[新闻]十年回顾：Google的互联网经济</a>]]></description></item><item><title>开天辟地第一篇！</title><link>http://www.cnblogs.com/Kane/archive/2004/06/21/17531.html</link><dc:creator>kane</dc:creator><author>kane</author><pubDate>Mon, 21 Jun 2004 06:03:00 GMT</pubDate><guid>http://www.cnblogs.com/Kane/archive/2004/06/21/17531.html</guid><wfw:comment>http://www.cnblogs.com/Kane/comments/17531.html</wfw:comment><comments>http://www.cnblogs.com/Kane/archive/2004/06/21/17531.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Kane/comments/commentRss/17531.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Kane/services/trackbacks/17531.html</trackback:ping><description><![CDATA[本来一直很敬仰博客堂的，好似拜伦想进法国的名人堂一般，还是被踢到博客园来了<IMG src="http://www.cnblogs.com/Emoticons/wink_smile.gif">。既然来了就开篇一贴吧。<BR>如果从高一写程序算起，现在也算写了十一年的程序了，有着程序员的通病，什么都喜欢搞一搞，只是最近dotNet的东西搞的多一些。不过个人重点的兴趣在构架的设计上，平时也爱看哲学，经济类书籍，有机会希望能多多的交流，谢谢大家。<img src ="http://www.cnblogs.com/Kane/aggbug/17531.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42123/" target="_blank">[新闻]Google 10周年大事记</a>]]></description></item></channel></rss>