📄 diary.txt
字号:
; 开发环境 : masm8.2.c+RadASM 2.1.0.6+WinXP
; 程序名称 : Encyclopedia
; 程序用途 : asistant to search word and phrase, the initial vocabulary
; is 16010, which you can increase or decrease. You can even
; build your own word list.
; 最新版本 : 1.0
; 程序作者 : zhasm
; 程序建立 : 21:48 2004-12-27
; 最后修改 : 23:52 2004-12-27;试图通过控件子类化来达到控制listview右侧scrollbar的目的;未果
19:52 2004-12-29;暂时放弃对listbox右侧scrollbar的控制;完成主要控件的初始化工作;
计划:在editbox中输入普通字符时,自动定位listbox
输入特殊字符*?时,过滤,替换为标准SQL字符%_,显示结果
在选定listbox词条时,在editbox结果栏显示词条内容;
22:28 2004-12-29 已经实现上述功能;
计划:美化界面,修缮功能,加快运行速度
改变EditControl的背景颜色;疑问:怎样改变只读文本控件的前景/背景颜色?????
resize
05:05 2004-12-31 提高显示速度的方案:在搜索栏输入字符后,若没有发现通配符,则不使用
sql语句;
05:40 2004-12-31:已经实现!
05:40 2004-12-31 计划:接收按键消息,包括enter;up,down,left,right;
05:53 2004-12-31 在主窗口接收WM_CHAR消息失败.计划子类化搜索栏 07:15 2004-12-31
10:59 2004-12-31 计划:继续进行按键消息定制,包括enter;up,down,left,right
11:06 2004-12-31 OK!
14:20 2004-12-31 已知的问题:
1.SQL的执行:select * from xx where Word like 'a's b'
因为字符串中有’,所以出现错误。查手册应该能解决
2.Input编辑框不能接受超过36个字符,否则会自动退出。尚未解决。
18:53 2004-12-31 计划:子类化按钮函数,以便能ownerdraw 19:02 2004-12-31 此路不通
08:37 2005-01-01 到目前为止,已经取得的进展有:
输入框能过滤*,?的通配符,当然也可以用SQL自带的%_;
能够接收UP,Down键,PageDown,PageUp键的输入来调整ListBox的显示
字符数bug尚未克服
ComBo能显示数据库中所有的词库名,当然到目前只有一个词库;自动过滤系统库
WM_SIZE 函数编写得相当令人满意,每次Resize时,都顺便重新分割statusbar
可以增加新的单词,但不能编辑和删除.不会太难.
14:21 2005-01-01 可以编辑词条了。
15:56 2005-01-01 添加了F1,F2,F3,F4,F5快捷键。参考了罗云彬的帮助文件。
20:47 2005-01-01 找到"36个字符"bug了。在CharFilter函数中。使用edi时,没有先开辟一块
可用的内存,以至于将内容写到了只读空间。
解决方法:先local lbuf[256]:byte,再lea edi,lbuf即可。
08:29 2005-01-02 增加了删除词条功能。
总体印象:整个程序只是能运行而已,有很多根深蒂固的不完善之处。
08:57 2005-01-03 恐怕要担搁一段时间了。有些失去兴趣。负面因素太多。
再尝试着解决TabStop这个问题吧。在原来的Dialog模板里,这个问题不是
问题;在DialogAsMain模板里,按Tab键,不能在控件之间切换。没有足够的把握
来解决。只好翻阅帮助文件来碰碰运气。
09:31 2005-01-03 迄无济。:(
10:03 2005-01-03 终于搞定:)
在Iczelion的教程中找到了。修改后程序如下:
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.BREAK .if !eax
invoke TranslateAccelerator,hWnd, @hAccelerator,addr msg
mov esi,eax
invoke IsDialogMessage, hWnd, ADDR msg
.if eax == 0 || esi==0
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endif
.endw
10:13 2005-01-03 筑塔于浮砂之上。对windows消息循环机制一知半解,就想编windows
程序,遇到各种各样的困难,自然毫不奇怪。随着代码的增加,维护会越来越
困难,或许会成为不可能。浅薄的基础,恶劣的编程风格...
我想休息了。眼睛疼痛。心情沮丧。
尚未实现的功能:系统设置、弹出菜单
这里本打算实现词库的新建、删除、导入、导出功能。新建可以是保存左侧
Listbox中的查询记录,当然也可以建立空库。新库仅仅记录单词;其解释以及
其他信息均不令设空间保存,统统设在总库中。
新表建立后自动在Combo中添加词库名称;改变Combo选择时自动切换词库。
删除表的语法是DROP TABLE tablename,删除之前需要关闭该表。
弹出菜单是针对于listbox的。对选定的词条,可以方便地编辑、转到其他库中。
转到其他库的菜单项自动生成。
搜索涉及的SQL语句组需要优化。仅仅用了SQLExecDirect一个函数来处理所有的情况,
据说没有 SQLPrepare 之类的冬冬迅速。有心情之后,have a try,反正
自己也没有损失。
20:09 2005-01-03 发现有若干bug;窗口最大化后,需要点一下才能刷新窗口;在Input
窗口输入文字时,会有4个字母同时出现。
与先前代码相比,终于找到问题所在,改正如下:
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.BREAK .if !eax
invoke TranslateAccelerator,hWnd, @hAccelerator,addr msg
mov esi,eax
invoke IsDialogMessage, hWnd, ADDR msg
.if !esi && !eax
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endif
.endw
虽然不明白原因,但经过尝试,终于搞定.不明白为甚末不是TranslateAccelerator
|| IsDialogMessage消息导致不能重绘,非得是 &&....等一等,好像有些心得;
莫非是这样:这两个函数的返回值若为○,则表示未处理,需要翻译和分发;
若为非○,则表示已经处理.因此,只有当两个函数TranslateAccelerator和
IsDialogMessage都没有进行处理,即msg既非快捷键信息,又非窗口信息时,windows才
兼容并包地承担翻译并分发的任务.
不错不错.我对自己的解释很满意.
zhasm LvUP!
zhasm经验值提高!
zhasm魅力值提高!
右键菜单条:列表令存为:
18:12 2005-01-04 在网上找到答案: sql的转义字符,对于单引号,只需再加一个单引号即可.例如:
要查找所有带'的单词,可以这样:
SELECT * FROM GMAT WHERE 单词 LIKE '%''%'
在Gmat词库中找到的单词数是54,即有54个单词(词组)中间带有'.
既然这样,解决方案也就有了.
执行旧的程序,先找到所有的带'的单词;
随便点击一个,得到错误信息:select * from encyclopedia where 单词='all one's life'
它需要一个检查过程,将词条中出现的所有的'都替换成''.当然了,通常情况下只有一个'.但有必要
过滤所有.
;SingleQuote2Two proc uses edi esi lpString:dword
;作用:将lpString 中出现的'替换成两个'
;参数:
;返回值:
;
;开发日期:
;备注: lpString 的长度不能超过256
LOCAL lpbuf[256]:byte
invoke lstrlen,lpString
.if eax>256
MyDebug "词条长度大于256!执行出错在list.inc文件下SingleQuote2Two函数!!!"
ret
.endif
mov esi,lpString
lea edi,lpbuf
.while 1
movzx eax,byte ptr [esi]
.if eax==27H
mov [edi],al
inc edi
.elseif !eax
mov [edi],al
.break
.endif
mov [edi],al
inc esi
inc edi
.endw
invoke lstrcpy,lpString,addr lpbuf
ret
SingleQuote2Two endp
19:45 2005-01-05 上一个问题已经解决;但新的问题随之而来.原因是我想改变Item的定义,改变词库文件
的结构,让它能够多容纳一些东西,不受256字符之限.我想把除单词,音标之外的所有列都
改为memo类型.这样一来,所有的函数都需要改动,包括SingleQuote2Two.
需要先写一个小程序试试.
20:04 2005-01-05 界面美化方面:在网上找到答案,可以自定义只读文本控件的背景颜色,而且不必
显示光标! 极爽.
还想将用鼠标拖动来调整listbox和editbox的大小.不急,慢慢找例子解决吧.不是大问题.
"19:45 2005-01-05"的问题才是值得认真思考的.天啊.我不想再从0开始了.
21:29 2005-01-05 今天实在不行了,让我只做美化和维护工作吧.我会优化代码的...
18:19 2005-01-09 周末没有做;思考了一点点.
思路如下:
在edit,addnew上各加上一个combobox,来选择词库类别
这次是针对数据库进行修改,增加了attr表格.
21:48 2005-01-14 终于又到周末了。能再写一点点代码吗?
我想试验一下memo的数据类型了。总体上有些乱了阵脚。
我决定从头写代码了。即使很累。很烦。妈的。
18:48 2005-01-16 怎样才能成为武林高手?是扎实的基本功练习还是武功密笈?我觉得应该是具有
爱武如命的心态,适合练武的身材,有明师指点,有武功密笈作为参考,有展示
的机会,太复杂了。
21:47 2005-01-16 改变词库的一些列的属性。把有字数限制的“文本”类型改为无字数限制的
“备注”型了。
05:40:17 2005-04-09 对备注型字段的内存分配问题,我一直没有找到良好的解决方法;这一点
导致整体进度受到影响,整个程序便像Aogo的IDE一样变得遥遥无期。这一问题到现在
仍无十足把握,于是我开始先做别的了。于是相隔了三个多月之后,终于下定决心,继续
攻关了。
先完善现有功能,找回感觉。
05:51:13 2005-04-09
在FILTER模块中,思路:当在词首、关键字所属的编辑框中有所改动时,自动生成SQL语句
填充到SQL语句框中,并随时更新;
当在SQL语句框中输入内容时,上述编辑框自动变成灰色,不可编辑。(放弃;17:46:37 2005-04-10)
07:27:25 2005-04-09
我想到了一种行之有效的方法来管理词库。
为原词库增加一个字段,名称为“类型”,属性为“数值”,当新建词库时,只是重新
设定了一种数值而已。主词库的值为0,第一种新词库,比方说是“天文”,其值为
(二进制的)1,第二种为010,第三种为011, 第四种为100。
词库的新增单词时,物理上新增到主词库,当然也可以附带地,逻辑上新增到其它
子词库中。
对词库中的单词进行删除时,情况比较复杂。
若单词的类型非0,说明它同时从属于其它子词库,只需将其当前的属性删除即可;
若单词的类型为0,说明它仅仅属于主词库,需彻底删除之;
其它事件呢?让我想想;
新增一个词库“table”,它记录着词库名称与其数值的对应关系。新增词库的
过程其实就是对此表添加一条记录的过程。当然其对应数值要精心选择,按1,2,4...
的2的幂规律逐渐增大,以便能让同一词条可以同时从属于数个子词库共有。
主词库不允许删除,最多允许清空。
子词库的删除,其实是编辑词条属性而已。假如我要删除“电脑词汇”词库,而它的
值为64,则对主词库中属性包括64的所有词条(A SUB B XOR C AND D OTHER )64.
(范伟曰:有点晕,让我吕一吕)
想清楚了,应该是sub.
如此一来,新增一个词库的过程,如果同时批量增加当前列表中的所有词汇的话,
就是select * from where ... and ...y了。
之所以如此煞费苦心,是想节省空间;其代价是浪费时间.编程的复杂度大大提高,维护难度
也随之加大.会不会得不偿失?我有些想放弃了.
可以断定的是,如果用多表的方式,固然会浪费空间,但实现起来相对容易得多.
17:35:26 2005-04-10
filter模块又新增了saveas选项,只是现在状态不佳,竞然无法安心编程.
18:52:46 2005-04-10
filter模块中新增的saveas选项已经令我满意.有成就感
21:42:32 2005-04-10
control模块基本成熟.
整个程序基本成熟.
准备上传.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -