All Stories
人又有点犯懒了,不是很想动了。画了个设置对话框,里面的代码就都留着不写了,查找对话框也不画了,直接用系统定义的那个了。白天在看Boost的文档时,偶然发现有个string algo库,可以对string进行一些诸如查找、替换、分割等操作,这样就方便了,可以把那块引号变换的代码省掉了,自己写的还指不定什么时候出现问题呢,现在就一行代码搞定喽。 鉴于人越来越懒,决定把设置对话框和查找功能完成,再把那个ListView多选的bug除掉,就算1.0版完成吧!
主窗体类的实现文件又变成有1000多行了,郁闷。能导入导出目录结构了,这样就方便很多了。基本上弄完了主菜单和工具栏了,但也更难看了。翻开以前的计划看了看,原来还要加IE/Shell右键菜单啊,要能收集了网页文件后再打包成chm格式啊。要做好一个程序真难啊,还有些bug没解决。还要加注册和设置的功能。
把ListView改成可以多选的virtual listview,有点问题,有时候不能获取到全部的被选中的项,在csdn上也看到有人有这样的问题,不过并没有提到解决办法,只是说用普通的ListView就没有这样的问题,难道我也改回去。改回去除了显示速度变慢这个缺点外,能得到另外一个好处,就是如果从后面添加了记录,不用全部刷新整个ListView。 原来那个OnEdited的事件是可以用的,它的参数中最后一个就指明了新的标题,而指向节点的那个参数里的标题属性还是老的,这样也好呢,可以决定是不是在某些时候不应该被修改。 另外想到,应该有个搜索功能,至少能按书名,或文件路径来搜索。其次是,有点想加个ListView和TreeView间的拖拽功能。拖拽以前都没做过,不知道麻烦不麻烦,其实我觉得这个小程序最麻烦的是数据库操作了。 今天从浏览器登录到Gmail中时,突然想到,如果邮件客户端的界面可以做成像这种,应该也很炫哦,把所有相同主题的列成一个,然后可以在一个浏览窗口中统一浏览。看了一个Foxmail、Dreammail、Koomail、Outlook、Notes都是没有这种界面的,其它的客户端程序也不了解,不过Gmail这样的可能也算得上是首创的了吧。然后我就又有点发神经了,想自己写个客户端了。
终于有点实用功能了,可以把磁盘上一整个文件夹下的所有符合要求的文件都导入到相应的节点下去了。在TreeView中用鼠标点击选择某个节点后,也能列出相应的记录。虽然效率是低了些,但是功能总算是完成了。突然想到,ListView应该可以多选,TreeView中右键中应该有个可以选择文件进入导入的选项,而不光是导入整个文件夹。还应该加个选项,可以校验磁盘文件的有效性,自动把失效的记录删掉。总觉得界面是太丑了,想让ListView中可以在每条记录前面添加一个对应在Explorer.exe中显示的图标,另外,如果让Toolbar中显示的图标是32bits的,会不会好一点。 再有,Access创建的文件实在太大了,添加了几条记录后,就变成900多KB了,用WinRAR压缩了一下,变成40多KB,原来压缩空间有这么大,就想是不是可以集成压缩和解压缩功能,这点用7z或zlib都可以实现,不过没研究过怎么在BCB中使用,而且以前也没研究过怎么使用压缩功能,只研究过在VC下来解压缩。
从数据库中读出数据并填充TreeView部分总算搞好了,用了一个递归的函数,还用了map之类的容器,把一些需要的数据保存起来,想起来,要是不知道STL这么好用的东东,还真是很麻烦呢。 之后要做的是仔细地控制TreeView。如果对TreeView进行了某个节点的改名,就应该update到数据库中去;如果TreeView中的节点少了一个,也应该把数据库中对应的那条记录delete掉;如果选择了TreeView中的某个节点,就应该把对应这个节点的所有书籍信息都select出来,并显示在ListView中,这依赖于把这些信息先保存到一个vector中,然后刷新ListView,如果信息量比较大,则对ListView的刷新速度有所要求了,因此,从一开始就应该设计好用virtual listview来实现,如果不算检索数据库的耗时,1秒钟插入显示10000条记录应该是没有问题的。 弄完了上面这些,就可以考虑其它的用户界面方面的问题了,比如加个选项,可以自动清除掉已经不存在磁盘文件的书籍记录;可以整个分类的书籍一起移动或拷贝到某个文件夹下;可以由用户配置合法的文件后缀名,并定义各自的打开方式等等。 不知不觉,又把所有的代码都写在主窗体类里去了,真是不爽,但是我又不知道如何可以把其中一些代码移出来,因为所有的代码都直接用到了一些VCL控件,控件是添加在主窗体上的,所以总是要在主窗体类里写才能找到。 在网上找到一个讲SQLite的中文网站,里面有一些中文的文档,还是挺有用的,比如知道怎么用VC来编译SQLite的dll文件了,估计Borland的编译器也是可以的,但最简单的方法还是直接用implib工具从dll文件生成lib文件,VC的编译器套件里也可以用lib工具从def文件来生成lib文件。Access生成的文件实在感觉大了些,不爽,说不定哪天我要把它换成用SQLite的数据库。有些开源的东东还真的很不错的说!
终于经过翻阅了手头能找到的所有关于VCL使用ADO连接数据库的资料,连猜带蒙,好不容易回忆起来怎么来用了。其实就是FieldByName()->AsXXXX的用法,后面的XXXX可以是Integer、String、Boolean等等。虽然这个用法是试出来了,不过还有不少的困难摆放在眼前,其中一个很大的拦路虎是,TreeView很难用啊!我那样的设计,要把TreeView中的每个节点对应到数据库中的一条记录,这就是比如繁琐的一件事情。还有一个原因是,我对ADO控件的了解,也仅限于直接写入SQL语句操作一下,甚至连SQL语句都是现学现卖的,临时需要了就临时看一下手册,什么select、delete、update、insert等等。这样一来,原本可能可以很简单的事情,被我弄得很麻烦了。 接下来要做的是,从数据库里读出所有TreeView所需要的数据记录,每条记录由3个字段组成,分别是节点ID、节点名称、父节点ID。强制规定第一条记录肯定是根节点,后面的记录肯定至少是根节点的孩子,在TreeView中添加了根节点后,再读出所有其它节点,并根据父节点ID依次添加上去。还有点很郁闷的是,TreeView的节点名称编辑完了,没有恰当的得到编辑后的名称的时机。有个OnEdited事件,还以为可以用,结果得到的还是编辑前的内容,有个OnEditing事件,也不能得到当前最新的内容,晕倒!以后没什么事能不用TreeView,千万别用这个这么难用的控件了。 最后想说的是,Access的数据库怎么体积这么大,只放了3张表,表里都没什么数据,那个mdb文件就有800多KB了。 唉,想想,一点技术含量都没有,不过能卖钱就好。
用ADO连接Access就先放下了,在公司里找了些资料看了看,还是没什么头绪。回来只是把其它的文件搜索、文件报表生成等功能完成了,剩下的主要就是怎么跟Access交互了。总是觉得TreeView有点难用,ListView倒是比较好用,以前用过比较多次了,而且没有什么特殊的要求。 倒是这次总想着怎么把Boost应用进来。Boost::foreach和Boost::lambda是最近才看过的东西,但是这种小程序没多少场合可以应用,很多时候都是不需要多少算法或是表达式的,只是简单的过程式的流程。还有一点就是,应该好好把STL的内容熟练使用,有些事情自己处理虽然也不是很费事,但如果直接使用STL中的算法来完成,不但更高效健壮,可读性可维护性也是更好。 luolu说,她可能要读博士了,还说,是因为没事情做,所以才想读书的。人和人的差别真是大呀!
今天经过半个小时的交通堵塞,终于比平常晚了半个小时到了家里。发明迅雷的人真不是人,这么抢带宽的东西也做得出来。 写了一会儿Ebookshelf,这个东西本来是自己用的,因为有了不知道多少本的电子书,却没有好的管理工具,只好先自己写一个。还为了用什么工具开发犹豫了好久,主要的当然是BCB和VC之间的抉择,不同的编译环境会涉及到不同的各种问题,比如打算用SQLite或Access来做数据存储,哪种接口在哪种环境中更容易使用,然后是WTL和VCL哪个更方便。最后的决定是在打开电脑后几分钟才下的,用BDS2006+Access,因为SQLite只提供了DLL和DEF文件,我又不知道怎么为VC的编译器从DLL和DEF文件生成导入文件(即lib文件),而Access的连接用VCL中的ADO控件是异常方便。另外一个原因是,本来BCB用的lib文件是可以生成了,但是直接include了sqlite.h编译都不过,也不想再研究了,就只好用这种组合了。不过比较郁闷的是,原来虽然也用过几次用ADO连接SQLServer或Access,但今天用起来时,发现很多东西都忘了,都不知道怎么从获取到的记录集中提取出指定字段的值了!原来的那个程序也找不到了,好像就是最近那种整理邮件的时候都删掉了。另外还有个问题是,总觉得我用VCL画出来的程序界面很不专业、很业余。主要大概是各种颜色搭配,以及控件的一些细节属性没设置好,这个角度讲,其实用VC的MFC或WTL就好多了,能一下就生成标准的Windows应用程序界面。先把涉及到数据库操作的部分放一放,接口都留出来,等哪天复习一下再补上吧! 部门又发了一本《读者》合订本,还是2003年下半年的,去年的还是2004年上半年的呢,真是抠呀!而且邮件一发,雨烟就说要罚那个知情不报的人,教授也真是可爱,居然还敢承认,呵呵。 下午又跟疯丫头一起看了一点数据特性的代码,那个新员工写的代码还真是有趣呢,虽然一个文件里面的函数只实现了1/3左右,还是被我们找出了几十个各种类型的问题,有些是压根就编译不过的。其实我觉得这种阶段就拿来让测试部做代码检视是不太合适的,至少也得能编译通过吧。尤其是在看了各种模板应用后,发现编译器在编译期间就能帮助找出不少错误的,所以没经过编译器的代码最多也他们开发内部互相检视一下算了,拿到测试部来有点形式主义或者说是小题大作。不过这样也好,至少疯丫头的PI值是提上去了,哈哈!
早上很早就醒了,然后在床上赖到9:40起床玩电脑,10点半的时候开始收拾,准备出门。跟阿菲一起坐302到万象城,逛了一小会儿,两个这样的组合的人似乎是没有逛这种地方的闲情逸致的,只是买了点曲奇,然后就直接去吃饭的地方了。这是家泰国菜馆,里面的咖喱是阿菲叫我去的主题。等了一会儿,去把xcc接来,这次聚餐的全部主角都到齐了。这两个人,一个接完电话另一个接,都是处于热恋中的,手机必须保持随时能接听的状态,这样他们的另一半才能随时定位到他们的行踪,呵呵。随便点了几个菜,也不是很贵,三个人也就吃了103块钱,每人平均还不到40块。每次我们三个在一起的时候,聊得最多的就是各自工作的问题,以及对以后的展望,呵呵,展望说不上的话,至少可以说是想法吧。阿菲总是说叫我年轻人去做国际售后技术支持。其实我是个懒人,我又怕吃苦。于是跟阿菲说,我想做SOHO,或者等SOHO到一定的收入后,可以找个轻松点的工作。但这样说是说,什么立足点都没有,何况我现在在公司就很轻松,就是嫌钱少了。聊了一会儿后,xcc说要去接一个高中的同学,于是先走了。阿菲要我陪她去买移动硬盘,于是坐地铁到华强北。 到赛格,又到那家买了几块硬盘的地方去了,一个日立80GB的笔记本硬盘,加上一个仿冒的三星硬盘盒,好说歹说讲到470块。刚买完硬盘要下楼,阿菲突然说眼睛很黑,人很不舒服,头晕。我还以为是暂时性的头部供血不足之类的,结果阿菲拉着我的衣服说要打车回家,拉着我的手,走路很慢,说话也很轻声轻气了,我才想到,这下有点严重了。打了个车,在车上,阿菲已经几乎没有力气了,车子转弯时的倾斜,都把她甩倒了,我只好抱着她。阿菲靠在我胸口,我看着她虚弱的样子,想着人无助的时候是多么需要有个人能在身旁,靠一靠也好啊,又联想起某某人来。到了她家,给她倒了杯水,我就出来了。一边走一边想,我真是不会照顾人,就这样走掉了,因为我完全不知道我留下来能干什么。虽然看了很多动画片,还想自己也做一个很温柔的男人,这个时候我才意识到,我骨子里是做不成那样的男人的。大概曾经在我怀里依偎过的女人,没有哪个会有过安全感吧!我不懂温柔,我不够成熟。 再回到华强北,几经抉择,买了套微软的无线桌面套装,380大洋,买了10张DVD刻录盘,买了个小挂饰,去编了个手绳。加上这两天吃饭的,一共1500多就这样花出去了。花钱的速度远远快于赚钱的速度啊。