---- 数据库管理系统是目前在企事业、 商业单位中应用最广泛的一类软件, 在国内以 VFP最具代表性。 这里把笔者及同行在工作中所得到的一点经验进行了整理,希望能对大家有所帮助。 一.INSERT命令与APPEND命令 ---- 这两个命令的基本作用都是往一个已经打开的数据库中添加新的记录,不同点在于: INSERT命令可以在数据库的任意位置插入新的记录,而APPEND命令只能在数据库的尾部添加新的记录。本人在编程中,有一次为了保证一个数据库记录的顺序按一定的要求排列,从而使用了INSERT命令在指定的位置插入新的记录。然而在程序运行过程中,却发现新的记录总是被添加在数据库的尾部。经过一番对程序的仔细检查,本人想起为了实现对数据记录的快速检索,曾为该数据库建立了一个结构复合索引文件,此索引文件总是随着该数据库的打开而自动打开,而在使用数据库文件时,如果与其相联的索引文件同时打开了,则INSERT命令与APPEND命令的作用是相同的。解决的办法是:在使用该数据库时,如果不苛求数据库记录的物理顺序的话,可以用SET ORDER TO〈索引名〉来控制数据库记录的逻辑顺序。否则,可以用SORT命令对其进行物理位置排序。当然,后者的情况比较少见,且费时费力。 二.实现组合框的记忆选择 ---- 在编制管理系统时,往往一个相同的系统要由好几个部门使用,这样,在进入系统时,就要选择不同部门的名称。作为一个使用者,我们希望选择第一次,以后每次进入就不用再选择。以下方法将实现此功能。 ---- 新建一个表单,在上面创建一个“组合框”对象,对表单做如下设置: INIT EVENT: set safety off public z if .not.file(′mv.mem′) z=1 else restore from mv additive endif thisform.combo1.additem('第一个单位') … thisform.combo1.additem('第二个单位') thisform.combo1.listindex=z DESTROY EVENT: z=thisform.combo1.listindex save to mv all like z 三.声音的播放 ---- 在程序的编制过程中, 适当地使用声音,可达到意想不到的效果,下面是在VFP中加入声音的几种方法: ---- 1. 使用set bell to 命令 ---- 用set bell to 命令可以直接播放声音,此方法主要适用于给按钮加上声音效果,比如有一个“开始”按钮,要在按下它时能发声,可在其CLICK EVENT中加入如下代码: wav_name='sound.wav” set bell to wav_name,0 chr(7) 其中sound.wav为要播放的声音文件。 ---- 2. 调用mplayer2.exe来播放 ---- Mplayer2.exe是Windows自带的媒体播放器,在VFP中,可使用如下命令来播放声音文件: Run /n7 c:\progra~1\micros~2\mplayer2.exe'sound.wav' ---- 若想在启动时播放声音,可将该语句放入表单的init事件中。这种方法适宜于用来播放背景音乐,其缺点是播放时,Windows工具栏上有一个最小化后的媒体播放器。 ---- 3. 使用OLE控件在表单中添加一个OLE对象可按如下顺序: ---- ① 新建一个表单,选中表单控件工具栏的OLEcontrol; ---- ②在表单上按下鼠标左键, 建立OLE对象,在出现的对话框中选择声音对象,选择以“create form file”方式插入; ---- ③选择要插入的声音文件,确定退出; ---- ④用Doverb方法来执行,其中Doverb(0)用来播放,Doverb(1)用来编辑。例如要在表单启动时同时启动声音,可在表单的init事件中加入如下语句: thisform.olecontrol1.doverb(0) ---- 4. 使用Microsoft Media Player控件 ---- 在一个表单中加入声音的顺序如下: ---- ①在VFP中,选择“工具”选单的“选项”; ---- ②在出现的界面中选择“控件” , 选中“ActiveX控件” ,在选定对话框中选择 “Microsoft media player”,确定退出该界面; ---- ③在工具栏中选择“ActiveX控件” ,选中“Microsoft media player”控件,在表单上单击鼠标左键,这样就创建了“Microsoft media player”对象; ---- ④以下语句可实现声音的播放: thisform.olecontrol1.open(″sound.wav″) playcount 可用来控制播放的次数; ---- 如想实现重复播放,可在EndOf Stream Event中加入语句:this.play。 ---- 这种方法也可以用来播放.avi、.mpeg等文件,只需把上面的“sound.wav”文件改为相应类型的文件即可。 ---- 5. 使用MCI ---- MCI(media control interface: 媒体控制接口)是多媒体设备和文件的标准接口。多媒体应用程序可以利用MCI控制各种各样的多媒体设备和文件。 ---- 下面通过一个例子说明如何用MCI实现对音频的控制: ---- ①建立一个表单Form1,对表单作如下设置: Form1.load: &&声明MCISendString命令。 Form1.Destroy: DECLARE LONG mciSendString IN C:\WINDOWS\SYSTEM\WINMM.DLL STRING sCom,STRING sReturnString,LONG lReturnLength,LONG lpWnd DECLARE LONG mciExecute IN C:\WINDOWS\SYSTEM\ WINMM.DLL STRING sCommand Form1.Destory: Clear dlls &&清除声明的dll函数; ---- ②新建四个按扭,其caption值分别为:“打开”,“播放”,“停止”,“关闭”,分别在各按扭的click事件中加入以下代码: thisform.open.click: mciexecute('open c:\mywave\toolbird.wav alias cc') thiform.play.click: buffer=space(100) =mcisendstring('play cc',@buffer,80,0) thisform.stop.click: buffer=space(100) =mcisendstring('stop cc',@buffer,80,0) thisform.close.click: buffer=space(100) =mciSendString('close cc',@Buffer,80,0) 四.工具条的制作 ---- 工具条在Windows应用系统中使用很广泛,在VFP中也使用了很多工具条,如常用工具栏、表单控件、报表控件等。在VFP应用系统中有两种实现工具条使用的方法。其一,如果你不脱离VFP系统环境(应用程序扩展名为APP) ,可通过定制工具栏或“object. show” 指令,来使用VFP系统提供的各种工具栏。其二,当你把应用程序编译成可执行程序(EXE) 后,上述方法和命令会失效,因此需要通过程序来实现工具条的使用。下面是本人制作和显示一常用工具栏的过程。 ---- (一)、 建立类库 使用类设计器或“Create class'命令创建一个新类。设置类名为“常用工具栏”,派生于“Toolbar”,取类库名为Appclass。 从表单控件工具栏添加各命令按钮到程序窗口,中间可用分隔符按钮分开。 设置各命令按钮相应的Picture(图形)及ToolTipText(提示)属性。 设置各命令按钮被触发的事件程序: [新建]Click Event: create [打开] Click Event: use getfile('dbf') [保存] Click Event: 略 [打印] Click Event: 略 [打印预览] Click Event: 略 [剪切] Click Event: sys(1500,'—med—cut','—medit') [复制] Click Event: sys(1500,'—med—copy','—medit') [粘贴] Click Event: sys(1500,'—med—paste','—medit') [撤消[Click Event: sys(1500,'—med—undo','—medit') [重做] Click Event: sys(1500,'—med—redo','—medit') [帮助] Click Event: sys(1500,'—mst—help','—msystem') ---- (二)、 显示工具条 ---- 在主程序或选单常规选项内添加如下程序: set classlib to appclass toolbars = CREATEOBJECT(′appclass.常用工具栏′) toolbars.show toolbars.dock(0) ---- 在应用中有时为了使窗口显示更多的内容,需关闭或隐藏工具栏,这时可通过指令 [Object.Show]、[Object.hide]来显示和隐藏(可在选单栏通过程序控制)。同时工具栏可以浮动在窗口中,也可以停放在应用系统主窗口的上部、下部或两边。停放工具栏位置命令是:ToolBar.Dock[nLocation[,X,Y]]。根据nLocation参数确定工具栏位置,其中[- 1]为不停放工具栏(浮动);[0]在主窗口的顶部停放工具栏;[1]在主窗口的左边停放工具栏;[2]在主窗口的右边停放工具栏;[3]在主窗口的底部停放工具栏;X, Y指定工具栏停放位置的水平坐标和垂直坐标。 ---- 设计图如图所示(供参考)。(见T01.jpg) 五.“飞播字幕”的制作 创建一个新类, 名称为FlyString,选择派生于容器类(container),并存放于FlyString.vcx文件中。 将FlyString的大小调整为120×20大小,并设置SpecialEffect属性为“凹下”。 新建属性cOldFlyText, 其初始值为空,此属性主要用于定时器的Timer事件,用户不需设置,也不用改动,在过程中会自动填入。 新建属性cFlyTexy, 其初始值为空,也可输入一些初始化信息,比如:“欢迎您使用本程序”,则当建立一新对象后,默认的将是此信息,使用者可将其改为所要显示的具体信息。 新建属性nCurPos,其初始值为1,用于指示当前显示到第几个字符。 在FlyString上放置一个定时器控制Timer1, 将其属性Interval设置为700,以取得较好的显示结果,如果其值太小,则显示过快,用户可根据需要自行设置。 在Timer1的过程Timer中添加代码(代码在可视对象内的右侧)。 ---- 这个控制的效果是让字幕从左向右飞行,从右向左飞行的原理与此类似,读者可参考自行编制。 六.巧用Grid对象 ---- 我们在用VFP设计一个应用系统时, 信息的浏览是其中相当重要的一个功能,通常其实现方法均采用Grid对象来显示数据信息。但在使用过程中也存在一些不足,就是当使用者在记录之间移动时,只有获得焦点的那条记录的某一字段以不同于Grid背景的颜色显示,给人一种非专业的软件制作的感觉,如果不用Grid对象,就需要编制复杂的过程去实现这一功能。 ---- 其实,利用Grid对象,我们完全可以实现当数据记录移动时,整条记录均用同一种颜色突出显示,即当数据记录移动时,用颜色动态变化显示相对光标所在的位置。笔者在工作就成功地运用了这一方法,从而使整个系统的信息浏览功能大为增色,显示了与专业软件同样的魅力。 ---- 首先定义一个Grid对象, 并设置好其属性,然后在其AfterRowColChange事件过程中写下如下的内容: LPARAMETERS nColIndex this.setall(″dynamicbackcolor″,″ iif(this.activerow〈〉recn(),rgb(255, 255,255),rgb(0,0,255))″,″column″) ---- 这样一来, 就能达到在数据记录移动时,在相对的Row显示动态颜色变化。在上面的设计中首先使用了SetAll() 方法设定Grid中的Column层次的 DynamicBackColor(动态背景颜色属性),然后在第二个参数中使用了Grid 对象的ActiveRow反映相对的行数,若不等于记录编号时,则通过 RGB(255,255,255) 送出白色背景,若相对行等于记录编号时,则通过 RGB(0,0,255)送出绿色背景色(读者可根据个人爱好自行设定)。 ---- 另外,还要提醒读者有两点需要特别注意: 在AfterRowColChange事件过程中一定要使用DynamicBackColor属性, 而不能用 BackColor属性,因为这样会将所有的数据记录变为设定的颜色。 因为使用了ActiveRow属性与RECN0()函数配合使用,因此请不要在所显示的记录中设定主索引,因为ActiveRow属性不会自动配合索引值中的记录编号(若设定主索引,则执行之后将从当前记录开始直至第一条记录均为设定的特显颜色)。 七.改进VFP的searchclass.vcx ---- 我们都知道利用VFP提供的WIZARDS类库中的searchform.vcx和searchclass.vcx可 以创建一个通用查询表单。这个查询非常通用,操作界面也非常简单明了。但是,此表单有一个缺憾,就是此表单的字段对话框就只能显示字段名,如果数据表的字段名为英文时,显示的字段名对操作人员而言就显的不够清楚。我们一般在设计数据库时给每个字段加以中文标题,用于对字段名的详细说明,就像用BROW命令时,就可以用字段标题代替字段名一样, 我们也可以通过对searchclass.vcx的修改使其用字段标题代替字段名显示,这样就使得整个界面非常友好。 ---- 打开WIZARDS类库,选择searchclass.vcx。 ---- (一)、修改cbofield1的init事件 ---- 在下列语句 FOR m.i = FCOUNT() TO 1 STEP -1 IF INLIST(aWizFList[m.i,2],'G','M','U') &&Memo field =ADEL(aWizFList,m.i) DIMENSION aWizFList[MAX(1,ALEN (aWizFList,1)-1),NUM_AFIELDS] ENDIF ENDFOR 后加上以下程序段: *获取当前的数据表名 tname=alias() *获取数据库名 dname=cursorgetprop('database') set database to (dname) *获取字段标题 for m.i=1 to alen(awizflist,1) fname=tname+′.′+awizflist[m.i,1] *将字段名保存 awizflist[m.i,16]=awizflist[m.i,1] if !empty(dname) fcaption=dbgetprop(fname,′field′,′caption′) *用字段标题代替字段名 awizflist[m.i,1]=iif(!empty (fcaption),fcaption,awizflist[m.i,1]) endif endfor THIS.RowSourceType = 5 THIS.RowSource = 'aWizFList' THIS.VALUE = THIS.LIST[1,1] 将原最后一句THIS.VALUE=THIS.LIST[1]删除 ---- (二)、修改cbofield2的init 事件 THIS.RowSourceType = 5 THIS.RowSource = 'aWizFList' THIS.VALUE = THIS.LIST[1,1] ---- (三)、修改searchitem方法程序 ---- 在语句m.cFldName = ALLTRIM(m.oField.Value)后加上以下程序段: *查找对应显示标题的字段名 for m.i=1 to alen(aWizflist,1) if m.cfldname=alltrim(aWizflist[m.i,1]) *用字段名代替字段标题 m.cfldname=alltrim(aWizflist[m.i,16]) endif endfor ---- 这样通过对以上二个字段组合框的init事件和searchclass方法程序的修改就可以完成在字段组合框显示字段标题,而非字段名,只要我们在数据表中设置好每个字段的标题, 就可以在字段组合框中显示运用。其实WIZARDS类库中类都可根据我们的实际需要进行改进,在程序中直接引用,这样就减少了我们重新设计类的麻烦。 八.制作影视字幕 ---- 在影视剧中,我们经常见到这样的字幕效果:在黑色的背景画面下,红色(或白色)文字渐渐显现出来,然后又渐渐消失在背景中。要实现这个效果并不难,今天我们就用中文版Visual FoxPro 3.0的表单来模仿一下这个文字渐入渐出的动画过程。 ---- (一)、添加控件,制作表单 ---- 1.在新建的空白表单中添加一个“标签”控件并选中它,然后在其对应的“属性” 窗口中依次进行如下设置: AutoSize .T. BackStyle 透明 Caption 渐入渐出效果演示 FontBold .T. FontName 幼圆 FontSize 18 FontUnderline .T. ForeColor 0,0,0 ---- 其它没有提及的设置保留默认值,以下同此。 ---- 2.在表单中添加一个“命令按钮” 控件并选中它,然后在其对应的“属性”窗口中依次进行如下设置: Caption 演示开始 FontName 仿宋_GB2312 FontSize 14 Height 30 Width 217 ---- 3.在表单中添加一个“计时器”控件 ,它可以放在表单中的任何位置,表单运行时是不可见的。选中它,然后在其对应的“属性”窗口中进行如下设置: Enabled .F. Interval 100(ms) ---- 经过上面的步骤,再对控件的位置做些调整后,即得到如图(见t02.jpg文件) 所示的表单。 ---- (二)、为控件添加代码 ---- 1进入“演示开始”(Command1)按钮的“Click”事件代码窗,输入以下代码: if thisform.timer1.enabled=. F. thisform.timer1.enabled=. T. endif ---- 用鼠标单击该按钮后,计时器开始运行,并启动Timer事件。 ---- 2.进入“计时器”的“Timer”事件代码窗,输入以下代码: i=i+10 if i>=255*2 thisform.timer1.enabled=. F. i=0 endif if i>=255 thisform.label1.forecolor=RGB (255*2- i, 0,0) else thisform.label1.forecolor=RGB (i, 0,0) endif ---- Timer事件的作用是, 当计时器开始运行时(enabled值为.T.),就以Interval所规定的值为时间间隔不断运行Timer中的代码,直到计时器的enabled值为.F.为止。 ---- RGB(red,green,blue) 函数通过其中红、绿、蓝三个参数的值(0~255)的不同组合可得到不同颜色。上面代码的作用即是通过逐渐改变标签(Lable1)中文字“淡入淡出效果演示”的颜色,使其从黑色(0,0,0)变为红色(255,0,0),再从红色变回黑色,因为前面将标签背景已设为透明,即与表单的颜色相同,所以当表单的颜色也为黑色时,就实现了文字的渐入渐出效果。 ---- 具体实现的代码很简单: ---- (1) 当i>255*2,表示文字已经过了由黑变红再返回黑色的过程,于是停止定时器运行。 ---- (2)当i>255,文字处于由红转黑的渐隐过程,此时红色值255*2-i由255逐渐减为0。 ---- (3)当i<255,文字处于由黑转红的渐现过程,此时红色值i由0逐渐增至255。 ---- 要注意的是, 如果变量i每次循环的增量和计时器中Interval的值设置不当,会出现文字一现即逝或半天显不出来的情况。 ---- 3.在表单空白处右击鼠标进入“Form1” 的“Activate”事件代码窗,为在计时器中使用的变量i进行定义和初始化: Public i i=0 |
|