LynxMates 软件开发文档

2005/07/23 | 09:00 | 分类:Windows开发 | 标签: | 406次阅读

.NET软件开发文档

软件名称

LynxMates

软件简介

  LynxMates是一款班级学生信息管理兼通讯簿软件。它基于Access数据库,可存储、编辑、检索、浏览、打印包括姓名、生日、电话、照片等十余项字段在内的个人信息。数据库特别设定了一个加密字段,可用于存储身份证号码等重要信息。程序平时缩小在系统通知区域,可方便地在通知区域图标上通过快捷菜单进行信息检索操作。它是我们日常工作的好助手。

作者信息

林健 北京理工大学01110407

Websitehttp://www.linjian.cn/ E-mailyumenlj@126.com QQ71424

版本信息

Version 1.06  2005/02/19 于甘肃兰州

 

 

开发说明
  开发这个软件是纯实用目的。我经常给班里同学打印通讯录,在使用电脑时也常常需要查找同学的手机号、QQ之类的信息,在班级网站上也要放同学的这些资料。原先打印通讯录用的是Word,查找同学信息用的是Outlook通讯簿,班级网站上的则是一个静态的HTML网页,每次信息有改动,几处都要改,很不方便。我想让它们共用一个数据库,方便维护管理。开发LynxMates,一是方便数据的维护,二是方便通讯录的打印,三是便于我按照个人习惯快速查找同学的信息。(至于班级网站上使用这个数据库,是另一个ASP.net工程,不属于LynxMates工程)因此,大家可能会觉得这个软件的通用性不是很好(尤其是打印通讯录,按照寝室分类排列完全是我个人的需要)。

  程序用VB.net写成。数据库访问主要使用的是ADO.net技术。数据库选用的是最常见的Access。

  其他用到的技术以及我自认为的一些“小聪明”,会在后面详细说明。

 

使用方法
  首次运行时,程序会要求用户选择一个数据库文件,请选择示例数据库MyClass.mdb。以后可删除MyClass.mdb中的示例数据,直接添加和修改自己的数据。当然也可将MyClass.mdb复制,重命名,用本软件或Access清空记录(不要清空字段信息)后再使用。

 

LynxMates 软件开发文档

  软件启动后,自动缩小到系统通知区域。单击通知区域中的小图标,可以打开主界面;右击小图标,弹出快捷菜单。通过主界面或快捷菜单,皆可访问DataCenter、DataViewer、DataSearch三个功能窗体。

 

LynxMates 软件开发文档

 

LynxMates 软件开发文档

  在DataCenter中,可以通过表格总览所有数据。点击“New”、“Edit”、“Delete”按钮可以添加、编辑、删除个人信息。点击“Print”按钮将以特定的格式打印所有数据。打印预览界面如下:

 

LynxMates 软件开发文档

  DataViewer提供个人详细信息浏览:

 

LynxMates 软件开发文档

  在DataSearch中可以按一定条件检索个人信息,之后启动DataViewer浏览。在快捷菜单的“Go”之后输入关键字,也可以快速检索:

 

LynxMates 软件开发文档

 

LynxMates 软件开发文档

  特别说明:

  1、Student ID(数据库中的MateStudentID字段)是数据库主键,不可以为空,其他字段皆可为空。

  2、本程序文件夹下的photos文件夹是保存照片用的固定的文件夹,程序中所有涉及到照片的记录只填写该文件夹下的文件名而不写路径。

  3、数据库的MateCardID字段为加密保存的身份证号码。安全起见,该字段只能在Access中修改。打开本程序文件夹下的EncryptTools文件夹,运行其中的EncryptTools工具,输入一个密钥(8个英文字符,须牢记)和待加密字串。点击加密按钮后,程序自动将加密后字串复制到剪贴板。此时用Access打开数据库,将加密后字串粘贴到相应记录的MateCardID字段即可。

  4、查看加密身份证号码字段的方法:在程序的Data Viewer窗体中,用键盘依次输入“allinformation”,此时窗体下方会出现更多的信息。在其中的Key文本框中输入原先加密用的密钥(示例数据库MyClass.mdb中所有记录的密钥皆为iloveyou),点击右边的叹号按钮,解密后的信息会显示在下方文本框。

  5、PrintSettings.xml为打印设置文件,可根据有关注释和元素命名自行设置打印参数。

 

结构设计
  这个软件主要由以下几个类构成:

LynxMates 软件开发文档

  其中FrmMain是启动窗体,在其中可以调用FrmDataCenter、FrmDataViewer和FrmDataSearch。在FrmDataCenter中又可以调用FrmDataEditor和FrmDataPrint。FrmQuickMenu是点击屏幕右下通知区域时显示的快捷菜单(为什么要用Form而不用ContextMenu做菜单?因为我需要在菜单上加一个TextBox,虽然可以在ContextMenu的绘制事件中添加,可我发现那太麻烦,不如用Form自制一个菜单)。

  DataPrintManager类实现了用GDI+绘制打印文档,Dorm类是一个寝室的数据结构(打印是以寝室为分类单位的,这是限制本软件通用性的一个因素),InfoEncrypt类实现数据库特定字段信息加密。DataPrintManager类和InfoEncrypt类的编写参考了班主任金旭亮老师的程序中的部分代码,在这里对他表示感谢。

 

技术说明
  这个软件整体上比较简单清楚,我就不对每个过程一一讲解了。以下几处我认为是有必要说明的:

●FrmMain中的BeSureOnlyOne 函数用以确定只能运行一个本程序的实例。对于操作数据库的程序,我认为都有必要考虑这个问题:如果同时打开两个程序实例操作同一个数据(例如A实例去修改B实例已经删除的却在A实例中没有即时更新的数据),程序很可能会出错。

●FrmMain中带有Registry的那几个函数用来从注册表读写设置的。事实上.NET提供了很好的XML支持,我现在写程序也喜欢用XML保存设置了,不给系统带来垃圾,还方便修改调试。

●FrmMain中的DAInit函数用以初始化数据适配器,事实上这仅仅是把.NET自动生成的数据库组件的代码移了一个地方,排列得整齐一些吧!要实现优质高效地访问数据库,还是自己写这些代码好。

●FrmMain中的StartSearch函数有提示,在SQL命令中用“''”替代“'”,同时,SQL中其它一些有特殊含义的字符,如“%”、“_”,我们写程序的时候也要注意,否则用户输入这些字符提交给数据库往往会出现错误的结果。这是程序健壮性的要求。

●FrmMain向FrmDataCenter传递数据(FrmDataCenter向FrmDataEditor等亦然),方法是在FrmDataCenter的构造函数中给它传一个FrmMain实例,让它从FrmMain特定的函数中获得数据。事实上主从窗体间互传数据的方法还有很多,值得我们去探索。

●FrmDataCenter中的DeleteRecord函数中删除一条记录用的是DataRow的Delete方法。至于DataRow的Delete方法与DataTable的Remove方法有什么异同,对数据源各有什么影响,曾经把我搅混了。这个问题留给大家自己思考。

●FrmDataEditor中必须保证作为数据库主键的MateStudentID字段是否为空或有重复,这也是程序健壮性和数据库正确性的要求。但我这里用的把已有的主键以数组的形式提交给FrmDataEditor的方法似乎笨了一些,留给大家改进吧!

●FrmDataPrint中读取数据库时判断一个字段是否是System.DBNull.Value是有必要的。.NET在这方面很严格,System.DBNull.Value与String.Empty是两个不同的对象,不要被它们的视觉效果迷惑了。

●FrmDataViewer是个比较有意思的窗体,里面有一个“秘笈”:用键盘依次输入“allinformation”,窗体下方会出现更多的信息。这个功能的实现参见RecordKeyress函数。要实现类似的功能(比如用键盘上的方向键控制窗体上游戏人物的移动),必须将窗体的KeyPreview属性设置为True,否则得到KeyPress事件的将不是窗体而是窗体上的输入控件。

●FrmDataViewer中通过绑定照片文件名到txtPhoto,再在txtPhoto_TextChanged中实现刷新照片显示,显然是我的一个“小聪明”,用这样一个间接的方法避开了使用当时我并不熟悉的委托等事件机制。

●FrmQuickMenu的制作也算是我的一个“小聪明”,我需要在菜单上加一个TextBox,虽然可以用ContextMenu,在它的绘制事件中添加,可我发现那太麻烦,不如用Form自制一个菜单。模拟菜单的高亮显示事实上可以用一个自定义的可响应鼠标事件的Label控件,我也偷懒没做,找了一个现成的LumiSoft.UI控件(后来我一时兴起,把程序中几乎所有的控件都改成LumiSoft.UI的了)至于菜单的3D效果,我则直接给它加了一个Enabled=False的Button作为背景,Button的这种用途还是头一回见吧!

●FrmQuickMenu初始化时执行Activate是有必要的。细心的朋友可能发现Windows的通知区域里的小喇叭有一个bug:在单击小喇叭出现音量调节窗体时如果恰好有别的窗体自动激活,即使你点击屏幕其他地方,音量调节窗体也不会消失,除非你调节一下音量后点击屏幕其他地方它才消失。究其原因,是音量调节窗体由于外界因素偶然没能被Activate,就无从发生Deactivate事件。我们的QuickMenu也是一样。但只要在窗体初始化时主动Activate它,就可以保证点击屏幕其他地方后Deactivate事件的发生,在Deactivate事件中关闭窗体。

