2005年07月07日


VS.NET 学习方法论——tuenhai的 VS.NET 学习之旅


作者: Tuenhai.com  Email: king#tuenhai.com QQ:83087

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


题记 : 即使你没有一点编程经验,只要你愿意,并理解本文介绍的学习方法,你也可以象作者一样轻松、愉快地步入程序设计之门。让我们一起开始激动人心的 VS.NET 之旅。

一.通过 Internet 获取知识的能力是网络时代最重要的能力

  在 26 岁的时候,给自己定下目标, 35 岁之前必须掌英语和程序设计。至今刚过而立,程序和英语都学得不怎么样,对学习方法倒是有所体悟,愿与大家分享。

   在此先介绍一下tuenhai的情况。26岁前主要从事语文教学,对计算机及英语可以说一窍不通。说出来可能让您笑话:计算机不会上网;英语不认识音标。tuenhai这人水平虽然不怎样,志向却比天高,下决心改变自己,说干就干,花7000大洋购来电脑,开始自学计算机。26岁,人生翻开新篇章。
   首先把自家电脑来个开膛破肚,把硬件拆了装,装了拆(可怜tuenhai的主板,修了几次,还是报废;显卡由于带电插拔烧断了“脚”,还是手机店的朋友帮忙焊接上的)。为了从网上快速查找到需要的教程文章,忍痛每月花100大洋窄带包月,想当时Down个X片足足用了两天两夜,结果下集只有声音没有图像,还把他听完,呜乎!
   tuenhai一向提倡在工作中学习,学的东西要和工作相关,工作和学习互相促进。做语文教师虽也可以自学计算机,但tuenhai觉得进程太慢了(那时tuenhai所在学校还未设计算机课程)。于是,刚学计算机不到半年的人“一不小心”就成了电脑教师。还好基本是入门级培训,不过也逼着tuenhai学得更快。本来tuenhai是用拼音加加输入法的,因为工作关系,只好改用五笔。全国计算机等级考试要考DOS,于是又学了DOS。本来用FrontPage做网页,现在改用Dreamweaver MX,还有FireWorks MX,Flash MX也懂一点。对着主板随机手册和英文词典尝试几次,开机CMOS也可以进出自如。什么系统优化,GHOST系统备份都不在话下。做的网页虽然界面不怎么样,IP日访问量却是每天300以上。直到29岁,对Windows应用编程却还是一点不懂,VB6删了装,装了删,反复几次,觉得很难,始终未跨过编程第一道门槛。

   前日跟在嵊州信息港工作的 MM 交流,言及在自学 Visual Studio .NET 程序设计, MM 问:你在闭关学习吗?tuenhai回答 : 你 ” 赞助 ” 学费的话tuenhai也许会考虑考虑。是的, 网络是所大学,最大的大学,网络可以改变世界,终将改变世界。网络更可以改变人生,可以让我们的学习生活无比精采,只要你懂得利用,善于利用。 现在已是网络时代,网络交流基本弥补了自学的不足,通过网络交流、学习更有学校教育所没有的优势。
   你看到这里,如果你没有接触过程序语言,想了解一下 Visual Studio .NET 是个什么 ” 东东 ” ,你会如何做?
   第一,查手头书籍。个人开个计算机图书馆是不现实的,要查找的知识往往在手头书籍中找不到;
   第二,打电话问朋友。朋友懂不懂是个问题,即使懂,他有没有空?他有空,他不清楚你这边的实际情况,他说的并不一定是你想要的,或者他说的你不一定听得懂;
   第三,上图书馆查资料;
   第四,上书店;
   第五,跑去问老师;
   第六, ……
是的,传统是这么做的。但现在是网络时代了。你完全可能在不到一分钟之内找到你想要的答案。上网,打开 Internet Explorer ,在地址栏输入 http://www.google.com ,然后回车,在打开的页面中间输入框中敲入
Visual Studio .NET 语言
注意中、英文中间有个空格。然后再回车,页面显示:


约有 66 900 项符合 Visual Studio .NET 语言 的查询结果,以下是第 1 - 10 项。 (搜索用时 0.12 秒) 


怎么样,还用tuenhai给你介绍 Visual Studio .NET 是什么东东吗。你就尽情地点击文章标题,查看您需要的知识吧。

“ 软件是一个过去的时代, Web Service 将要来临。 ” 微软高级副总裁李开复说, ”Web Service 本身可以说是一个赌博,一个风险 ; 因为你可以相信,也可以不相信这件事情的发生。tuenhai只能说微软把整个公司都赌下去了,我们赌的未来就是 Web Service 。 ”

  你可不要告诉tuenhai你比盖茨厉害多了。我们追求超越盖茨不一定现实,但我们可以早一步接触网络,利用网络。

 

  二.学习编程的过程中,既要善于向高手寻求帮助,更要乐于指导初学者。在交流中学习编程,其乐无穷

