2006年11月1日

软件简介:
   1、公务员电子政务考核系统V2.0
          本软件于2005年在江西省内全面推广,并得到较好的评价。
          是面向公务员计算机实际操作能力、电子政务及计算机基础知识的考核软件。通过本软件的   
          使用,公务员能在电子政务基础知识、计算机基础知识  、Windows操作系统、Office办公软
          件、
域网与国际互联网技术、五笔字型文字录入等方面得到较好的提高  。      
             功能模块:
                              (1)单项选择题:针对电子政务基础知识、计算机基础知识 、网络基础知识
                              (2)多项选使择题:针对电子政务基础知识、计算机基础知识 、网络基础知识
                              (3)办公操作题:针对Office办公软件的使用
                              (4)文字录入题:针对五笔字型或其他文字录入
       电子政务教材:《公务员信息化与电子政务教程》由公务员电子政务编写组负责编写。

       教材内容:电子政务基础知识、计算机基础知识  、Windows操作系统、Office办公软
               域网与国际互联网技术等知识。
   2、家谱信息管理系统V2.0 
       本软件于2005年在全国部分地区推广,并得到较好的评价。
       是面向各姓氏家谱信息进行相关管理的软件。通过本软件能实现家谱信息的录入、查询、报表的
       生成与打印、数据的导出与导入等功能。
 本人简介:在省科学院从事软件设计及开发将近5年,并曾在蓝天学院、赣江大学、先锋软件学院等院校
          兼职执教专业课程多年。工作在软件开发的一线岗位上,对数据库的设计、软件研发及软件测
          试具有丰富的经验。
          所负责的项目有:
          公务员电子政务考核系统、家谱信息管理系统、政府再就业信息管理系统、
          招投标系统、学籍管理系统、宾馆管理信息系统、打字王等软件
          所参与的项目有:
          民族宗教事务局办公信息系统、银行信贷管理系统、科学院网站等软件
             承接各种软件的设计及开发,竭诚为您服务!        
 联系方式:QQ:31545101   电话:13970908240胡先生
          网址:www.cntiblog.comEmail:leihu111@126.com

posted @ 2006-11-01 21:27 科艺 阅读(418) | 评论 (1)编辑 收藏


2006年7月22日

程序思路如下:
主窗体(frmMain :IParentForm)
事件成员:
public event ParentEventHandler OnUserListCreated;
 
事件处理方法:
void ToDoOnRequestUserList(object sender, EventArgs e){
         //创建DataTable dt
         …
         This.OnUserListCreated(this, new ParentEventArgs(dt));
}
 
某一行注册子窗体事件:
frmChild.OnRequestUserList += new EventHandler (ToDoOnRequestUserList);


子窗体(frmChild)
事件成员:
public event EventHandler OnUserListCreated;
 
事件处理方法:
void ToDoOnRequestUserReturned(object sender, ParentEventArgs e){}
 
在OnLoad事件处理方法中注册主窗体的事件:
(this.MdiParent as IParentForm). OnUserListCreated += new ParentEventHandler (ToDoOnRequestUserReturned);

主窗体对象为frmMain,它实现了IParentForm接口,该接口定义了事件成员OnUserListCreated(它的EventArgs为自定义的ParentEventArgs)。frmMain对象在某处创建了一个子窗体frmChild,并注册了frmChild的事件OnRequestUserList。
 
子窗体对象frmChild在载入时(OnLoad方法中)获得frmMain的引用,并注册了frmMain的事件OnUserListCreated。
 
根据业务逻辑,子窗体运行的某一时刻,用户行为触发了事件OnRequestUserList,此时frmMain将捕获此事件并调用自身的处理方法生成一个被请求的用户列表(DataTable)。然后,frmMain发出了事件OnUserListCreated以提示列表生成完毕,并将刚刚创建的DataTable作为ParentEventArgs参数插入事件中。随后,子窗体将接收到这个事件,并在自己的事件处理方法中对传来的DataTable进行自己的业务逻辑动作。
 
在接下来程序的运行中,可爱的代码心情愉悦地顺利执行…但是,好景不长!
 