●DataPrintManager类实现了用GDI+绘制打印文档,这玩意儿花了我最多的时间。有以下两点值得注意:① PrintOneObject中的e As System.Drawing.Printing.PrintPageEventArgs是传引用而不是传值。②Printing.PrintDocument的PrintPage方法是在方法内代码全部执行完后再判断e.HasMorePages的,不要认为e.HasMorePages = True是一个立即换页指令。如果要换页,要在e.HasMorePages = True之后立即End Sub。

●Dorm类继承了System.IComparable接口,实现按寝室号排序对Dorm类型的数组排序。我们应当充分利用接口这一面向对象特性。

 

开发感悟
  LynxMates是我学习ADO.net后做的第一个成品软件。开发的时候我对ADO.net的一些特性还不是很了解,于是用了一些不是很好的方法。例如在窗体间传数据,我将DataTable不断Copy,又慢又浪费内存。另外前面也说过,这个软件的通用性不是很好,尤其是打印通讯录,仅仅支持现有的这一种模式,打别的样式就得修改源代码,这有悖于面向对象思想。希望大家从我的程序的缺点中得到启示。

Magic Stone 软件开发文档

2005/07/23 | 08:53 | 分类:Windows开发 | 标签: | 585次阅读

.NET软件开发文档

软件名称

Magic Stone

软件简介

  方块类型的小游戏。同种颜色的三个或三个以上方块相连即可消除。可自定义背景音乐等。

作者信息

林健 北京理工大学01110407班

Website:http://www.linjian.cn/ E-mail:yumenlj@126.com QQ:71424

版本信息

Version 1.01 2005/1/13 于北京理工大学

开发说明

这个小游戏是我于2004年10月在班主任金旭亮老师的指导下初学.NET时作为作业写的第一个功能完整的程序,那时我初次接触面向对象程序设计,并没有理解面向对象的实质,程序写得完全是C语言那种结构化的模式,现在看上去比较可笑。但是,这个问题在面向对象程序设计的初学者中还是比较普遍的。把这样一个典型的程序拿给大家看看,还是有一定的参考和对比价值的。(这个所谓的1.01版本是我后来将代码整齐化、加了注释的版本,保留了原版的程序结构,以此为鉴,初学者不要模仿^_^)

使用方法

Magic Stone 软件开发文档

游戏程序启动后,可以设置下落方块的种类数与速度。点击“新游戏”按钮开始游戏。游戏中,用[←]、[→]、[↓]键控制方块移动,[↑] 键变换一组方块的颜色顺序。三者或三者以上同色相连的方格将被消除,消除后增加得分。在游戏中,可以选择“暂停”或“结束”,还可以用[0]~[9]数字键控制音乐。

结构设计

程序用C#写成。首先来看看变量的定义:

Magic Stone 软件开发文档

以及函数的声明:

Magic Stone 软件开发文档Magic Stone 软件开发文档

怎么样,挺有C语言的风格吧!我当时真是厉害,几乎所有的变量都设是全局的,包括那些循环用的i、j、k。而看看类视图呢:仅有一个Form1,所有的代码都写在Form1中,美其名曰“界面过程类”。

技术说明

游戏的核心是算法。这个小游戏的基本思路是:

 

一个计时器每一时间间隔调用函数判断:如果有正在下落且可以继续下落的三连方块,则使之继续下落,否则判断定格后的所有方块有没有三者或三者以上同色相连的情况,有的话则将其消除,由此产生的空格上方的方块立即落下。旧的方块定格后程序产生一组新的随机三连方块,再执行同样的函数判断……鼠标和键盘事件随时捕获用户操作,如果没有阻碍,则控制三连方块移动或颜色交换。

 

数据表示层上,程序打开时先初始化数据结构,建立一个12*17的数组,储存10*15的方块信息(多出的两行两列放在四周做“哨兵”。)数组元素的值0表示空格,1、2、3……表示不同的方块,100表示“哨兵”,“哨兵”等效于一种不同与1、2、3……的方块,设置它的目的是使得程序中对最外一圈方块的行为判断与中部方块一致,不必特殊处理。方块的移动或颜色交换只需按一定规则改变数组元素的值。空格上方的方块立即落下的过程是将数组中每一列的零集中的过程。消除同色相连的方块有一个技巧:有时同一方块可能共属几个三者或三者以上同色相连的方块组,如果判断出一个可消除的方块组就立即将其置零消除,会导致和这些方块相连的其它原本可以消除的同色方块组无法消除。解决这个问题的方法是判断所有方块时取数组元素的绝对值。如果找出一个可消除的方块组先将其置为原值的负值,判断完所有情况后统一将负值置零消除。

 