29 岁,开始从事企业管理工作。由于工作的关系,要用到 Microsoft Office 办公软件, Office 办公软件中有个 Visual Basic For Application ( VBA )语言,是 VB 的一个子集,具备 VB 的所有优点,内置于 Office 中,只能在 Office 中创建、编程和运行,可以录制宏并自动转换为代码。由于初次接触编程语言,感到自学 VBA 有难度。每逢在学习中遇到难题、困惑的时候,tuenhai就到会到网上寻找学习资源,寻找答案。很快就找到关于 Microsoft Office 的极好社区,如 OfficeFans(http://www.officefans.net) ExcelHome(http://club.excelhome.net/) ,于是立即在社区注册名字,学习 VBA 时中碰到疑问就到社区去问,每次都有网友热心解答。
   比如tuenhai的工作需要经常在 Excel 工作表第十行前插入空白行,要先选取工作表,鼠标指针定位到指定行,然后单击右键,选 ” 插入 ” 。重复操作,不胜其烦。于是在 OfficeFans 提问,经版主 kengzeng 指点,得到如下 VBA 代码:

Sub insert()
Sheets(“sheet2”).Rows(“10:10”).Insert
End Sub

原来要四步操作,现在一按快捷键就完成了。tuenhai原来并不懂 VBA ,对 ” 集合 ” 、 ” 对象 ” 、 ” 方法 ” 、 ” 属性 ” 、 ” 事件 ” 、 ” 枚举 ” 等编程概念也不甚了了,但由于有网上高手的指点、帮助,tuenhai仍旧可以在工作中应用 VBA ,多次应用下来,用到的一些 VBA 代码不去死记也差不多会背了,对 VBA 的一些概念、理论开始有所了解。

   万事开头难。学习一开始碰到难题,如果解决不掉,就可能从此放弃学习了,如果这时有热心人解答他的疑问,然后在实际中立即可以应用新知识,新知识得到了即时巩固,学习的兴趣得到激发和增强,学习就得以继续和深化。当然,对于有 ” 悬梁刺股 ” 精神的朋友,自己看书刻苦钻研也可能会解决所有疑难问题,但那毕竟是极少数,多数人是象tuenhai这样的普通人。

   来而不往非礼也。在网上得到诸多大侠的指点,总感到好像欠了谁什么似的,就想到编一本电子书,把常见的 Excel VBA 学习教程集中到一起,可以帮助初学者快速入门。 2003 年 6 月较空闲,刚好自己对 Html 语法也懂一点,就花了二周的时间,搜集整理了一本电子书,叫《 Microsoft Excel 23天通关学习教程http://www.sharebank.com.cn/soft/soft_view.php?id=11659 ,其中重点内容是 Excel VBA 。把电子书放到 OfficeFans 上供网友下载,极受欢迎。tuenhai为什么编这本电子书呢?真的是比较空闲的缘故?有空去泡 MM 不是很好,何必去做枯燥的文字整理工作,其实tuenhai是存有 ” 私心 ” 的?

   什么 ” 私心 ” ?助人即助己。 ” 佛 ” 渡人其实也是为了渡己啊。tuenhai为了领悟这个道理,诸子百家,佛道儒易医,无所不涉,并在生活中曲折浮沉,这样还是用了 ”30 年 ” 时间(太夸张了,一出生就 …… ?呵呵),各位比tuenhai聪明,应该早就明白此理。

   为什么助人即助己?
   在学术上帮助别人,指点别人,就要站在别人的角度考虑,思考别人的思考,打破了小tuenhai的思维局限。
从信息角度讲,个人自修,知识的附加信息量较小,而在帮助别人过程中,存在人与人的信息交流,在信息交流中,知识信息得到强化。
   举一个例子,小孩子生活在英语环境中, 3 岁即口语流利,而我们的学校教育,大学毕业,英语学了十多年,还是哑巴英语的大有人在,为什么?
   小孩子记一个单词或句子,是在和外界信息交流中记忆的,确切地说,小孩子记住了当时信息交流的情境,通过情境的自然记忆实现单词或句子的自然记忆。学习口语如此,学习编程何尝不如此呢?你在某个问题上指点过别人,你的记忆印象可能就特别深,如果是个人看书自学,对于某个问题当时虽然理解,但附助记忆的情境信息量很小,时间长了就容易遗忘。
   所以,在学习编程的过程中,多和别人交流,多向高手虚心求教,多指点初学者,是在人为创造学习情境,在情境中强化记忆,强化理解。
   李阳提倡 ” 疯狂英语 ” 学习法,tuenhai则提倡 ” 疯狂编程 ” 学习法,也就是创造一切机会和别人交流编程经验,从交流中进行强化训练和学习。但也要注意,交流是手段不是目的。
   交流编程经验的途径有很多:如论坛交流,媒体投稿, QQ 、 ICQ 等通讯软件交流。个人觉得 CSDN 为我们提供的 ”blog 专栏 ” 非常好,您可以一边学习编程,一边记下心得,通过个人专栏和大家交流。

VBA 是 VB 的应用分支,tuenhai在工作中应用 VBA ,并自然地对 VBA 的概念、理论有了初步了解,这时再去看 VB 的教程,就感到分外亲切。因为 VBA 和 VB 在本质上是没有区别的。tuenhai终于可以跨入 VB 编程之门了。


        三.从应用入手,从解决实际问题出发,在完成项目的过程中,逐步掌握程序设计理论与技巧

程序语言种类很多, Pconline 工具平台 就列有 VB/VB.NET 、 VC/C# 、 Delphi 、 Java 、 C++Builder 等。到底学什么语言好呢?在 Google 输入语言 比较,查到一篇文章《编程语言的宗教狂热和十字军东征》,第一段就是:
业余程序员最喜欢做的一件事就是对不同的语言进行比较。 Java 是否比 C ++好? C #是否会成为终极语言?凡此种种。从专业程序员的角度看来,这是最低级无趣的游戏。其一,在项目诸元确定之后,通常并没有选择语言的余地;其二,语言的生存本身就是一个达尔文主义的问题:设若两种语言有明确的可比较性,其中较劣的那一种必定早已被淘汰出局,又何来比较的必要?


   tuenhai基于两个原则选择程序设计语言:
其一,适合自己的就是最好的。
  其二,如果不知道什么适用自己,那么优先选择 Microsoft 的程序设计语言。
  tuenhai选的是 VB (每个人的具体情况不,tuenhai的选择不一定适合你),tuenhai目前只考虑开发普通 Windows 应用软件,并希望 Windows 应用软件的开发和 MicroSoft VBA 的应用互相促进,说穿了,是精力有限,最好是一种语言,到处应用。
   于是在网上 Down 了 N 多的电子书,收藏夹里 VB 网站一大堆。tuenhai发现,除了 CSDN , VB 社区论坛的人气大多不旺。

第一次接触 VB ,没有基础,业余自学,如何快速掌握 VB 程序设计?
如果tuenhai有足够的时间(业余自学,时间显然不足),有足够的耐心(恰恰tuenhai是耐心不那么足的人),可以按照教程一个一个控件学习、练习,这个过程无疑是有益的,但对tuenhai来说显然是过于枯燥的。或许如此下去,半年以后,tuenhai的 VB 基础比较好了,但可能不到半年,早就被tuenhai放弃。这就要另辟蹊径。tuenhai的设想是,一开始就定下一个软件项目,带着目的去学,以一个控件为核心,在完成项目的过程中,逐步掌握 VB 控件的使用和编程基本理论。项目基本完成的时候, VB 编程也就入门了。由于是带着项目去学,目的明确,学习过程就不会枯燥。如果你做共享软件,你的项目创意又比较好,你 VB 编程入之门之日,也许你的软件也就可以为你带来 Money 了,呵呵!
   开发一个什么样的软件呢? SUN 提出了激动人心的口号 :” 网络就是计算机 ” 。计算机的应用主要在于网络,于是定位于开发网络应用软件。tuenhai经常到网络社区论坛交流,注册时要一项项填写信息,发言时也要一项项填写信息,感觉很费时间,打算自己编程来实现自动注册,自动发言。  

2003 年 5 月学 VBA 时想用 VBA 实现在论坛自动注册和发言,实现起来有难度,就在网上找替代软件,找到了 ” 按键精灵 ” ( http://www.vrbrothers.com/cn/qmacro ) ,按键精灵是一个模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替您的双手,自动执行一系列鼠标键盘的动作。 觉得很不错,就编写了一个脚本,用按键精灵自动实现如下功能:打开 Internet Explorer ,输入并打开网址,移动鼠标到指定座标,输入字符,然后按回车完成注册 a 或发言。比起手工输入,用按键精灵省力不少,但是不同网站,输入框的座标不同,要手动抓取,有没有更方便的软件呢? 按键精灵社区 里有人讲到 EzScript ( http://ezscript.seed.cx/ ) 功能更多,试用后发现在 Windows XP 里反应不灵敏,再在 Google 狂搜,找到了 PCWorker ( http://www.pcworker.net ) 。 PCWorker 配合网络填表软件 FORMGHOST ,可实现双击注册或发言,需要的话,还可在标题加上随机数,而且 PCWorker 代码的可读性较强,且作者能及时听取网友意见对软件加以改进。
PCWorker 虽然好用,但要实现从网络中获取信息并作出判断(比如提取超链接),这是 PCWorker 类软件不能胜任的。于是决定用 VB6 来实现自己的想法。 2003 年 10 月开始学习 VB6 ,到 11 月,项目基本完成。tuenhai是怎么做的呢?

   首先浏览各 VB 网站有关文章,发现用 WebBrowser 控件能实现tuenhai所要求的功能。
   其次,大量搜集 WebBrowser 控件相关文章和代码。
    用 Google 搜寻。如用 ”WebBrowser” 为关键词搜索,共有 7 , 260 , 000 项查询结果 。
CSDN 论坛 搜索。导航到 http://expert.csdn.net/Expert/Forum.asp ,登陆论坛,点击 ” 搜索 ” ,选 ” 全部社区 ” ,用 ”WebBrowser” 为关键词,然后点击 ” 对选择的大类进行搜索 ” ,哇,有 300 篇有关 ”WebBrowser” 的帖子。
CSDN 文档 搜索,导航到 http://www.csdn.net/search.asp ,搜索框中输入 ”WebBrowser” ,选择 ” 文档 ” ,再单击 ” 搜索 ” 按钮,找到 57 篇 ”WebBrowser” 相关文档。
   在实际编程中遇到困难,还可以到 CSDN 论坛 提问,寻求帮助。tuenhai就曾在 CSDN 论坛 问了不下十个有关 WebBrowser 有关问题,并都得到了解答。

  由于善于运用以上三步, 1 个半月时间,tuenhai的软件基本出炉, VB 编程也已基本入门。

  在学习 VB6 的同时自然接触到 Microsoft Visual Studio .NET (简称 VS.NET )。在十年之前, Visual Basic 1.0 成为数以百万计的开发人员的革命性的应用程序开发语言。现在, Visual Studio .NET 为未来的十年做好了准备(有点象为 Microsoft 打广告,你说呢), VS.NE 是用于创建下一代应用程序的理想而又现实的开发工具,是一个从一开始就是为 XML Web 服务创建的开发环境。通过允许应用程序通过 Internet 沟通和共享数据, XML Web 服务使业务能够从 Internet 转换为用于集成和传送它们的核心商业价值的真正平台。 Visual Studio .NET 和 XML Web 服务提供简单、灵活、基于标准的模型,允许开发人员从新的和现有的代码汇编应用程序,而与平台、编程语言或对象模型无关。
VS.NET 2003 中主要有包含以下几种开发工具:
Visual Basic .NET 2003
Visual C# .NET 2003
Visual C++ .NET 2003
Visual J# .NET 2003

 有人说, ” 学习要面向未来 ” , 2003 年 12 月,tuenhai的主要开发工具从 VB6 转为 VB.NET , 2004 年 1 月 1 日 ,tuenhai把新开发的软件从 VB6 升级为 VB.NET ,并正式命名为“论坛发帖软件工具下载版”(又叫“论坛自动发贴软件”,“论坛自动发帖器”,“论坛批量发帖软件”,“论坛自动发贴工具”,“论坛快速发帖器”,“论坛发贴机”,“论坛快速发帖器”) ( 如果你要在网上推广你的产品,记得来找tuenhai ) 。

  在转向 VB.NET 的时候,tuenhai考虑:
   第一. VS.NET 的本质是什么?
VS.NET 是从一开始就是为 XML Web 服务创建的开发环境。通过允许应用程序通过 Internet 沟通和共享数据, XML Web 服务使业务能够从 Internet 转换为用于集成和传送它们的核心商业价值的真正平台。
学习要面向未来,就要学习最新的技术,现在的学习为将来的应用作铺垫。tuenhai的软件要突出两点,一是基于 Internet 的应用,二是要应用 XML 技术。这样,tuenhai就可以在应用中尽快掌握新技术,否则,只是为学习而学习,无疑会是比较枯燥,也容易遗忘。
   第二.原来用 VB6 写的”论坛发帖软件工具下载版”,主要用到 WebBrowser 控件,网页加载速度慢,会下载图片, Flash 等许多不需要的东西,在 VS.NET 中可考虑用其他方法实现同样功能。
   在 CSDN 诸位朋友的帮助下,并参考许多资料,tuenhai的“论坛自动发贴机”已基本具备 .NET 特征。代码举例:

1. “论坛自动发贴机器”应用了 XML 技术
VB6 中, INI 文件通常用来保存系统信息、配置信息,读写 INI 文件要用到 API 函数,使用起来不是很方便。在 VS.NET 中,已经没有必要用 INI 文件来保存和读取一些信息了,可以改用 VS.NET 中的读写 XML 文件的类。而且,在 VS.NET 2003 的后续版本中,处理 XML 有关功能将得到进一步增强。
   读取 XML 到 DataGrid 代码:

Public MyXMLDataSet As New DataSet(“XMLDataSet”)
‘ DataSet 是数据的一种内存驻留表示形式,无论它包含的数据 ‘ 来自什么数据源,它都会提供一致的关系编程模型。
MyXMLDataSet.ReadXml(“regid.xml”) ‘ 读入 XML 文件
form1.DefInstance.DataGrid1.DataSource = MyXMLDataSet ‘DefInstance 是 form1 的共享属性
strName = MyXMLDataSet.Tables(0).Rows(0).Item(“name”).ToString ‘    从 DataGrid 中读取用户名信息。



  从 DataGrid 更新信息到 XML 文件代码:

Dim MyXmlDataSet As DataSet
MyXmlDataSet = CType(DataGrid1.DataSource , DataSet) ‘ 类型转换
MyXmlDataSet.WriteXml(“regid.xml”) ‘ 把信息写入 XML 文件



如果不用 DataGrid 控件,读写 XML 文件中特定信息可以更简单:

Dim xmlInfo As New XmlDocument
xmlInfo.Load(“info.xml”) ‘ 载入 XML 文件
Dim str As string=xmlInfo.Item(“RegInfo”).Item(“name”).InnerText ‘ 用 ”Item” 可以逐级往下读数据
xmlInfo.Item(“RegInfo”).Item(“pass”).InnerText=“MyPass”
xmlInfo.Save(“info.xml”) ‘ 保存信息到 xml 文件


   tuenhai原来打算用 INI 格式来保存“论坛自动发帖机”的注册信息和发言信息,但是,一则读写 INI 不是很方便,二则 XML 在软件开发中越趋重要,于是一开始就用 XML 文件来保存有关信息。在刚接触 VS.NET 时本不知 XML 为何物,现在可自如在“论坛发贴软件工具”读写 XML ,是否有点 ” 高手 ” 的感觉呢?(陶醉一下先)

2. HttpWebResponse 相关类 GET POST 信息
   用 GET 方式读取网页源代码:

Dim httpReq As System.Net.HttpWebRequest ‘HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
Dim httpResp As System.Net.HttpWebResponse
Dim url as String=“ http://www.Tuenhai.com  ’tuenhai的小站
Dim httpURL As New System.Uri(url)   
httpReq = CType(WebRequest.Create(httpURL) , HttpWebRequest)
httpReq.Method = “GET”
httpResp = CType(httpReq.GetResponse() , HttpWebResponse)
Dim reader As StreamReader = _
New StreamReader(httpResp.GetResponseStream , System.Text.Encoding.GetEncoding(“GB2312”)) ‘ 如是中文,要设置编码格式为 ”GB 2312” 。
Dim respHTML As String = reader.ReadToEnd() ‘respHTML 就是网页源代码
httpResp.Close()



向服务器 POST 信息:

Dim httpUrl2 As New System.Uri(“ http://www.Tuenhai.com ? ” & “name=1&pass= 6” ) ‘ “&” 号后面是 ‘ 注册信息,改成你自己的
Dim req As HttpWebRequest
req = CType(WebRequest.Create(httpUrl2) , HttpWebRequest)
req.Method = “POST”
req.ContentType = “application/x-www-form-urlencoded”
Dim bytesData() As Byte = System.Text.Encoding.ASCII.GetBytes(“name=1&pass= 6” )
req.ContentLength = bytesData.Length
Dim postStream As Stream = req.GetRequestStream()
postStream.Write(bytesData , 0 , bytesData.Length) ‘ 以上为向网络服务器 POST 信息

Dim res As HttpWebResponse = CType(req.GetResponse() , HttpWebResponse)
Dim reader As StreamReader = _
New StreamReader(res.GetResponseStream , System.Text.Encoding.GetEncoding(“GB2312”))
Dim respHTML As String = reader.ReadToEnd() ‘respHTML 为 POST 后网络服务器返回的信息
MsgBox(respHTML) ‘ 可用 MsgBox 查看返回的信息
res.Close()



3. 用正则表达式从网页源代码中提取网址
   得到网页源代后,我们可以对源代码进行处理,比如提取其中的链接, Email 地址,图片地址, Flash 等等,这在论坛自动发贴软件工具中很有用。

Dim r As System.Text.RegularExpressions.Regex
Dim m As System.Text.RegularExpressions.MatchCollection
Dim respHtml As String = “http://www.NETsh.Net/subdomains/f_s_o.php?leibie=shangmao” ‘ 以这个地址举例
strRegex = “http://([\w]+\.)+[\w]+(/[\w.?]+)+leibie[=]{1}[\w]+” ‘ 用这个正则表达式可以提取上面地址。通用 ‘ 的提取链接正则表达式为 ”http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?” 。  
r = New System.Text.RegularExpressions.Regex(strRegex , System.Text.RegularExpressions.RegexOptions.IgnoreCase)
m = r.Matches(respHTML)
Dim i As Integer
For i = 0 To m.Count – 1
MsgBox(m(i).Value)
Next i



 四.掌握并利用大量网络资源来辅助 VS.NET 的学习,你将事半功倍。

现在tuenhai的“论坛自动发贴器下载版”已经用 .NET 全面改写,并用上继承,重载,多线程等,所有这些在 VB6 中能否实现,从 VB6 转到 .NET 是否明智?

   从 2003 年 10 月开始学习 VB6 编程, 11 月半用 VB6 完成第 1 个软件——“自动发帖工具下载版”,到 2004 年 1 月 17 日 用 VB.NET 技术改写“论坛发贴工具下载版”。可算基本入门。原来没有一点编程基础,全部用的业余时间,没有当面请教一个老师。如果学得还算顺利的话,很大部分要归功于掌握并利用大量网络资源。下面列出tuenhai所掌握的 VS.NET 网络学习资源,有什么遗漏希望大家能指出。
1.  微软技术支持
   在你学习 VS.NET 的过程中,有疑问首先要向 Microsoft 求助。如果你不懂得利用 Microsoft 提供的庞大的学习资源,tuenhai要告诉你,你舍近求远了。
   ( 1 )首先,你要安装 MSDN ,他比市面上所有的 VS.NET 书籍详细。tuenhai为了装 MSDN ,可是牺牲了tuenhai的 98 和 XP 双启动,改成 Windows XP 单系统。装了 MSDN 后,你要学习正则表达式, VS.NET 2003 中点击 ” 帮助 ” ,再点击 ” 搜索 ” ,然后输入 ” 正则 ” ,一回车,哇,找到 470 个主题,这下你慢慢研究吧。实在研究不透,也不用急,还有 Google CSDN 呢。
   ( 2 )在线 Microsoft .NET 框架 SDK 快速入门教程( http://chs.gotdotnet.com/QuickStart ) ,可配合 MSDN 使用。
   ( 3 ) 微软中国社区( http://www.mscommunity.com/Profile/ ) 。在社区注册,有问题就到社区去提问吧。
( 4 )在线 中文 MSDN ( http://www.microsoft.com/china/MSDN/default.asp ) ;在线英文 MSDN ( http://msdn.microsoft.com/ ) ,考考你的 E 文,不过有金山词霸在,tuenhai都不怕,你还用怕什么呢!

为什么选择 VS.NET ,为什么看好 VS.NET ,看看 Microsoft 的 Help 文档有多详尽就知道了。如果你不去利用 Microsoft 提供的庞大的 Help 资源,是不是有点对不起盖茨呢!  

2. CSDN http://www.csdn.net/
CSDN 号称中国最大的开发者网络,确实不假。tuenhai最常去的是 CSDN 的
文档( http://www.csdn.net/develop/ )
论坛( http://expert.csdn.net/expert/forum.asp)
   只要你善于利用搜索功能,你在开发中遇到的许多问题可在 文档 论坛 中找到答案。如果你在开发过程中遇到疑难,而你又认为 Bill Gates 帮不上你的忙,那么,你就上 CSDN 吧,一定会让你满意的。
教你两个绝招,第一招,是 ” 搜索大法 ” 。遇到问题,首先是在 CSDN 的 文档 论坛 进行搜索,看有无类似答案。如不行,再下一招。
第二招, ” 提问大法 ” ,只要有礼貌有诚意地在论坛提问,一定有许多人乐于回答你的问题。

3.  其他相关网站、专栏
有不少网站开辟 VS.NET 专栏,常去看看,必有收获。
太平洋开发特区 ( http://www.pconline.com.cn/pcedu/empolder/net/ )
网猴教程连载 http://act.it.sohu.com/book/slist.php?class1=6
天极 的 Visual Studio.NET 专栏( http://www.yesky.com/SoftChannel/72342380467978240/index.shtml )
赛迪的 NET 专区( http://tech.ccidnet.com/pub/column/c340.html
CSDN 上 Latitude 的 VS.NET 专栏( http://www.csdn.net/develop/author/netauthor/Latitude/ )
孟宪会之精彩世界( http://xml.sz.luohuedu.net/xml/ )
博客园( http://www.cnblogs.com/

.net 博客( http://dotnet.mblogger.cn
博客堂( http://blog.joycode.com/

北京希望电子出版社图书素材资料下载 (http://www.b-xr.com/bbs.htm )
清华大学出版社 VS.NET 源码下载 (http://www.wenyuan.com.cn/soft_index.asp)

还有tuenhai的小站 http://www.Tuenhai.com

4.  国外编程学习资源
如果你的 E 文不错,不妨上 E 文网站去取经。  
http://www.startvbdotnet.com
http://www.vbdotnetheaven.com
http://www.vbaccelerator.com
http://www.vbcity.com/
http://searchvb.techtarget.com/
http://www.vbwire.com/
http://builder.com.com
http://www.developer.com
http://www.codeproject.com

http://www.dotnetjunkies.com
http://www.planet-source-code.com/

http://www.a1vbcode.com/

http://www.freevbcode.com/

http://www.vbcode.com/
http://sourceforge.net/
http://www.syncfusion.com/FAQ/WinForms/
http://www.123aspx.com
http://panopticoncentral.net/
http://www.regexplib.com/
http://www.harding.edu/USER/fmccown/WWW/vbnet_csharp_comparison.html
http://www.only4gurus.com/v2
http://www.gotdotnet.com
http://www.programmersheaven.com/
http://www.aspnetpro.com
http://www.dotnetgenius.com/
http://www.devx.com/dotnet
http://www.devhood.com
http://www.devshed.com/
http://www.devarticles.com/
http://www.c-sharpcorner.com/
http://www.csharphelp.com/
http://authors.aspalliance.com/aldotnet/examples/translate.aspx

http://www.developerfusion.com/
http://www.dotnet247.com
http://www.codestudy.com

   当然,还有一个地球人都知道的,全球最大的知识仓库,tuenhai不说,你也早就应该知道的,那不是 http://www.google.com 又是什么!

                        http://www.Tuenhai.com
                             2004 年 12 月 12 日 星期日

 

    

  

 


Tuenhai简介:Tuenhai同学于中国古代传统文化有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN: king#tuenhai.com, QQ:83087
我的网站: http://www.tuenhai.com/

 

 

2005年05月17日


Windows程序设计之命名软件的策略


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


  

  关键词:命名软件,公司命名,免费命名,企业命名,品牌命名,街道命名,命名规则,产品命名,道路命名,命名学,如何给孩子命名,普通命名法,windows程序设计,面向对象的程序设计,程序设计基础     

  摘要:命名软件的三个思路:
  一. 从商业化角度命名软件
  二. 从用户角度命名软件
  三. 从软件推广角度命名软件 
    

  有许多事情,看来极小,实际极大。比如各种命名,在一开始就要考虑确定,但因为没有经验,加上不够重视,随便用了一个名称,到半途有了更多的经验,想换用更好的名称,就成了进退两难的事。人生不快事就是这么越积越多的。

  如果你要开发一个软件,技术上已经可以搞定,商业策划也没有问题,但软件名称却还没有最终确定,那么看看tuenhai这篇文章,绝对有必要。因为tuenhai无论从个人还是公司,都有此方面的经历,并有所心得。

  tuenhai 程序设计基础虽然不怎么样,对程序设计却有爱好,学的还是面向对象的程序设计。无他——编程是创造——上帝最大的能力,可以实现非常别出心裁的创意。

  tuenhai在业余学写小程序,业余嘛,时间精力肯定有所不足,为了提高自己的学习兴趣,我在进行windows程序设计的第一天就开始考虑软件商业化的问题。边写code边在理论上探索软件商业化的思路,期间也经常在相关论坛出没并参与交流,也写过自己的心得贴在网上,一些文章成为专业论坛的精华文章并被网上到处转载。
  
  写着写着,我猛然发现,原来我的软件命名有问题,不利于商业化。既然软件要商业化,那么,软件名,软件说明,软件网站莫不是要从商业化角度考虑。这是成功的奥秘。但我的软件已经在网上发布,要重改回来有点麻烦。呵呵,正应了本文第一段话。

  这就得到了命名软件的第一原则,软件命名当从商业化角度考虑。

  大原则知道了,那具体如何去策划和实施呢?有两种思路:
  一,我想在软件中灌输我的理念,并让用户接受。
  二,我知道用户需要什么,因此我就提供给用户什么。这就是pangshengdong所提倡的“需求分析法”。

  第一种思路是让用户来适应我,这样成功的可能性就比较小一点。一般用第二种思路,把握用户的想法,给用户想要东东。
  这各得到了软件命名的第二原则,命名软件当从用户角度考虑
  如何把握用户需求,有许多技巧和学问。这里tuenhai就不展开了。

  把第二种原则扩展
   1.现在流行什么,最多用户关心的是什么?
   2.如何起名方便用户称呼。如QQ,只有两个字母,且是重复的,对于中国这样存在天文级数超级菜鸟用户的国家来说,QQ确实是软件命名的典范。

  还有第三个原则,就是从有利于软件推广角度来命名软件。这方面我正在试验。好的命名,能省下不少软件推广费用。tuenhai有说过,一切决策都是围绕“利益最大化”进行的,tuenhai当然要对命名软件花功夫进行研究。

 

  

                                       2005年2月28日

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


WebBrowser控件捕捉DHTML事件


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

  原文:http://www.devx.com/vb2themax/tip/18798

  和其他控件一样,我们可以用WebBrowser控件来构筑Windows form应用程序。从工具箱中选择Windows 窗体控件组,单击“Microsoft Web 浏览器”,Visual Studio .NET 在后台使用AxImp.exe工具创建ActiveX 控件,控件名字为“AxWebBrowser”。在VB.NET中,不能直接使用COM组件,COM都是Unmanaged Code,在VB.NET中使用这些组件,必须完成从Unmanaged Code到Managed Code的转换。
   一般地,你可以像使用原来的WebBrowser控件一样,如call 方法,指定属性,捕捉事件等。
   有些事情并不是那么简单的。我们要捕捉页面事件,如当用户点击页面元素(如背景)时,引发页面元素的onclick事件。发果没有捕捉到事件,就要提升DHTML的等级,直到Document对象的最高层次。这样,我们就能捕捉到任何事件了。在VB6中,我们可以简单地用WithEvents关键词指定WebBrowser.Document到MSHTML.HTMLDocument。
   在VB.NET中,这个简单方法不再有效。因为ActiveX控件创建了两个接口,两个接口中使用了同样的方法名,导致出现运行时错误。所以,你必须明确指定Document对象使用的接口,并创建事件处理句柄(呵呵,tuenhai翻译得还不错吧)。

  以下是示例代码:

‘ IMPORTANT: this code assumes that you’ve added a reference to the
‘ Microsoft HTML Object Library type library

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
AxWebBrowser1.Navigate("http://localhost/default.asp")
End Sub

Private Sub AxWebBrowser1_NavigateComplete2(ByVal sender As Object, _
ByVal e As AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event) Handles _
AxWebBrowser1.NavigateComplete2
‘ must wait for this event to grab a valid refernece to the Document
‘ property
Dim doc As mshtml.HTMLDocument = DirectCast(AxWebBrowser1.Document, _
mshtml.HTMLDocument)

‘ Cast to the interface that defines the event you’re interested in
Dim docevents As mshtml.HTMLDocumentEvents2_Event = DirectCast(doc, _
mshtml.HTMLDocumentEvents2_Event)
‘ Define a handler to the onclick event
AddHandler docevents.onclick, AddressOf onclickproc
End Sub

‘ Notice that the signature of this event is different from usual, as it
‘ is expected to return a Boolean – if false the default effect associated
‘ with the event (for example, jumping to another page if the click is on
‘ an hyperlink) is canceled.

Private Function onclickproc(ByVal obj As mshtml.IHTMLEventObj) As Boolean
‘ an object on the page has been clicked – you can learn more about
‘ type and position of this object by querying the obj’s properties
‘ …
End Function

译者注:
   这是tuenhai的第一篇译稿。
   个人心得,近几日在国外有关程序设计网站转悠,得益良多。又想到书法学习的“取法乎上”。共享软件的出路在于走向国际。软件设计的学习又何尝不是这样呢?国际的学习资源相比国内的学习资源如何?
   English决不是障碍。tuenhai不相信自己的English会比您好。初中基础,加上金山词霸即指即译,足矣。
  
                                                             http://www.Tuenhai.com

                                   2004年5月16日

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


用VB.NET做个论坛发帖软件


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


  题记如果你经常泡各种论坛发表宏论,如果您想把您的软件在极短时间内提交到有关网站,如果您想把您的网站快速登陆各搜索引擎,如果您想做个论坛自动发贴软件,本篇文章可能对您有所帮助。

   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

                  不编程实现自动发帖                  

  不编程也能实现论坛自动发贴?
  答案肯定的。2003年10月前,tuenhai还未学习编程(VB6),但tuenhai已经实现论坛自动发帖器。虽然现在tuenhai已不用这种方法,但可能对有些朋友有用,还是在此介绍一下实现方法。
  实现原理是:借用模拟键盘、鼠标操作的软件,抓取输入框座标,然后模拟移动鼠标到指定座标,模拟键盘输入字符,模拟回车或点击相应位置完成自动发贴。当然,你得编写相应自动化脚本,虽有一点难度,但对于编程来说,应该是简单的。
  有三个模拟键盘、鼠标类软件,功能比较好,在《VS.NET学习方法论》http://www.Tuenhai.com/已经有所介绍。
  一. PCWorker(http://www.pcworker.net)
   PCWorker功能极多,更重要的是,PCWorker中的脚本代码都是看得懂的代码:

Press VK_F1 // 模擬按 F1 鍵
Press VK_CTRL+VK_F // 模擬按 Ctrl + F 鍵

  是不是不太难?

  二. “按键精灵”(http://www.vrbrothers.com/cn/qmacro)
  相对来说,按键精灵容易使用,但只有PCWorker的少部分功能。比如PCWorker可输出随机数,按键精灵就不行。
  按键精灵的脚本代码不太容易看懂,比如
  KeyPress 82 1
   您看得出按的是哪个键吗?

  三. EzScript(http://ezscript.seed.cx/)
  EzScript的功能也很多。但tuenhai在Windows XP下试用自动发贴时,没有反应。

   初学者建议使用按键精灵,进阶则用PCWorker。使用教程请参考作者网站。


                   用AxWebBrowser控件做论坛自动发贴软件

 
   AxWebBrowser控件即VB6中的WebBrowser控件。
   用AxWebBrowser做论坛批量发贴软件,使用时先添加对AxWebBrowser控件和MSHTML的引用。
   先Navigate到指定网址。然后用以下代码等待网页加载完毕:

Do While brow.Busy
  Application.DoEvents()
Loop

  然后调用发帖过程。

Public Sub fill()
  On Error Resume Next
  Do While brow.Busy
    Application.DoEvents()
  Loop

  Dim webDoc As Object = brow.Document.all
  Dim webTag As Object
  Dim lengthTag As Integer = webDoc.length – 1

  For countTag As Integer= 0 To lengthTag
    webTag = webDoc.item(countTag)
    Select Case Strings.LCase(webDoc.item(countTag).tagname)
      Case "textarea"     ’网页中的文本框
        Select Case webTag.name
          Case "body"   ’"body"来自网页源代码,不同网站很可能不同,你根据实际修改。下同。
            webTag.value = strBody   ’这是预先定义的值,下同。
         End Select

      Case "select"       ’网页中的下拉选择框
        Select Case webTag.name
          Case "month"   ’选择月份,这里略去年、日的选择,因为原理相同。
            webTag.all.item(1).selected = True  ’选择第一个值
         End Select

       Case "input"  ’网页中的输入框
        Select Case Strings.LCase(webTag.type)
          Case "text"     ’文本
            Select Case webTag.name
              Case "name", "userid", "nickname" ‘用户名
                webTag.value = strName
              Case "subject" ‘标题
                webTag.value = strSubject
              Case "regid" ‘注册码
                webTag.value = strRegid
              Case "username", "realname"
                webTag.value = strUsername
              Case "cardnumber"
                webTag.value = strCardNumber
              Case "homephone"
                webTag.value = strHomephone ‘电话号
              Case "url_title" ‘链接名称
                webTag.value = urlTitle
              Case "url"  ’链接
                webTag.value = url
              Case "email" ’email地址
                webTag.value = email
              Case "img"  ’图片  
                webTag.value = img
              Case "midi"  ’音乐
                webTag.value = midi
              Case "year"  ’年
                webTag.value = strYear
              Case "prompt" ‘找回密码提示问题
                webTag.value = strPrompt
              Case "answer" ‘找回密码答案
                webTag.value = strAnswer
            End Select
          Case "password"  ’密码
            Select Case webTag.name
              Case "passwd", "password", "confirm", "repasswd" ‘密码,确认密码
                webTag.value = strPass
            End Select
          Case "checkbox"  ’单选框
            Select Case webTag.name
              Case "emailme"  ’email通知tuenhai
                webTag.checked = True  
            End Select

        End Select

     End Select
   Next

  brow.Document.forms(0).submit()  ’许多网页表单,这一句简单代码即实现自动提交

End Sub
 

于是,主过程是这样:

Public Sub autoAdd()
  brow.Silent = True ‘不弹出窗口
  brow.Navigate("http://www.Tuenhai.com") ‘ tuenhai的小站为例
  Do While formBrowNetsh.brow.Busy  ’等待网页加载完毕
    Application.DoEvents()
  Loop
  Call fill()
End Sub

  以上代码可实现可视化自动注册和论坛自动发帖工具。
   还有几个问题有待解决:
   一. 有的网站要填上识别码数字才能注册或发言,如何用程序来实现自动识别识别码图片上的数字?
   二. 有的网站一进去就会跳出一个欢迎对话框,程序的运行就被暂停。
   三. 对于自动注册和发言来说,加载较慢的图片、Flash、音乐等并不是必需的。

  
              用HttpWebRequest类做论坛快速发帖器

  用HttpWebRequest类做论坛发贴机就简单多了。
  我们始终不能忘记,最好的教程是MSDN,在Microsoft Visual Studio .NET 2003“搜索”中敲入HttpWebRequest,抄来一些东东(事实上许多教程书籍都是从MSDN上抄的):
   命名空间: System.Net
   HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
   不要使用 HttpWebRequest 构造函数。使用 WebRequest.Create 方法初始化 HttpWebRequest 的一个新实例。如果 URI 的方案是 http:// 或 https:// ,则 Create 将返回 HttpWebRequest 实例。
   GetResponse 方法向 RequestUri 属性中指定的 Internet 资源发出同步请求并返回包含该响应的 HttpWebResponse 实例。可以使用 BeginGetResponse 和 EndGetResponse 方法对 Internet 资源发出异步请求。
   当要向 Internet 资源发送数据时, GetRequestStream 方法返回用于发送数据的 Stream 实例。  BeginGetRequestStream 和 EndGetRequestStream 方法提供对发送数据流的异步访问。  
   如果在访问 Internet 资源时发生错误,则 HttpWebRequest 类将引发 WebException 。 WebException.Status 属性是 WebExceptionStatus 值之一,它指示错误源。当 WebException.Status 为 WebExceptionStatus.ProtocolError 时, Response 属性包含从 Internet 资源接收的 HttpWebResponse
  

Shared Sub postData()
  Dim httpUrl As New System.Uri("http://www.Tuenhai.com?" & "name=yourName&pass=yourPass&cardnumber=yourCardNumber")
  Dim req As HttpWebRequest
  ’req.Timeout = 10000 ‘设置超时值10秒
  req = CType(WebRequest.Create(httpUrl2), HttpWebRequest)
  req.Method = "POST"
  req.ContentType = "application/x-www-form-urlencoded"
  Dim bytesData() As Byte =   System.Text.Encoding.ASCII.GetBytes(""name=yourName&pass=yourPass&cardnumber=yourCardNumber")
  req.ContentLength = bytesData.Length
  Dim postStream As Stream = req.GetRequestStream()
  postStream.Write(bytesData, 0, bytesData.Length)   ’以上向服务器post信息。

  Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse) ’以下获取服务器返回信息
  Dim reader As StreamReader = _
  New StreamReader(res.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
  Dim respHTML As String = reader.ReadToEnd()
    MsgBox(respHTML)  ’这就是向网络服务器post后返回的信息
    MsgBox(res.StatusCode.ToString)  ’向网络服务器post后返回的状态码
  res.Close() ’关闭

End Sub

  用AxWebBrowser控件做论坛发贴机留有三个问题,用HttpWebRequest类来实现,后二个问题都不复存在。而且,用HttpWebRequest类来实现论坛发帖器的速度要快得多。但是,同样的?
  有的网站要填上识别码数字才能注册或发言,如何用“论坛自动发贴机”来实现自动识别识别码图片上的数字?

  我们在主过程里加上线程,因为我们以后要用多线程做自动发帖机啊。用多线程做论坛自动发贴器在VB6中不好实现,在VB.NET中做自动发帖工具却不难。
 

Dim threadAdd As System.Threading.Thread ‘定义线程 
Public Sub threadAutoAdd()
  threadAdd= New System.Threading.Thread(AddressOf postData)  ’创建线程实例
  threadNetsh.Start()  ’开始线程
  ’别忘了在Sub postData()的最后加上threadAutoAdd.Abort()来关闭线程
  ’或者在这里加上判断Sub postData()完毕的代码,如果完毕就关闭线程
End Sub


  Visual Studio .NET 2003 是一个全面的开发工具,用于快速构建面向 Microsoft Windows? 和 Web 并连接 Microsoft .NET 的应用程序,是否极大地提高了我们的开发效率呢?

  


               http://www.Tuenhai.com
                 2004年1月24日

 

 

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


软件开发,创意是灵魂——用HttpWebRequest和正则表达式提取网页中的链接


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

  题记 : 提取网页链接有什么用?比如,你可以做网页地址搜集器,邮件地址搜集器,图片或Flash搜集器等等。如何用最高效快捷的方式提取网页中的链接地址,这正是本文所要探讨的。

提 取网页链接地址有多种方式。在VS.NET开发环境下,总的是通过两种方式:
   一.用AxWebBrowser控件。等网页加载完,然后提取其中的链接。
   二.不用AxWebBrowser控件的方式,先取得网页源代码,然后提取其中的链接。
   本人早先是用第一种方式,第一种方式要先等网页加载完毕,浏览器会下载许多无关的内容,速度较慢。因此,推荐用本文介绍的方式,用HttpWebRequest结合正则表达式取得网页中的链接。
   本文分以下几个步骤:
   用HttpWebRequest取得网页源代码
   用正则表达式取得链接地址
   去除重复地址
   保存为XML

用HttpWebRequest取得网页源代码

Dim url As String=" http://www.Tuenhai.com " ‘ 这是tuenhai的小站,有空来坐坐
Dim httpReq As System.Net.HttpWebRequest  
Dim httpResp As System.Net.HttpWebResponse
Dim httpURL As New System.Uri(url)
httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
httpReq.Method = "GET"
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
httpReq.KeepAlive = False ‘ 获取或设置一个值,该值指示是否与 Internet 资源建立持久连接。

Dim reader As StreamReader = _
New StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
Dim respHTML As String = reader.ReadToEnd() ‘respHTML就是网页源代码

  是不是很简单?
   对于概念的理解,在MSDN中有极详细的介绍,请在VS.NET 2003中点击“帮助”,再点击“搜索”,然后输入类名,如HttpWebRequest,一回车,就什么资料都有了。对于下面碰到的编程概念,如有不理解的,也请先搜索MSDN,不再重复说明。


用正则表达式取得链接地址

Dim strRegex As String = "http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?" ‘这就是表达式
Dim r As System.Text.RegularExpressions.Regex
Dim m As System.Text.RegularExpressions.MatchCollection
r = New System.Text.RegularExpressions.Regex(strRegex, System.Text.RegularExpressions.RegexOptions.IgnoreCase)   
m = r.Matches(respHTML)
Dim i As Integer
For i = 0 To m.Count – 1
     form1.DefInstance.ListBox1.Items.Add(m(i).Value) ‘form1.DefInstance是form1的共享属性和实例
Next i  
form1.DefInstance.ListBox.Visible = True ‘ 设置ListBox为可见
form1.DefInstance.ListBox.Sorted = True ‘ 对ListBox各元素进行排序

form1.DefInstance.ListBox1.Items.Add(m(i).Value) ‘form1.DefInstance是form1的共享属性和实例, 共享成员如果是方法或属性,我们不用创建实例就可以直接用‘类名 .共享成员’的方法进行调用。设置方法如下:

Private Shared m_vb6FormDefInstance As form1
Public Shared Property DefInstance() As form1
   Get
     If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then ‘判断窗体实例是否存在
       m_vb6FormDefInstance = New form1
     End If
     DefInstance = m_vb6FormDefInstance
   End Get
   Set(ByVal Value As form1)
     m_vb6FormDefInstance = Value
   End Set
End Property




去除重复地址

Dim countForms As Integer ‘以下代码去除重复地址
Dim lstForms() As String
Dim CurId As Integer
With formBrow.DefInstance.ListBox1
   ReDim Preserve lstForms(0)
   lstForms(0) = .Items(0) ‘新数组的第一项和list的第一项相同
   For countForms = 1 To .Items.Count – 1 ‘items.count得到list1中的项目数
     CurId = UBound(lstForms) ‘curid为newlist中有项目数
     If .Items(countForms) <> lstForms(CurId) Then ‘如果旧表第二项不等于新表最大项
       ReDim Preserve lstForms(CurId + 1) ‘定位到新表第二项
       lstForms(CurId + 1) = .Items(countForms) ‘新表第二项等于旧表第二项
     End If
   Next countForms
   .Ite ms.Clear() ‘删除旧表所有项
   For countForms = 0 To UBound(lstForms) ‘把新表写入旧表
     .Items.Add(lstForms(countForms))
   Next countForms
End With


            把地址导出为XML

可扩展标记语言 (XML) 是一种提供数据描述格式的标记语言。该语言使跨越多个平台进行更准确的内容声明和获得更有意义的搜索结果变得更加容易。此外,XML 实现了表示与数据的分离。例如,在 HTML 中,使用标记来告诉浏览器将数据显示为粗体或斜体;而在 XML 中,标记只用于描述数据,例如城市名、温度和大气压。在 XML 中,使用样式表(例如,可扩展样式表语言 (XSL) 和层叠样式表 (CSS))在浏览器中显示数据。XML 使数据与表示及处理分离开来,通过应用不同的样式表和应用程序,使您能够根据需要显示和处理数据。

  XML 是为在 Web 上传送而进行优化了的 SGML 的子集。它是由万维网联合会 (W3C) 定义的。该标准化确保了结构化数据的统一性和相对于应用或供应商的独立性。

  XML 是 Visual Studio .NET 和 .NET Framework 的很多功能的核心。XML 是可用于许多不同应用程序的格式,我们可将搜集到的链接保存为XML。
XmlTextWriter 是 XmlWriter 类的实现,该类提供将 XML 写入文件、流或 TextWriter 的 API。该类有许多验证和检查规则,以确保所编写的 XML 的格式正确。当与某些规则发生冲突时,将会引发异常,并且这些异常应该被捕获。XmlTextWriter 有不同的构造函数,每个函数指定写入 XML 数据的不同类型的位置。下面代码使用的是将 XML 写入文件的构造函数。
   首先使用 Formatting 属性指定正被编写的 XML 数据的格式。通过将此属性设置为 Indented,编写器使用 Indentation 和 IndentChar 属性缩进子元素。
   代码显示了与每个 XML 节点类型相对应的 XML 编写方法。例如,编写一个元素将调用 WriteElementString 方法,编写一个属性将调用 WriteAttributeString 方法。对于嵌套级别,可以使用 WriteStartElement/WriteEndElement 对;如果要创建较复杂的属性,则可以使用 WriteStartAttribute/WriteEndAttribute 对。
请注意代码如何使用 WriteStartDocument 方法编写带版本号“1.0”的 XML 声明。如果要让编写器检查该文档的格式是否正确(先是 XML 声明,序言中的 DOCTYPE,只有一个根级别元素,等等),您必须在调用任何其他编写方法之前,调用此可选的 WriteStartDocument 方法。接着,此代码调用 WriteDocType 方法编写名为“urls”的文档类型。WriteDocType 调用中的第三个参数指定编写器将编写 SYSTEM“urls.dtd”。编写完成后,XML 文件指示有一个要根据其进行验证的外部 DTD。

  最后,代码调用 Flush 方法将 XML 数据保存到文件,然后才调用 Close 方法。(虽然此示例确实只需要 Close 方法,但是也存在这样的情况,即需要保存所生成的 XML,并且需要重复使用编写器。)

  要检查 XmlTextWriter 的输出,可通过用 XmlTextReader 读取生成的文件来执行往返测试,以验证 XML 的格式是正确的。

Private Sub saveXml()
   Dim saveFileDialog1 As New SaveFileDialog
   saveFileDialog1.Filter = "xml|*.xml"
   saveFileDialog1.Title = "Save a xml File"
   saveFileDialog1.ShowDialog()
   If saveFileDialog1.FileName <> "" Then  ’如果文件名不等于空白
     Dim fileName As String = saveFileDialog1.FileName  
     If Not System.IO.File.Exists(fileName) Then  ’如果不存在同名文件

      Dim myXmlTextWriter As XmlTextWriter = New XmlTextWriter(fileName, Nothing)
       myXmlTextWriter.Formatting = System.Xml.Formatting.Indented  ’设置缩进
       myXmlTextWriter.WriteStartDocument(False)
       myXmlTextWriter.WriteDocType("urls", Nothing, "urls.dtd", Nothing)
       myXmlTextWriter.WriteComment("This file save the Urls")  ’注释
       myXmlTextWriter.WriteStartElement("urls")      ’开始元素
       myXmlTextWriter.WriteStartElement("url1", Nothing)  ’开始元素
       myXmlTextWriter.WriteAttributeString("now", Now)   ’在属性里记录时间
       For countAll As Integer = 0 To ListBox1.Items.Count – 1
         Dim title As String = Strings.Right(ListBox1.Items.Item(countAll), 3)  ’取URL后三字
         Dim body As String = lstMuLu.Items.Item(countAll)       
         myXmlTextWriter.WriteElementString(title, Nothing, body)
       Next
       myXmlTextWriter.WriteEndElement()   
       myXmlTextWriter.WriteEndElement()

      ’Write the XML to file and close the myXmlTextWriter
       myXmlTextWriter.Flush()
       myXmlTextWriter.Close()

     End  If
   End If
End Sub


软件开发,创意是灵魂

在软件开发实践中,真正让我们感到贫乏的,永远不会是技术,而是创意。
   创意,是软件开发的灵魂。
   随着开发工具的升级,进化,软件开发越来越象搭积木。我们更多的是学习开发工具的使用,而不是自己编写底层代码——许多底层代码,开发工具已经为我们代劳了。
这么说并不是tuenhai对软件开发有多精通。事实上,tuenhai从2003年10月开始自学编程(VB6),11月转到VS.NET。2004年1月,完成tuenhai的第一个软件 AdKing 。
只要学习方法得当,掌握技术并不是难事。这在tuenhai的第一篇VS.NET文章 《VS.NET学习方法论》 中有所论述。
   每个搞软件开发的人不妨自问一下(自然包括tuenhai了),自己在软件开发中的创意如何?你能保证通过你的创意已经把你所掌握的技术发挥得淋漓尽致了吗?你在每天大量编写CODE的同时,有多少时间用于思考创意?

以本文代码举例,发挥您的创意,可以编写多少个应用软件?
   这么说,并不是要您编写多少个应用软件。
   您能列出大量软件项目、方案,自然能从中挑选出适合您的最佳方案。
   一即是多。
   磨刀不误砍柴工。
   以《 用正则表达式取得链接地址 》为例,只要灵活改变strRegex表达式的值,我们可以从网页源代码中任意提取我们想要的东东。如果你要开发邮件地址搜集器,strRegex = " [\w-]+@([\w-]+\.)+[\w-]+ " 即可。如果要搜集Flash呢?
   如果您能列出50种方案,请来信告诉tuenhai。如果你列出的方案比tuenhai多,I fu le u,tuenhai拜您为师。



                                 http://www.Tuenhai.com


                                      2004年1月24日

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


用Socket类构建网页下载器


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


              什么时候用到Socket类
   Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。所谓“分层”,可以视为包含3个层次:请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于最底层——传输层。《用HttpWebRequest和正则表达式提取网页中的链接》http://www.Tuenhai.com/一文介绍了用请求/响应层来取得网页源代码。本文则用最底层的传输层来取得网页源代码。
  为什么要用Socket?或者什么时候要用到Socket?
  Socket 类为网络通信提供了一套丰富的方法和属性。 Socket 类允许您使用下面列出的任何一种协议执行异步和同步数据传输:

Ggp
网关到网关协议。
Icmp
网际消息控制协议。
Idp
IDP 协议。
Igmp 网际组管理协议。
IP 网际协议。
IPv6 网际协议 v6。
Ipx IPX 协议。
ND 网络磁盘协议(非正式)。
Pup PUP 协议。
Raw 原始 UP 包协议。
Spx SPX 协议。
SpxII SPX 版本 2 协议。
Tcp 传输控制协议。
Udp 用户数据文报协议。
Unknown 未知协议。
Unspecified 未指定的协议。

  当您需要开发功能复杂的网络程序时,您可能要用到Socket类。
  
  
              用Socket类取得网页源代码     
  先引入以下命名空间:

Imports System.Net
Imports System.Net.Sockets
Imports System.IO
Imports System.Text
Imports System.Text.Encoding

  tuenhai原来用C#来练习本文代码,C#严格区分大小写,且智能感知的功能显然不如VB.Net,代码虽然简洁了,但一开始不太适应。tuenhai想,MicroSoft真正主推的或许是VB.Net,不然为何不在C#中实现同VB.Net一样的智能感知功能?最终还是用VB.Net来写本文代码。

  初学者对Socket类的使用可能有点茫然,不要紧,先从简单的实例开始,实例调试成功,再去详细了解理论知识也不迟。

Private Sub btnHTML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHTML.Click
  Dim serverIP As IPAddress = Dns.Resolve("http://www.Tuenhai.com").AddressList(0)
  ’ Default Web Server Port = 80
  Dim Port As String = "80"
  Dim serverhost As New IPEndPoint(serverIP, Int32.Parse(Port))

  Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

  Try
    clientSocket.Connect(serverhost)

    If clientSocket.Connected = False Then
      MsgBox("Connect Error.", MsgBoxStyle.Critical, "HTTP")
      Exit Sub
    End If

    Dim httpReq As String = "GET / HTTP/1.0" & ControlChars.CrLf & ControlChars.CrLf

    clientSocket.Send(ASCII.GetBytes(httpReq))

    Dim buffer(1024) As Byte
    Dim byteCount As Int16 = clientSocket.Receive(buffer, buffer.Length, 0)

    txtHTML.Text = ASCII.GetString(buffer, 0, byteCount)

    Do While byteCount > 0
      byteCount = clientSocket.Receive(buffer, buffer.Length, 0)
      txtHTML.Text = txtHTML.Text & ASCII.GetString(buffer, 0, byteCount)
    Loop
  Catch ex As Exception
    MsgBox(ex.StackTrace.ToString(), MsgBoxStyle.Critical, "Exception")
  End Try
End Sub



  
网络资源:
Windows Socket 网络编程——套接字编程原理

Visual C#托管Socket的实现方法

C#网络编程初探

Visual C#.Net 网络程序开发-Socket篇


浅析C#中的套接字编程

                           http://www.Tuenhai.com
                2004年3月5日

 

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


用VB.NET和Excel排生产计划


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

                 企业信息化失败原因探讨

  中国企业上线ERP的成功率是不高的。这是为什么呢?
  实用的ERP系统有两个特征:
    1. 要求具有高度的定制性
    2. 要能根据企业实际随时修改ERP系统

  而现在企业的ERP系统开发基本采用外包模式,开发人员虽然也可以深入公司各个部门,掌握各个方面信息,然后进行定制开发。但是开发人员毕竟不是企业实际从业人员,掌握信息的广度、深度毕竟是有限的,因此,通常情况下,所开发的ERP系统难以保证第一个特征:要求具有高度的定制性。
  
   另一方面,企业的实际情况随时都可能发生变化,ERP系统也要随时修改,才可能随时满足企业的需求。如果说一开始,ERP系统是满足企业需求的,那么一年以后呢?当然开发人员也可以跟踪企业需求,随时修改ERP系统,但总归是不太方便。

  
                  理想的企业信息化模式

  个人认为,理想的企业信息化模式是这样的:
    1.企业信息化系统的开发应由企业内部人员进行,而不是外包
    只有这样,实用的ERP系统所要求的两个特征:要求具有高度的定制性; 要能根据企业实际随时修改ERP系统就很可能两者都具备了。
    2.企业信息化要从实际工作需要出发,逐步推进
   公司实际从业人员(兼开发人员)从实际工作需要出发,开发出相应的信息化模块、功能,再逐步完善。
   现实中,许多企业开发的信息化系统功能很多,但又有多少人会用呢,最终是花架子而已。
  就象笔者所在单位,说大不大,说小不小,但要一开始推行信息化管理,是不可能的。企业各部门人员素质不一,是不可能被普遍接受的。

   要实现笔者所述理想的企业信息化模式,最大的困难是什么?
  最大的困难是是人才难得,特定管理人员要同时具备两种能力:管理能力和开发能力。这种人才并不是每个企业都能得到的。
   笔者虽然谈不上什么人才,但近几年从事的却是企业管理工作,并对信息化管理系统的开发亦略知一二。笔者就有可能亲身实践“理想的企业信息化模式”,并把有关经验与大家分享。

                  公司实际情况分析

  从2004年起,tuenhai主管公司的计划工作,包括制定并下发产品生产计划,自制件生产计划,外协件采购计划等。原来公司内一直用手写的方式,由于公司产品的型号较多,如果tuenhai也是用手工填写,计划一多,整天忙于机械式的写写算算,做不了什么事情。所以tuenhai考虑用电脑代替部分机械性的工作,tuenhai就可以腾出精力抓其他方面事情了。电脑可以辅助、代替tuenhai做哪些机械性的工作呢?
   比如,每一成品由零件组装而成,零件分自制件和外协件。每一产品由哪些零件组成是固定的。每个月的生产计划,都要分解成自制件生产计划和外协件采购计划,这个分解工作tuenhai决定交给电脑来完成。


                  程序开发模式分析   
                 
   用什么开发工具,用什么开发模式来实现所要求的功能呢?公司内暂时只有tuenhai自己运用,要实现的功能也不多,在一开始并没有必要用复杂的大型数据库系统。为方便信息共享,tuenhai决定用VB.NET调用Excel来实现功能模块。
   为什么用VB.NET而不用C#,因为Excel中有个VBA,其语法和VB.NET是近似的。而且,VB.NET和C#的区别主要是语法,而非功能。
  tuenhai现在只要求实现用程序自动安排《自制件生产计划》,这个功能不用VB.NET,单用VBA也能轻易实现。但是,考虑到以后可能的功能扩充、升级,还是用VB.NET。VB.NET是面向一代的开发工具,功能强大,而且调用EXCEL也很方便。
  不推荐用VB6,VB.NET的入门及初级应用并不难,为何还要去用早期版本,而不用最新版本,掌握最新技术呢!  
  

               用VB.NET和Excel排生产计划

   软件构思是这样的:
  先在EXCEL里定制好《自制件生产计划》的样表(模板),保存为自制件生产计划.xls,其中只有一个sheet:样表。在样表中设置好各种格式,填写好固定项。再新建一空白workbook,保存为2004年自制件生产计划.xls。
   新建一VB.NET应用程序,命名为生产计划报表。在窗体上放很少几个控件,如:几个文本框,用来输入产品数量;checkbox用来先选择是正式生产计划还是增补生产计划;另外用二个文本框用来输入计划时间和计划编号。
  点击button,程序打开自制件生产计划.xls和2004年自制件生产计划.xls,把样表copy到2004年自制件生产计划.xls,并自动在目标sheet中填写各自制件需要生产的数量。
  
  下面是实现代码及详细注释。注意,要先添加com引用Microsoft Excel Object Library,tuenhai的是office 2003,引用Microsoft Excel 11.0 Object Library。

 

Private Sub producePlan()
  Call killEXCEL() ‘调用杀死EXCEL进程过程

  ’以下代码判断用户填写信息是否完整,如不完整则提示信息并退出.
  If chkFormal.Checked = False And chkSubjoin.Checked = False Then
    MsgBox("是正式计划还是增补计划??", MsgBoxStyle.Critical, "请先选择计划性质")
    Exit Sub
  End If
  If txtDay.Text = "2004年月" Then
    MsgBox("什么月份的生产计划???", MsgBoxStyle.Critical, "请填写计划时间")
    Exit Sub
  End If
  If txt703.Text = Nothing Or txt909.Text = Nothing Or txt931.Text = Nothing Or txt932.Text = Nothing  Then
    MsgBox("请填写计划台数!", MsgBoxStyle.Critical, "计划台数填写不全")
    Exit Sub
  End If
  If chkFormal.Checked = True And chkSubjoin.Checked = True Then
    MsgBox("正式和增补两者只能选一!", MsgBoxStyle.Critical, "请重新选择计划性质")
    Exit Sub
  End If

  ’以下代码即是计算各自制件的数量,用中文来命名是免去代码注释
  Dim 涂氟龙面板703 As Integer = CType(txt703.Text, Integer)
  Dim 钛金面板909 As Integer = CType(txt909.Text, Integer)
  Dim 油磨不锈钢面板931 As Integer = CType(txt931.Text, Integer)
  Dim 油磨不锈钢面板932 As Integer = CType(txt932.Text, Integer)
  Dim 底盘24 As Integer = 涂氟龙面板703
  Dim 底盘22 As Integer = 钛金面板909
  Dim 底盘41A As Integer = 油磨不锈钢面板931
  Dim 底盘41B As Integer = 油磨不锈钢面板931
  Dim 水盘25 As Integer = 涂氟龙面板703
  Dim 水盘24 As Integer = 涂氟龙面板703
  Dim 水盘22 As Integer = 钛金面板909 * 2
  Dim 中心支架2 As Integer = 涂氟龙面板703 + 钛金面板909
  Dim 长支架931 As Integer = (油磨不锈钢面板931 + 油磨不锈钢面板932) * 2
  Dim 支架931U As Integer = 油磨不锈钢面板931 * 2
  Dim 支架932U As Integer = 油磨不锈钢面板932 * 2
  Dim 磁头抱攀 As Integer = (钛金面板909 + 油磨不锈钢面板931 + 油磨不锈钢面板932) * 2
  Dim 电池抱攀 As Integer = (涂氟龙面板703 + 钛金面板909 + 油磨不锈钢面板931 + 油磨不锈钢面板932) * 2
  Dim 三通抱攀 As Integer = 电池抱攀 / 2
  Dim 炉头垫片 As Integer = 电池抱攀 * 3

  ’定义一个数组,方便在EXCEL中循环写入数字,也可以放在EXCEL的VBA中实现
  Dim allNum() As Integer = _
  {涂氟龙面板703, 钛金面板909, 油磨不锈钢面板931, 油磨不锈钢面板932, _
  底盘24, 底盘22, 底盘41A, 底盘41B, _
  水盘25, 水盘24, 水盘22, _
  中心支架2, 长支架931, 支架931U, 支架932U, _
  磁头抱攀, 电池抱攀, 三通抱攀, 炉头垫片}

  Dim excelApp As New Excel.Application
  Dim excelBook As Excel.Workbook     ’自制件生产计划.xls
  Dim excelbook2004 As Excel.Workbook   ‘2004自制件生产计划.xls
  Dim excelWorksheet As Excel.Worksheet
  Dim planProperty As String        ’计划性质,是正式计划还是增补计划

  Try ‘建议用try方式捕捉错误,处理错误

    excelBook = excelApp.Workbooks.Open(Application.StartupPath & "\自制件生产计划.xls")

    excelbook2004 = excelApp.Workbooks.Open(Application.StartupPath & "\2004年自制件生产计划.xls")
    excelWorksheet = CType(excelBook.Worksheets("样表"), Excel.Worksheet)
    excelWorksheet.Copy(After:=excelbook2004.Sheets("sheet1"))
    ’把样表copy到<2004年自制件生产计划>workbook中sheet1的后面

    excelApp.Visible = True ‘设置工作薄为可视

    If chkFormal.Checked = True Then
      planProperty = "正式"
    ElseIf chkSubjoin.Checked = True Then
      planProperty = "增补"
    End If

  With excelbook2004.ActiveSheet ‘用with 简化代码
    .Range("D1").Value = txtDay.Text ‘计划时间
    .Range("C2").Value = "laoban公司" & txtDay.Text & planProperty & "采购计划" ‘计划依据
    .Range("C25").Value = Now.Date.Today.ToShortDateString ‘这就是制表日期
    .Range("F2").Value = txtNO.Text ‘计划编号

  End With
  For i As Integer = 0 To 18 ‘共19种自制件
    excelbook2004.ActiveSheet.cells(4 + i, 4) = allNum(i)    ’4+i是行号,第二个4是列号
  Next ‘循环把各自制件数填入<2004年自制件生产计划>中的活动工作表相应位置

  Catch ex As Exception ‘捕捉错误,并回收资源,显示错误
    excelBook = Nothing
    excelbook2004 = Nothing
    excelWorksheet = Nothing
    excelApp = Nothing
    GC.Collect(0)
    MsgBox(ex.ToString) ‘显示错误信息,以查找定位
  Exit Sub ‘出错就退出
  Finally ‘这里的代码一定会被执行到
    excelBook = Nothing
    excelbook2004 = Nothing
    excelWorksheet = Nothing  
    excelApp = Nothing
  GC.Collect(0)
  End Try
  MsgBox("已排好自制件生产计划,请查看")

  excelBook = Nothing
  excelbook2004 = Nothing
  excelWorksheet = Nothing
  excelApp = Nothing
  GC.Collect(0)

End Sub

 
  下面是杀死EXCEL进程的过程:

Private Sub killEXCEL() ‘为进程避免冲突,在调用EXCEL前先杀死现有EXCEL进程.
  Dim pProcess() As Process
  pProcess = Process.GetProcesses()
  Dim i As Integer
  For i = 0 To pProcess.Length() – 1
    If (pProcess(i).ProcessName = "EXCEL") Then
    pProcess(i).Kill() ‘关闭进程
    End If
  Next
End Sub

  更多内容在http://www.Tuenhai.com/

  以上代码非常简单,功能也很有限,但是很实用,以前都是用手工填写并计算的,现在全部自动实现。本来要半小时的工作,现在可以在5分钟内搞定。如果产品有变化,tuenhai可以随时修改程序,使程序始终满足企业需求。企业信息化就应该是这样,从很小的功能开始。
   也许老总一点不知道何为企业信息化,你可以展示给老总,看,以前要用半小时排计划,现在5分钟就解决,这也是属于企业信息化。
  昨天用了一个晚上时间写了以上代码,一个晚上只是一个晚上而已,以后可以省下多少时间?老总是经济第一的,要他掏腰包聘专业开发人员,或外委软件公司开发,总是要让老总割血,也是不太可能的事。tuenhai是管理人员,本身也懂一点编程,信息化从自身工作开始,不用老总多花一分钱,反而可以提高工作效率。而且,原来公司里只有极少懂产品的人有排计划的能力,现在用程序来实现,人人都会。
   中国的企业信息化,要么华而不实,更多企业是根本不知并不用。tuenhai在公司内进行企业信息化探索受诸多因素限制。无论如何,tuenhai会将tuenhai的经验与大家分享,大家共同来探索有中国特色的企业信息化之路。

                   http://www.Tuenhai.com

                                  2004年2月18日

 

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 

VB.NET结合EXCEL统计生产报表


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP



               用EXCEL做企业生产报表的理由

  Excel表格生成和公式设置十分强大便利,是一个强有力的信息分析与处理工具。特别是EXCEL的公式、函数、VBA语言,功能极其强大。tuenhai试用过其他电子表格软件,在功能上和EXCEL根本没有可比性。tuenhai为EXCEL的功能所折服,特别搜集整理了电子书——《Microsoft Excel教程(函数vba使用技巧)学习宝典》,放到网上供大家下载学习。欲助己,先助人,这也是tuenhai一贯的学习哲学。
  Visual Studio .NET也同样是MicroSoft的产品,Visual Studio .NET调用EXCEL做企业报表十分方便。
证明当时tuenhai选Visual Studio .NET作为首选开发工具是正确的。

  


                软件构思


  
  软件构思是这样的:
  先在EXCEL里定制好名为《统计表》的样表(模版),,在样表中设置好各种格式,填写好固定项。
  在窗体上放很三个控件,两个DateTimePicker控件,用来选择开始统计时间和结束统计时间。一个Button以启动程序。
  软件欲实现的功能是:点击Button1,自动查找符合日期符合日期范围的生产计划工作表,然后利用SortedList统计各个办事处的计划数量和未完成数量,及各个产品型号的计划数量和未完成数量。再把SortedList的数据读出写到《统计表》中。
  这里要注意的是,各个生产报表格式必须规范统一,因为程序是按照固定单元格位置读取数据的。

 

 

                SortedList类

  除了具备VB.NET调用EXCEL的基础知识外,本例主要用到SortedList类。
  SortedList类表示键/值对的集合,这些键和值按键排序并可按照键和索引访问。
  SortedList 是 Hashtable 和 Array 的混合。当使用 Item 索引器属性按照元素的键访问元素时,其行为类似于 Hashtable。当使用 GetByIndex 或 SetByIndex 按照元素的索引访问元素时,其行为类似于 Array。
  SortedList 在内部维护两个数组以将数组存储到列表中;即,一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为 DictionaryEntry 对象进行访问的键/值对。键不能为空引用(Visual Basic 中为 Nothing),但值可以。
  SortedList 的容量是列表可拥有的元素数。随着向 SortedList 中添加元素,容量通过重新分配按需自动增加。可通过调用 TrimToSize 或通过显式设置 Capacity 属性减少容量。
  SortedList 的元素将按照特定的 IComparer 实现(在创建 SortedList 时指定)或按照键本身提供的 IComparable 实现并依据键来进行排序。不论在哪种情况下,SortedList 都不允许重复键。
索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入 SortedList,同时索引会相应地进行调整。若移除了元素,索引也会相应地进行调整。因此,当在 SortedList 中添加或移除元素时,特定键/值对的索引可能会更改。
  由于要进行排序,所以在 SortedList 上操作比在 Hashtable 上操作要慢。但是,SortedList 允许通过相关联键或通过索引对值进行访问,可提供更大的灵活性。
此集合中的索引从零开始。
  [Visual Basic, C#] C# 语言中的 foreach 语句(在 Visual Basic 中为 for each)需要集合中每个元素的类型。由于 SortedList 的每个元素都是一个键/值对,因此元素类型既不是键的类型,也不是值的类型。而是 DictionaryEntry 类型。例如:
  Dim myDE As DictionaryEntry
  For Each myDE In mySortedList
  …
  Next myDE

 

                VB.NET结合EXCEL统计生产报表

 

  以下是实现代码,供参考。为方便初学者,tuenhai对部份地方加以注释。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
 DateTimePicker1.MaxDate = Date.Now
 DateTimePicker1.MinDate = #1/1/2004#
 DateTimePicker2.MaxDate = Date.Now
 DateTimePicker2.MinDate = #1/1/2004#
End Sub

 

Private Sub 灶具分析统计()

 Call killEXCEL()

 Dim excelApp As New Excel.Application
 Dim 佳尼2004灶具生产计划 As Excel.Workbook
 Dim 行号 As Integer = 1
 Dim 列号 As Integer = 1
 Dim 办事处计划数统计 As New SortedList
 Dim 办事处完成数统计 As New SortedList

 Dim 型号计划数统计 As New SortedList
 Dim 型号完成数统计 As New SortedList
 Dim 统计表 As Excel.Worksheet ‘

 Try
  佳尼2004灶具生产计划 = excelApp.Workbooks.Open("E:\my documents\生产计划\佳尼2004灶具生产计划.xls")
  统计表 = CType(佳尼2004灶具生产计划.Worksheets("统计表"), Excel.Worksheet)
  统计表.Cells(1, 3).value = DateTimePicker1.Value.ToShortDateString ‘统计开始日期
  统计表.Cells(1, 7).value = DateTimePicker2.Value.ToShortDateString ‘统计结束日期
  统计表.Range("c4:z6").Value = "" ‘先清空统计表中原来有关数据
  统计表.Range("c9:z11").Value = "" ‘


  Dim 生产计划表 As Excel.Worksheet
  For Each 生产计划表 In 佳尼2004灶具生产计划.Worksheets ‘遍历生产计划表
   If Strings.Left(生产计划表.Name, 1) = "0" Or Strings.Left(生产计划表.Name, 1) = "1" Then ‘如果是0或1开头的表名,因生产计划表名是0或1开头
   ’MsgBox(生产计划表.Name)
   行号 = 4 ‘生产计划表中生产数据从第四行开始
   列号 = 14 ‘第14列是计划下发日期。从计划下发日期判断是否是所要数据


   Dim 临时行号 As Integer = 4 ‘求得工作表中最后一行所在的行号,从第四行开始往下计算
   While 生产计划表.Cells(临时行号, 列号).value <> Nothing
    ’MsgBox(生产计划表.Cells(行号, 列号).value, , 行号)
    临时行号 += 1
   End While
   临时行号 -= 1 ‘得到生产计划表中,最后数据行所在的行号
   ’ MsgBox(临时行号)

    For 行号 = 4 To 临时行号 ‘生产计划标准格式行号从4开始,到工作表中最后一行

     If (CDate(DateTimePicker1.Value.ToShortDateString) <= CDate(生产计划表.Cells(行号, 列号).value)) And (CDate(DateTimePicker2.Value.ToShortDateString) >= CDate(生产计划表.Cells(行号, 列号).value)) Then ‘如果日期在规定范围内

     ’灶具各城市分布情况
     Dim 城市 As String = 生产计划表.Cells(行号, 3).value ‘第3列是城市名称
     Dim 计划数 As Decimal = CType(生产计划表.Cells(行号, 7).value, Decimal) ‘第7列是计划数
     Dim 完成数 As Decimal = CType(生产计划表.Cells(行号, 11).value, Decimal) ‘第11列是实际完成数
     Dim 未完成数 As Decimal = 0 ‘用Decimal是因为后面要加小数
      If 完成数 < 计划数 Then ‘如果没有完成
       未完成数 = 计划数 – 完成数
      End If

      If 城市 <> "" Then
       If InStr(城市, "沈阳") <> 0 Or InStr(城市, "鞍山") <> 0 Or InStr(城市, "哈尔滨")          <> 0 Or InStr(城市, "葫芦岛") <> 0 Then
        If 办事处计划数统计.Contains("沈阳") Then
         办事处计划数统计.Item("沈阳") += 计划数
        Else
         办事处计划数统计.Add("沈阳", 计划数)
        End If

        If 办事处完成数统计.Contains("沈阳") Then
         办事处完成数统计.Item("沈阳") += 未完成数
        Else
         办事处完成数统计.Add("沈阳", 未完成数)
        End If


       Else  
        If 办事处计划数统计.Contains(城市) Then
         办事处计划数统计.Item(城市) += 计划数
        Else
         办事处计划数统计.Add(城市, 计划数)
        End If


        If 办事处完成数统计.Contains(城市) Then
         办事处完成数统计.Item(城市) += 未完成数
        Else
         办事处完成数统计.Add(城市, 未完成数)
        End If

       End If
      Else
       MsgBox(生产计划表.Name & "没有城市名称", MsgBoxStyle.Critical, "生产计划中要有城市名称")
       excelApp.Visible = True
       生产计划表.Activate()
       生产计划表.Select()
      End If


      ’以下计算灶具型号分布情况
      Dim 型号 As String = Strings.Left(生产计划表.Cells(行号, 2).value, 3) ‘灶具型号在第3列
      If 型号计划数统计.Contains(型号) Then
       型号计划数统计.Item(型号) += 计划数
      Else
       型号计划数统计.Add(型号, 计划数)
      End If


      If 型号完成数统计.Contains(型号) Then
       型号完成数统计.Item(型号) += 未完成数
      Else
       型号完成数统计.Add(型号, 未完成数)
      End If

     End If
    Next

   End If

  Next

  Dim 城市数 As Integer = 办事处计划数统计.Count
  Dim 城市数clone As Integer = 办事处计划数统计.Count

  行号 = 4

  ’依计划数大小排序
  Dim 办事处计划数统计副本 As New SortedList
  Dim asa As Decimal = 0.001 ‘加上此数是为了防止键值的重复,在工作表中可选不显示小数
  Dim 办事处计划数Enum As IDictionaryEnumerator = 办事处计划数统计.GetEnumerator
  While 办事处计划数Enum.MoveNext
   办事处计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key)
   asa += 0.001
  End While


  ’这里利用SortedList自动排序的功能
  Dim i As Integer = 1
  For 列号 = 3 To 3 + 城市数 – 1 ‘从第三列开始填写数据,这是预先定义的格式
   统计表.Cells(行号, 列号).value = 办事处计划数统计副本.GetByIndex(城市数clone – i) ‘城市
   统计表.Cells(行号 + 1, 列号).value = 办事处计划数统计副本.GetKey(城市数clone – i) ‘计划数
   统计表.Cells(行号 + 2, 列号).value = 办事处完成数统计.Item(办事处计划数统计副本 .GetByIndex(城市数clone – i)) ‘计划数
   i += 1
  Next


  ’以型号计划数多少排序
  Dim 型号计划数统计副本 As New SortedList
  办事处计划数Enum = 型号计划数统计.GetEnumerator
  While 办事处计划数Enum.MoveNext
   型号计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key)
   asa += 0.001
   ’ MsgBox(办事处计划数Enum.Value + asa, , 办事处计划数Enum.Key)
  End While

  Dim 型号数 As Integer = 型号计划数统计.Count
  Dim 型号数clone As Integer = 型号计划数统计.Count
  ’MsgBox(型号数)
  i = 1
  行号 = 9
  For 列号 = 3 To 3 + 型号数 – 1
   统计表.Cells(行号, 列号).value = 型号计划数统计副本.GetByIndex(型号数clone – i) ‘灶具型号
   统计表.Cells(行号 + 1, 列号).value = 型号计划数统计副本.GetKey(型号数clone – i) ‘计划数
   统计表.Cells(行号 + 2, 列号).value = 型号完成数统计.Item(型号计划数统计副本  .GetByIndex(型号数clone – i))
   i += 1
  Next

  ’ Dim WSf As Excel.WorksheetFunction = excelApp.WorksheetFunction
  excelApp.Visible = True ‘显示工作簿
  统计表.Select() ‘选择工作表
  统计表.Activate() ‘激活工作表


  Catch ex As Exception ‘捕捉错误

   办事处计划数统计 = Nothing
   办事处完成数统计 = Nothing
   型号计划数统计 = Nothing
   型号完成数统计 = Nothing
   统计表 = Nothing
   佳尼2004灶具生产计划 = Nothing
   excelApp = Nothing
   GC.Collect(0)
   MsgBox(ex.ToString, MsgBoxStyle.Critical, "出现错误了")
  Finally
   办事处计划数统计 = Nothing
   办事处完成数统计 = Nothing
   型号计划数统计 = Nothing
   型号完成数统计 = Nothing
   统计表 = Nothing
   佳尼2004灶具生产计划 = Nothing
   excelApp = Nothing
   GC.Collect(0)
  End Try
  MsgBox("已经统计好了,请查看", MsgBoxStyle.DefaultButton1, "灶具生产计划统计") ‘如果完成就    提示
End Sub

  现在让我们来试用一下,先选择开始统计时间和结束统计时间,点击Button1,程序就自动统计出各个办事处的及各个产品的有关计划数量及未完成数量,是不是很方便。

 

        

             http://www.Tuenhai.com
                 2004年5月24日

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


中国共享软件走向国际指南


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


共享软件为何要走向国际


  共享软件为何要走向国际?
  理由很简单,不少人做共享软件走国际路线,月入数万美元,而同样软件走国内路线恐怕很难达到这个数.(原因大家都知道)

  软件开发三个永恒的主题是:
  一.软件的功能及创意
  二.软件的推广
  三.软件的保护
  
 当tuenhai对Visual Studio .NET程序设计初步入门时,tuenhai开始考虑程序的推广。可以说,共享软件的成功关键在于推广。
  纯粹从市场角度出发,软件推广考虑的顺序必然是国际→国内。无论如何,国际市场要比国内市场优越得多。再加上国内软件市场不成熟,许多共享软件根本不考虑国内市场。
  所以,有人下结论:

  1)能做软件的,赶紧做国外的市场
  2)不能做软件,但还会编程的,赶紧想办法找个美国公司工作(一年最差6,7万美元的年薪吧,水平高一点的10万以上没问题)

  但是有个问题,tuenhai的English并不精通,共享软件重在服务,tuenhai的poor English如何和国外用户交流?基于这个想法,tuenhai一度想先面对国内市场,等English好一点后再开拓国际市场。这个想法无疑是幼稚的。正因为是poor English,起点更加要高,无论成功与否,至少可以乘机逼自己恶补English。更关键是要抓住时间,抓住机会,先行一步。
  正如arbiter在《共享软件之勇士义旅》一文所说:“国家四级水平+金山词霸足以应付这些困难,关键的是看你是不是想去做而已”。

      

 

把共享软件提交到哪些站点



  1.首先是提交搜索引擎

  关于搜索引擎的有价值的网站:
  http://www.marketposition.com
  http://www.webposition.com

  2.提交到软件下载网站
   可参考下面网站查找下载网站地址
  http://www.softwaremarketingresource.com/
      
  http://www.trialware.org/sites.html

  http://www.asp-shareware.org/users/searchsites.asp
  
   不少人认为做海外共享软件一定要提交到http://www.download.com, 但提交到download至少要79$,一般国人没有支付途径,怎么办?
  首先你要有一张国际信用卡,去中国银行办理吧,只要你抵押$500就可以办到了,招行也行,不需要抵押,但是审核比较麻烦。Visa和Master都可以。
  Download.com的提交软件在upload.com,注册一个账号(免费的),然后把你的软件英文名称与介绍都准备好,注意英文不要有任何拼写错误呀,这个提交的资料以后是不可以更改的!tuenhai提交的时候就没有注意,结果有好几个拼写错误,唉~ Download.com提交最低费用需要$79,网站上说5个工作日的处理时间,实际上2天左右就可以审批通过了!download.com上同一类别的软件默认是按照审批通过的日期排序的,因此朋友们在提交以前看一下你要提交的类别每个月在哪几天很少有人提交,那么你就在这几天提交,这样你就可以使你的软件保持在第一页多几天的!
  tuenhai可没有国际信用卡,是不是就没有办法了呢,办法是有的,tuenhai是花了650大洋请tuenhai的主机服务商帮tuenhai打钱的。tuenhai的经验是提交以前果先做市场调查的工作,并市场和你的软件都有较充分的了解,英语也要还可以,不然走向海外不一定会成功的。tuenhai是2004年8月1日购买海外主机的,现在是2004年12月27日,其实tuenhai现在已经暂时不做海外了,主要是因为tuenhai的英语水平还是不太行,准备做一下准备工作再战海外。

海外共享软件代理销售站点
 

   共享软件在国外销售,一般通过国外的代理收款.

  1.见http://www.regshare.com/的共享软件代理注册网站列表。

  另谈谈个人的想法,以前不少人都说http://www.qwerks.com,而tuenhai给其去了几封信,却都是石沉大海.tuenhai试用过http://www.emetrix.com/ ,服务倒还可以的.tuenhai主要用的是 http://www.esellerate.net/ ,服务相当好,每次去信必然及时回复.不过用他的服务要把先下载网站上的代理销售软件的协议,签好后扫描成图像,从网上寄过去,才给激活帐号.




做海外市场,用国内还是国外主机

  这其实不是问题,做海外市场,当然是用海外主机,最好是用美国主机.tuenhai用的是国内服务商的美国主机,后来发现tuenhai的选择是对的,不是说国内服务商的主机质量最好,是因为tuenhai的英语不很精通,控制面板全是英文,tuenhai不懂的地方方便在QQ里问(当然用中文问了)
   用过海外主机,才知道什么样的主机是垃圾.tuenhai说得偏激点,tuenhai使用过国内的主机都是垃圾.海外主机控制面板里有几十项自定义功能,安装一个论坛,几下点击就搞定.还有流量统计,日志分析等等,还有许多tuenhai还没有用过,还不会和,有空要好好试试.
   为避免打广告之嫌,tuenhai就不说tuenhai用的是哪家服务商的美国主机了.
  如果你自己有信用卡,tuenhai强烈要求你自己到下面地址找自己想要的主机,请不要问tuenhai为什么!
  http://www.webhostingmall.com/
  http://www.hostsearch.com/
  http://www.10-cheapwebhosting.com/

  不过得看清楚是不是美国的主机哦.买错了不要找tuenhai.

  域名的问题
  一般国外的.COM域名要$12-$15,稍微贵了点,而且还得留意迁出你的域名时的费用,价格相差很大! 如果你的英文不是很好, 图个方便,在国内买个支持自定义DNS的域名还是合算点的.

共享软件国外收款指南

共享软件国外收款指南

   
   1.很多朋友准备接受国外的共享软件注册中心的服务的时候
  也许对怎么收取你的共享软件销售所得的美金有些茫然,现将tuenhai所知的告诉大家,希望对新加入这一行的朋友有点帮助,对于熟于此道的朋友希望指正不对的地方,也或加入讨论更好的方法

  其实从国外收取美金是一件很简单的事情
  通常你在往一个注册中心提交你的软件的时候,都要求你设置你的软件的销售价格,也可以设置打折价
而在你在一个注册中心注册的时候,他们通常要求你填入你的收款最小额度(小于这个额度会在注册中心保留,直到达到或者超过这个额度)。然后设置你的银行帐号。
  如果你第一次设置不正确或者没有清楚的情况就乱写了,没有关系,以后你可以更改这些信息,你看看有没有accont info链接,如果没有你就给support或者master发送SOS就可以了。他们会细心的解答你的问题。
  通常收取美金又3种模式
  1. Check 支票 当金额比较少时这样比较合算些
  2. International Money Order国际汇款,这个慢而比较麻烦tuenhai就不多说了
  3. Wire Transfer / Direct Deposit 直接转帐,通常是只有美国国内才可以
  4. International Wire Transfer 《《《----就这个了,这是最好的办法,不过通常一次你要被  收取3,40美金左右的费用(不过相对几百几千美金来说,tuenhai希望大家能从心理把这点投入忽略不计了)

  好,tuenhai现在来说说真么填写这些信息。
  国际电汇(International Wire Transfer),需要如下信息。
  switch code : 转帐代码
  bank : 银行名称
  account owner : 帐户名
  account NO : 帐号
  《-----前面的信息最重要
  city :城市
  country :国家
  province :省
  现在国内大多数银行都是可以收取国际汇款的,但是不是每种卡每种帐号的都支持,你在银行开户的时候一定要问清楚,这个帐号是不是能够存取美金!!!!
  拿中行的一本通为例
  你先去中行申请一个一本通(可选择港币还是美金,当然是选择美金作为外币总类了),OK,到现在为止就万事具备了。
  如,你在深圳的罗湖支行办理的这个帐号。
  switch code : BKCHCNBJ45A(每个城市不同,tuenhai是问了银行的MM好几次啊)
  bank : bank of china,shenzhen branch,luohu subranch
  (中国银行,深圳分行,罗湖支行,分行:branch,支行:subranch,你要还不放心,就问银行的妹妹了)
  account owner : kugle(银行帐号,通常都是你的姓名的拼音)
  account NO : 4766966-0138-0311340-1(银行帐号,就在卡上和存折上都有的)
  city :shenzhen
  country :china
  province :guangdong
  就这些了,如果你的注册中心网页上不能够设置,就给管理account的那个人发
送一个邮件告诉它这些就可以了。



关于共享软件的网上资源

 

  共享软件如何走向国际?是许多程序员头大的事。有了网络,一切都简单了。理论上,只要你善于利用,可以从网络上找到一切答案。

  1.http://www.google.com
  你可以在google用“共享软件”相关关键词搜索,可以找到大量共享软件相关链接。你可不要告诉你不会用google。

  2.http://www.csdn.net
  csdn的文档中心有许多共享软件相关文章,可作参考。你可在csdn的首页用“共享”作关键词搜索“文档标题。
  csdn有个“共享软件(走向海外)”论坛,你先到csdn论坛http://expert.csdn.net/,再在左边目录“扩充话题”中可找到。

  3.http://www.cnsw.org 中国共享软件联盟
  cnsw是讨论共享软件的专业论坛,里面许多内容很有指导意义。一些内容就整理自cnsw。

  4.http://www.tuenhai.com 就是本站了

 



                  http://www.Tuenhai.com
                       2004年5月13日

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/

 

 


从注册表读取程序的版本


作者:Tuenhai.com MSN: king#tuenhai.com

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.Tuenhai.com/


   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

Registry 类简介

用 Visual Studio .NET读写注册表一般用到Registry类.

  Registry类提供在运行 Windows 的计算机上的注册表中找到的标准根项集。
   注册表是一个存储设备,包含有关应用程序、用户和默认系统设置的信息。例如,应用程序可以使用注册表来存储在应用程序关闭后需要保留的信息,并在应用程序重新加载时访问那些同样的信息。例如,可以存储颜色首选项、屏幕位置或窗口大小。通过将信息存储在注册表中的不同位置,可以针对每个用户来控制这些信息。

  由 Registry 公开的基(根) RegistryKey 实例描绘注册表中的子项和值的基本存储机制。所有项都是只读的,因为注册表依赖于它们的存在。由 Registry 公开的项有: CurrentUser 存储有关用户首选项的信息。 LocalMachine 存储本地计算机的配置信息。 ClassesRoot 存储有关类型(和类)及其属性的信息。 Users 存储有关默认用户配置的信息。 PerformanceData 存储软件组件的性能信息。 CurrentConfig 存储非用户特定的硬件信息。 DynData 存储动态数据。

  一旦标识了希望在其下存储/检索注册表中信息的根项后,可以使用 RegistryKey 类添加或移除子项和操作给定项的值。

  硬件设备可以使用即插即用接口将信息自动放在注册表中。安装设备驱动程序的软件可以通过向标准 API 写入将信息放在注册表中。



RegistryKey 类

   RegistryKey 类 表示 Windows 注册表中的项级节点。此类是注册表封装。

  注册表充当计算机上操作系统和应用程序的中央信息储存库。注册表根据存储在其中的元素的逻辑顺序,以分层形式组织(有关该层次结构中的基级项,请参见 Registry )。在注册表中存储信息时,请根据存储的信息类型选择适当的位置。一定要避免损坏由其他应用程序创建的信息,原因是这样会导致那些应用程序出现意外的行为,并且还会对您自己的应用程序带来不利影响。

  RegistryKeys 是注册表中的基本组织单位,好比是 Windows 资源管理器中的文件夹。特定的项可以有子项(与文件夹可以有子文件夹一样),并且只要用户具有适当的删除权限,且此项不是基项或基项的下一级项,就可以删除此项。每个项还可以有多个关联的值(值好比是文件),用于存储您感兴趣的应用程序的信息。每个值保存一条特定的信息,在需要时可以检索或更新此信息。例如,可以为您的公司创建一个 RegistryKey(在项 HKEY_LOCAL_MACHINE\Software 下),然后为您的公司创建的每个应用程序创建一个子项。每个子项保存特定于该应用程序的信息,如颜色设置、屏幕位置和大小或者可识别的文件扩展名。

  注意,存储在注册表中的信息可由其他应用程序和用户使用,因此不要用注册表存储安全信息或关键的应用程序信息。

  若要获取 RegistryKey 的实例,请使用静态成员 OpenSubKey ,或者使用 Registry 类的静态成员。

  本文主要用到:

RegistryKey.OpenSubKey 方法:用指定的写访问权限检索指定的子项。

  以只读方式检索子项。

  [Visual Basic] Overloads Public Function OpenSubKey(String) As RegistryKey


RegistryKey.GetSubKeyNames 方法: 检索包含所有子项名称的字符串数组。

Public Function GetSubKeyNames() As String ()



从注册表读取Excel的版本

  先引入命名空间:
   Imports System
   Imports Microsoft.Win32


  要对注册表有所了解,知道我们要读取的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office。

  Dim rk As RegistryKey = _
   Registry.LocalMachine.OpenSubKey("Software\Microsoft\Office", True)

  ’ Get the data from a specified item in the key.
   Dim s As String() = rk.GetSubKeyNames() 

  Dim blnExcel As Boolean = False ’本机是否安装Excel
   Dim excelVer As String      ’Excel的版本号

  For num As Integer = 0 To s.Length – 1
     Select Case s.GetValue(num)
       Case "11.0", "9.0", "8.0", "5.0", "4.0", "3.0" ’Excel各个版本号
         Dim rk1 As RegistryKey = _
         Registry.LocalMachine.OpenSubKey("Software\Microsoft\Office\" & s.GetValue(num) & "\Excel", True)
         If Not (rk1 Is Nothing) Then 
           blnExcel = True
           excelVer = s.GetValue(num)
           Exit Select
           Exit For
         End If
       End Select
Next

  用 RegistryKey 类读写注册表是否十分简便呢?

                      http://www.Tuenhai.com

                      2004年5月3日

    

  

 


Tuenhai简介:Tuenhai同学对儒释道医卜命相有一定研究,对网络及英语最感兴趣,于哲学最有心得.常人利已,圣人利他,我非圣人,取道中庸.希望与各位精英交流,MSN:king#tuenhai.com
我的网站: http://www.Tuenhai.com/