⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diary.txt

📁 一个背单词源码
💻 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 + -