细节方面,GDI+程序必须注意在窗体的Paint事件中调用图形重绘,否则窗体被覆盖再显示后绘制过的图形无法重现。另外游戏中加入了音乐,播放音乐用的是Windows Media Player 6.4组件(Windows\System32\MSDXM.OCX)。虽说现在Windows Media Player都升级到9.0了,可我个人感觉6.4的易用性和兼容性还比较好的。

开发感悟

给大家看我这个“面向对象的皮,结构化的馅儿”的程序,让大家拿它与优秀的程序做参考和对比,是有现实意义的。这种编程风格是我身边的很多初学者共有的。更有甚者,连结构化编程基础也没有的同学,会将上百行代码写在一个Button_Click事件中,够厉害的。

 

顺便说句题外话,金老师的“跨越式”教学探索对于编程的初学者看来得慎用,.NET确实好上手,但缺乏C(或其他基础语言)的基础和面向对象的思想往往会造成这样的“怪胎”程序,影响初学者的思路。看来扎实的基础仍然是高效地学习.NET的前提。

偶读金老师的旧帖有感

2005/07/15 | 21:03 | 分类:学习随感 | 标签: | 678次阅读

  今天整理一些旧光盘,偶然找到了一个CSDN的精华帖集合,在里面发现了金老师的很多文章和回复。特别令人赞叹的是在“程序人生”版面,他的回复往往比人家的原帖还要长。
  仔细读了读,有两件事可以不足为奇了:
  ·金老师平时与我们谈话时,语言滔滔不绝,想法层出不穷,充满对中国教育事业的期望和对软件事业的执着追求。虽说一听就是一晚上,非等到清楼才结束,但每次都有新内容,新收获。
  ·网上结识的学长、和金老师有过交往的网友,总对他充满看上去“过了一点儿”的敬意。心想他还挺年轻的呀。
  觉得自己是得现实一点,上大学干点该干的事儿。

在Linux下配置Dell 600M笔记本的2200BG无线网卡的经验

2005/06/24 | 21:25 | 分类:Linux与开源 | 标签: | 1,019次阅读

在Linux下配置Dell 600M笔记本的Intel 2200BG无线网卡的经验
有关安装的问题,没有仔细研究,只是在网上听说要比Intel的README上说得复杂。还好我的FC4正确地识别安装了无线网卡。
我的笔记本(Dell Inspiron 600M)的无线网卡开关是Fn+F2,在Windows下用的时候以为那是个软开关(因为它受制于Dell QuickSet软件),但从Linux下的使用看来应该是硬开关。可以用iwconfig命令查看开关前后的不同状态。
网卡的模式从名称上看应该是802.11bg,默认就是这个。但从Windows下PROSetWireless软件的设置来看应该设为802.11g。用命令iwpriv eth1 set_mode 4修改。(我的无线网卡挂为eth1)
一些基本配置用iwconfig命令完成,读一读它的help很容易看懂。比如在我的寝室双机连接,用:
iwconfig eth1 mode ad-hoc
iwconfig eth1 essid OurWiFiNet
IP、网关、DNS配置和一般的网卡一样,不赘述了。
当然Xwindow下也有图形化的配置工具──KWiFiManager。再配合系统设置菜单里的网络配置工具并挂一个网络监视器图标应该容易搞定。
最后ping一下试试,ping的时候加个参数,表示从无线网卡发出:ping -I eth1 192.168.0.1。
我实验Linux-WindowsXP2003互联成功。

在Windows 2003下安装2200BG无线网卡及其软件的经验

2005/06/24 | 15:12 | 分类:Windows应用 | 标签: | 1,519次阅读

  Intel提供的2200BG无线网卡驱动只有For Win2000/XP的,在Windows 2003下直接安装会出一些兼容性错误,无法安装。我经过摸索,找到了如下安装方法:

  1、下载最新的Intel PROSet/Wireless Software 9.0.1.0版本,解压。
  2、在Windows设备管理器中重新安装2200BG无线网卡驱动,驱动搜索目录设为解压后的\Intel\wireless 9.0.1.0 - generic TIC 90281\Drivers目录。忽略错误提示。
  3、将\Intel\wireless 9.0.1.0 - generic TIC 90281\Apps目录下的iProInst.exe属性中的“兼容性”设为“Windows XP”。
  4、运行iProInst.exe,选择自定义安装,在组件选择界面取消第一项(驱动程序)的安装,只安装PROSet/Wireless软件。

  这样,2200BG无线网卡就被正常安装,稍加配置就可以照常使用了。

页面存档: 上页 1 2 3 ...41 42 43 44 45 46 47 48 49 下页