1、用DataWindow设计通用的编码帮助窗口(深圳:独孤求败2003-05-16)-一、前言-用一组数字或键盘字符序列对具有某种相同属性的汉字词组或其它知识信息进行主动编码或被动自动编码,建立相应的编码库,以方便输入或助记,是大多数中文界面应用软件用以解决普通用户与应用软件交互瓶颈的基本方法,为此,设计者必须设计一个编码帮助处理程序,以满足编码信息处理的需要。一个较大的应用软件,该功能代码设计的质量,一方面关系到软件的开发效率,另一方面又关系到人机交互界面的友好程度。我们在许多股票分析软件中所看到的具有良好功能的股票代码帮助处理界面,它既能使用股票名称拼音首字母定位股票名称,又能用股票数字代码
2、查找,就是一个不错的代码帮助处理人机接口-PowerBuilder(以下简称PB)作为C/S环境下的数据库前端开发工具,其面向对象、图形用户界面、可视化,以及方便移植等特点,成为众多程序员的最理想选择之一。笔者在用PB开发应用系统时,用DataWindow设计了一个通用的代码帮助窗口,很好地解决了上述问题。-二、实现方法及步骤-1.用结构画笔新建一结构s_help,其元素列表如下:序号变量名类型注释dw_nameDataStore编码和关键词关系对照表DataStorehelp_namStringDataStore中关键词列名help_codeStringDataStore中数字编码列名hel
3、p_pybmStringDataStore中拼音编码列名help_now_bmStringDataStore当前编码筛选所使用的编码w_titleString编码帮助窗口的title值-2.定义全局变量gs_bm、gs_mc:-stringgs_bm,gs_mc/用来存放编码帮助处理程序所返回的数字编码列和其对应的关键词列的值。-3.定义实例变量istru_help、is_getfocus:-s_helpistru_help/入口参数结构变量-stringis_getfocus=mle_2/当前得到焦点的对象名,初始值为多行编辑器mle_2-4.用窗口画笔新建一响应式窗口(Response)w
4、_help,并在其内放置如下控件:序号控件名控件类型属性值w_helpWindowTitleBarTrueWindowTypeResponsedw_helpDataWindowTabOrder20mle_1MultiLineEditEnabledFalseText编码帮助窗口Width105Height2012TabOrder0mle_2MultiLineEditText0TabOrder100st_1StaticTextText快速定位-5.定义用户事件:-在dw_help对象上点鼠标右键,进入数据窗口脚本编辑器,选菜单DeclareUserEvent,定义EventName为ue_keyd
5、own,EventID为pbm_dwnkey,点击OK退出;-同法为mle_2对象定义用户事件,EventName为ue_keydown,EventID为pbm_char,点出OK退出。-6.为窗口w_help编写脚本:-Open事件脚本:istru_help=message.PowerObjectParmdw_help.dataobject=istru_help.dw_name.dataobjectistru_help.dw_name.ShareData(dw_help)ifdw_help.RowCount()0thenthis.selectrow(0,false)this.selectro
6、w(row,true)endif-ue_keydown用户事件脚本:integerli_keystringls_key,ls_filterbooleanls_flag=trueifkeydown(KeyTab!)thenifis_getfocus=dw_helpthenmle_2.setfocus()endifreturnendififkeydown(KeyEnter!)orkeydown(KeyEscape!)thenifkeydown(KeyEnter!)thengs_bm=this.GetItemString(this.Getrow(),istru_help.help_code)gs_m
7、c=this.GetItemString(this.Getrow(),istru_help.help_name)close(parent)returnelsegs_bm=gs_mc=close(parent)returnendifelse/检测是否有退格键被按下ifkeydown(keyback!)thenls_key=left(mle_2.text,len(mle_2.text)-1)ls_flag=falseiflen(ls_key)1thenistru_help.help_now_bm=istru_help.help_codeendifendif/检测是否有数字键09被按下ifls_fl
8、agthenforli_key=48to57ifkeydown(li_key)thenls_key=mle_2.text+char(li_key)ls_flag=falseexitendifnextendif/检测是否有数字键AZ被按下ifls_flagthenforli_key=65to90ifkeydown(li_key)thenls_key=mle_2.text+char(li_key)ls_flag=falseiflen(mle_2.text)1thenistru_help.help_now_bm=istru_help.help_pybmendifexitendifnextendif/
9、检测是否有数字键az被按下ifls_flagthenforli_key=95to122ifkeydown(li_key)thenls_key=mle_2.text+char(li_key)ls_flag=falseiflen(mle_2.text)0then/*用户键入的字符串序列不为空时,筛选列名不变,否者以刚输入的第一个字符来判断,为数字则以数字编码列名作为筛选列,否者以拼音编码列名为筛选列。*/ifistru_help.help_now_bm=istru_help.help_pybmthenls_filter=trim(istru_help.help_now_bm)+like%+Uppe
10、r(trim(ls_key)+%elsels_filter=trim(istru_help.help_now_bm)+like+trim(ls_key)+%endifelsels_filter=endifthis.SetFilter(ls_filter)this.Filter()this.SetRedraw(true)ifthis.rowcount()0thenthis.selectrow(0,false)this.selectrow(1,true)endifendifendif-8.为多行编辑器mle_2对象编写脚本:-getfous事件脚本:is_getfocus=mle_2send(ha
11、ndle(this),256,35,long(0,0)/送End消息键使光标移到编辑区的尾部-ue_keydown事件脚本:dw_help.triggerevent(ue_keydown)-三、调用方法:-在调用通用代码帮助窗口w_help之前,应先创建一DataStore对象,该DataStore对象必须具有数字编码列、拼音编码列和被编码的关键词列,并从与之关联的表中检索出数据,之后,在任一须调用处编写以下代码(以油品名称编码对照表为例,其上述三列分别为ypbm(油品编码)、pybm(拼音字头编码,液代汽编为YHQ),ypmc(油品名称,如液化汽):s_helpls_help/局部结构变量l
12、s_help.dw_name=ids_ypbm/事先定义并完成了数据检索的一DataStore实例变量ls_help.help_name=ypmcls_help.help_code=ypbmls_help.help_pybm=ypbmls_help.help_now_bm=ypbm/默认为首先使用数字编码检索方案ls_help.w_title=油品名称编码对照表帮助窗口OpenWithParm(w_help,ls_help)-四、功能特点-通用编码帮助窗口具有以下功能特点:-能根据用户键入的字符序列对dw_help对象中的数据行进行筛选,如果键入的第一个字符为间的数字字符,则根据数字编码字段筛
13、选,否则以拼音编码字段筛选,从而实现快速定位;-2用户可按Tab键实现从多行编辑器对象mle_2到DataWindow对象dw_help间的焦点切换;-3无论当前焦点处在对象dw_help上,还是处在对象mle_2上,均使得用户的键入在对象mle_2的Text属性中同步表现,并相应地触发对对象dw_help的数据行进行筛选;任何时候用户都可按Escape键不选择任何数据行而退出并关闭帮助窗口;-4支持Backspace键按先进后出的方式依次删除键入的字符,并同步触发对象dw_help中的数据行的筛选;-5当当前焦点处在对象dw_help上时,可用上、下光标键让光带在数据行上滚动;按回车键或双击
14、鼠标左键选中数据行退出并关闭帮助窗口。-五、总结-通用编码帮助窗口的设计,在充分利用PB独特的DataWindow对象特点的同时,巧妙地运用其过滤器函数Filter(),使DataWindow对象dw_help中的主要缓冲区(PrimaryBuffer)与过滤缓冲区(FilterBuffer)中的数据行,能根据用户的键入,相应地进行调度,以达到满足用户快速检索的需要;一次性地从后台数据库中检索数据编码对照表,并把数据保存在一DataStore对象(本地内存)中,通过数据共享函数ShareData()完成其数据行到编码帮助窗口对象dw_help的传递,大大节省了(网络后台)数据库检索的开销,极大地提高了窗口的响应速度。