当我将打开的子窗体关闭后再重新打开,主窗体在触发OnUserListCreated事件后发生调用目标异常,子窗体在该事件的处理方法中也抛出NullReferenceException异常(未将对象引用设置到对象实例)。当我在子窗体的事件处理方法ToDoOnRequestUserReturned中设置断点调试后发现:所有的控件、变量都为null!!
 
那叫郁闷,那叫惆怅…公车上、步行中、如厕时、入睡前,我估摸着这种灵异现象可能与最近隔壁邻居家小猫的突然消失有着千丝万缕的联系…当然,作为基督教徒的我,也后怕这是主,耶稣基督对于我大前天横闯马路的惩罚…
 
无助中,我极其盲目的在frmChild的ToDoOnRequestUserReturned方法中加入了一行语句:“MessageBox.ShowDialog(“So boring a thing!”)”以发泄心情。保存、编译、运行——大坏蛋的面目露了出来!当我第一次打开子窗体的时候,如我所料,程序正常运行并弹出了MessageBox。关键是,当我关闭子窗口并第二次打开它执行时,MessageBox弹出了两次!恩…
 
带着疑问,我重复了以上关闭、打开步骤,MessageBox弹出了三次!——事情已经有了眉目。在我辗转反复的思考后(也许有人会骂我菜鸟…),终于明白了所有事情的缘由:
 
因为程序一直处在运行中,所以主窗体对象一直驻留内存中并保持着自身的状态(它没有的disposed),所以,每次子窗体创建时,主窗体都会注册它的OnRequestUserList事件,同样的,该子窗体在加载时,自身也会把主窗体的OnUserListCreated事件注册一次。
 
问题就出在这里,虽然子窗体关闭了,并disposed了。但是,它关闭时并没有把在主窗体注册的事件同时注销。随着子窗体一次次的打开,主窗体的OnUserListCreated就被+=了N多了注册用户,其中的N-1个用户其实早已经不存在了,而主窗体全然不知。所以当发出OnUserListCreated事件后,主窗体还会以无反顾地去调用这N多个方法代理,这必然会导致异常抛出——唯一打开的那个子窗体接受到一次次传来的事件,并企图调用ToDoOnUserListReturned方法,如果此方法中包含着对本对象成员变量的操作,自然会引出“未将引用设置到对象实例”的异常。
 
也许有朋友会问,为什么主窗体调用那些早已disposed的frmChild的方法的代理时,会被当前存在的那个frmChild执行呢?我认为这可能是由于类实例的同一个方法在内存栈中共享空间造成的;而成员变量在堆中存放,各自维护其状态,当其所属的对象被释放回收时,其值也就置为null了。(个人观点,望兄弟姐们给予指正)
 
总结:
 
子窗体在关闭时,应当把自己注册的主窗体对象(或者是长久驻留内存对象)事件一一注销。例如本例中,应在子窗体的OnClosed事件处理方法中加入以下代码:
(this.MdiParent as IParentForm). OnUserListCreated  -=  new ParentEventHandler    (ToDoOnRequestUserReturned)
 
如果仅仅是为了在主窗体执行完某项操作后触发子窗体某一方法的执行,我们通常不采用事件机制,而采用以下两种方法:

A. 将此方法访问属性改为public,然后由主窗体适时调用。
B. 定义一个接口,子窗体对象实现这个接口,并把该目标方法提升为该接口的成员。由主窗体适时调用这个接口成员方法。

posted @ 2006-07-22 16:48 科艺 阅读(774) | 评论 (0)编辑 收藏


2006年7月20日

1、含义:将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。

2、编程要求:只有实现Serializable接口的类对象才可以被序列化。 Serializable接口没有定义任何成员,它只用来说明某个类可以被序列化。

3、序列化的特点:(1)如果某个类能够被序列化,其子类也可以被序列化。(2)声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。(3)相关的类和接口:在java.io包中提供如下涉及对象的序列化的类与接口ObjectOutput接口、ObjectOutputStream类、ObjectInput接口、ObjectInputStream类

4、ObjectOutput接口和ObjectOutputStream类(1)ObjectOutput接口:它继承DataOutput接口并且支持对象的序列化,其内的writeObject()方法实现存储一个对象。(2) ObjectOutputStream类:它继承OutputStream类并且实现ObjectOutput接口。利用该类来实现将对象存储(调用ObjectOutput接口中的writeObject()方法)。

注意:(1)也可以利用ObjectOutputStream类的对象写入其它基本类型的数据值。(2)出错时将抛出IOException异常。

5、ObjectInput接口和ObjectInputStream类(1)ObjectInput接口:它继承DataInput接口并且支持对象的序列化,其内的readObject()方法实现读取一个对象。(2) ObjectInputStream类:它继承InputStream类并且实现ObjectInput接口。利用该类来实现将对象存储(调用ObjectInput接口中的readObject()方法)。

注意:(1)也可以利用ObjectInputStream类的对象读取其它基本类型的数据值。(2)出错时将抛出IOException异常。

6、对象的序列化用途:  利用对象的序列化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。下面给出读写对象状态的源程序片段: (1)读取对象的状态 FrameConfig configData=null; //FrameConfig类中包含有要保存的数据 currentDir=System.getProperty("user.dir"); try { FileInputStream fim=new FileInputStream("config.dat"); ObjectInputStream oim=new ObjectInputStream(fim); configData=(FrameConfig)oim.readObject(); fim.close(); oim.close(); if(configData!=null) { //获得对象中的数据并保存在程序的变量中 currentDir=configData.currentDir; WindowStyle=configData.WindowStyle; topX=configData.topX; topY=configData.topY; windowWidth=configData.windowWidth; windowHeight=configData.windowHeight; } else { //如果未能够正确地读出数据将采用缺省值 topX=0; topY=0; windowWidth=Toolkit.getDefaultToolkit().getScreenSize ().width; windowHeight=Toolkit.getDefaultToolkit().getScreenSize().height-25; } } catch(IOException e) { } catch(ClassNotFoundException e) { } (2)保存对象的状态 FileOutputStream fom=null; ObjectOutputStream oom=null; //FrameConfig类中包含有要保存的数据 FrameConfig configData=new FrameConfig(this); try { fom=new FileOutputStream("config.dat"); oom=new ObjectOutputStream(fom); oom.writeObject(configData); oom.flush(); fom.close(); oom.close(); } catch(IOException e) { }

posted @ 2006-07-20 20:12 科艺 阅读(899) | 评论 (0)编辑 收藏


2006年7月18日

第一阶段此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。

第二阶段此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。

第三阶段此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。

第四阶级此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想变不过来。

第五阶级此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。

第六阶级此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。

每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。

现在我们国家大部分程序员都是在第二、三阶段之间。他们大多都是通过自学成才的,不过这样的程序员一般在软件公司也能独当一面,完成一些软件的模块。

posted @ 2006-07-18 21:48 科艺 阅读(226) | 评论 (1)编辑 收藏


2006年7月16日

做了一下午的事,休息一下吧.上网的时候就看了一下前几天申请博客的回复信息.通过设置,有了自己的博客.希望各位阶级兄弟姐妹们常来并留言,同时,帮我接点单,谢谢!上半年一直在跟美国主线(北京)的技术人员一起开发信贷管理系统,收获颇丰.这段时间在写省公务员考核系统,只是价钱不好谈,郁闷中!

posted @ 2006-07-16 17:36 科艺 阅读(141) | 评论 (0)编辑 收藏

今天一早就起来了,为了去导师家里玩.龙老师叫了好几次,再不去就是我的不对了.九月份他就要去北京读博士,在他去之前还得聚一聚.可以说在南昌航空工业学院最大的收获就是跟着龙老师学习软件开发,他也曾说过"环境造就性格,性格决定命运.",看来他做到了.可我呢?当然不同的人将有自己不同的生活方式.嫂子还在莲塘一中教书,最好玩的是他们的儿子,好几年没看到他了.在科学院工作的时候常去他们家,他那时只会爬一爬,真好玩!

posted @ 2006-07-16 17:24 科艺 阅读(224) | 评论 (2)编辑 收藏


仅列出标题  

posts - 6, comments - 4, trackbacks - 0, articles - 0

Copyright © 科艺