编程小技巧04.docx
- 文档编号:5465971
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:68
- 大小:618.58KB
编程小技巧04.docx
《编程小技巧04.docx》由会员分享,可在线阅读,更多相关《编程小技巧04.docx(68页珍藏版)》请在冰豆网上搜索。
编程小技巧04
如何在启动EXE文件时隐藏VFP的主窗口显示
用文本编辑器编辑一个CONFIG.FPW文件,写入一行“Screen=OFF”,将CONFIG.FPW保存到你的项目所在的目录,并将该文件加入到项目管理器中的其他项中,如下图:
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
如何为应用程序添加背景音乐
1、调用Windows的APT函数SndPlaySound播放声音文件(.WAV)。
首先建立一个表单(FORM1),然后编写表单的Activate过程:
PUBLICSound
SETLIBRARYTOFoxtool.FLL
Sound=Regfn("SndPlaySound","CI","I","Mmsystem")
=Callfn(Sound,"BACK.WAV",1)
再编写FORM1的Release过程:
=Callfn(Sound,"",10)
SETLIBRARYTO
运行表单后,BACK.WAV就作为背景音乐在后台播放,关闭表单时音乐自动停止。
如果想让音乐自动循环播放,将Activate过程中最后一句换为:
=Callfn(Soun,"BACK.WAV",1+8)即可。
注意:
如果你的计算机没有声卡,运行以上程序时将出错。
2、用“SETBELLTO”响铃命令。
编写表单的Activate过程:
SETBELLON
SETBELLTO"BACK.WAV"
?
?
CHR(7)
再编写表单的Release过程:
SETBELLTO
注意:
该种方法在运行时,不能进行循环播放,不能中断音乐的播放,但是在没有声卡的情况下,该种程序不会出错,只是进行PC喇叭的响铃一次。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
如何将金额由小写变为大写
1、编写如下函数。
该函数的返回值能够舍去数字之间的零,比较准确,符合会计准则,比较适合打印银行存单等。
PARAMETERSnAmount
PRIVATEALLLIKEL_*
L_S1='零壹贰叁肆伍陆柒捌玖'
L_S2='亿仟佰拾万仟佰拾亿仟佰拾万仟佰拾元角分'
nAmount=LTRIM(STR(nAmount*100,LEN(L_S2)/2))
L_LEN=LEN(nAmount)
L_SS2=RIGH(L_S2,2*L_LEN)
L_DX=''
L_0JS=0&&连续零的个数
L_N=0
DOWHILEL_N L_N=L_N+1 L_SZ=SUBSTR(nAmount,L_N,1) L_SZ=SUBSTR(L_S1,2*VAL(L_SZ)+1,2) L_DW=SUBSTR(L_SS2,2*L_N-1,2) IFL_SZ='零' L_SZ='' DOCASE CASEL_DW$'亿元' CASEL_DW='万' IFRIGH(L_DX,2)='亿' L_DW='' ENDIF OTHERWISE L_DW='' ENDCASE L_0JS=L_0JS+1 ELSE IFL_0JS>0 L_SZ='零'+L_SZ ENDIF L_0JS=0 ENDIF L_DX=L_DX+L_SZ+L_DW ENDDO L_DX=L_DX+IIF(RIGH(nAmount,1)='0','整','') RETURNL_DX 2、编写如下函数。 该函数的返回值比较适合于一些单据的填空式打印,如增值税发票等。 PARAMETERSnAmount,IsDW nDZS=STRTRAN(ALLTRIM(STR(nAmount,18,2)),".","")&&把小数点去掉 cHZDX="零壹贰叁肆伍陆柒捌玖" cDW="分角元拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿" cRMBDX="" nCd=LEN(nDZS) FORi=1TOLEN(nDZS) cNumbers=SUBSTRC(cHZDX,INT(VAL(SUBSTR(nDZS,I,1))+1),1)&&数字转换 IFIsDW=1&&如果要单位 cDWs=SUBSTRC(cDW,nCd,1) ELSE cDWs=SPACE(0)&&不要单位的情况下 ENDIF cRMBDX=cRMBDX+cNumbers+cDWS nCd=nCd-1 ENDFOR RETURNcRMBDX ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 如何从表单返回一个值 可以在表单的Unload事件中用来RETURN命令返回一个值。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 如何在输入无效的情况下使用户不能离开当前对象 在Valid事件中使用RETURN0命令。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 为什么编译后的程序运行时屏幕一闪就不见了 你需要在你的程序中建立“等待状态”。 可以用READEVENTS命令来建立等待状态。 要清除等待状态,可使用CLEAREVENTS命令。 如果你只有一个屏幕,把表单的WindowState属性设置为Modal。 这也提供等待状态,但是不允许你使用菜单。 当模式表单被释放时,等待状态结束并返回至操作系统。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 如何把数组作为参数传递给表单 在FoxPro中,数组必须按址传递。 SETUDFPARMS决定参数的传递方式。 在默认情况下,当你用DO…WITH调用过程或表单时,参数是按址传递。 在函数或方法中,参数是按值传递。 DIMENSIONarray[10] DOFORMForm1WITHarray 在这种情况下,你必须用一个"@"符号强迫参数的传递为按址传递。 DIMENSIONarray[10] MyForm=CREATEOBJECT("Form1",@myarray) ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 如何检查变量是否存在 使用TYPE()函数来检查一个变量是否存在。 IFTYPE("Var")=.t. MESSAGEBOX("Itexists",0,"")? ENDIF 或你可以检查是否TYPE("Var")="U",若是,则变量不存在。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 为什么不能从VALID事件中把焦点设置到另一个对象上 SETFOCUS()方法不能从Valid事件中运行,试着用LostFocus事件作为替代。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 为什么退出VFP时提示“不能退出VFP” 使用ONSHUTDOWN命令。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 如何设置多个过程或类文件 使用ADDITIVE子句: SETPROCEDURETOproc.prgADDITIVE SETLIBRARYTOclass.vcxADDITIVE 为什么当filter设置时,应该用locate代替seek 当你的查找字段是建立了索引且当前索引是该索引时,SEEK通常是查找单个记录的最快的方法。 不过,当设置了filter时,SEEK非常慢。 理由是SEEK将查找符合你的搜索标准的第一个记录。 FoxPro为了移动记录指针到相应的记录上,必须找到和你的标准相匹配且和filter条件相称的记录。 和SEEK不同,LOCATE是可进行Rushmore优化的.? 当一个可优化的filter起作用时,LOCATEFORCustId=m.CustId通常比SEEKm.CustId更快。 在GOTOP和GOBOTTOM中也存在相似的问题。 用无子句的LOCATE来执行GOTOP,将会使记录指针移动到乎合filter条件的第一个记录。 要执行GOBOTTOM,设置当前索引标识的降序然后LOCATE,在将索引设置为原来的升序。 如何同时设置多个对象的同一属性 用SetAll方法。 例如,你决定为全部网格中的标题设置9号宋体。 将以下代码放入网格的Init事件: THIS.SETALL("FontName","Arial","Header") ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 必须总是打入长长的对象层次列表吗 不,你可以使用变量替换,以下两种方法的效果是相同的: Thisform.Pageframe.Page1.Container.Object.Caption="This" Thisform.Pageframe.Page1.Container.Object.Left=10 Thisform.Pageframe.Page1.Container.Object.Top=50 temp=Thisform.Pageframe.Page1.Container.Object temp.Caption="This" temp.Left=10 temp.Top=50 另一种方法是使用WITH命令: WITHThisform.Pageframe.Page1.Container.Object .Caption="This" .Left=10 .Top=50 ENDWITH ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ Wait命令的应用 Wait命令应用很方便,我在VB,DELPHI等语言中就始终没有找到与其功能相似的语句, 可是我们在VFP中使用时常常只是用到了它的部分功能,而忽略了一些很有用的功能。 Wait 命令也有不少子句: WAIT [cMessageText] [TOMemVarName] [WINDOW[ATnRow,nColumn]] [NOWAIT] [CLEAR|NOCLEAR] [TIMEOUTnSeconds] 比如我们的使用常常只是: WAITWIND'暂停…' 使'暂停…'这两个字停留在其默认窗口的右上角,其实完全可以用[ATnRow,nColumn]来改 变其停留位置: WAITWIND'暂停…'AT10,30 使'暂停…'停留在指定的第10行,第30列上。 WAITWIND'暂停…'+CHR(13)+'另起一行…'AT10,30 在提示信息中加上CHR(13),提示信息可分行显示。 而: WAITWIND'暂停10秒…'TIMEOUT10 则可在无击键和鼠标移动的情况下只暂停10秒。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 如何为表单建立功能键 对于数据输入人员而言,使用鼠标反而降低操作的效率。 比方说,假设操作人员要新增数据时,除了可以使用鼠标按下新增按钮,也可以直接按下功能键[F2],在这种情况下,您觉得操作人员会使用什么方法呢? 根据经验,由于数据输入人员对键盘上各类按键的配置位置相当熟悉,因此几乎所有的输入人员都会采用立即可按下的功能键,而不会去使用鼠标,因为他或她不需要将手离开键盘使用鼠标,操作的效率自然提高。 ----所以,一个设计良好的系统,应该是既能使用鼠标操作,也能使用键盘操作。 由此可见,为表单建立功能键的重要性。 ----要为表单建立功能键,关键在于KeyPress事件的使用。 因为每当您在表单中按下并放开某一键时,表单的KeyPress事件便会被引发。 显然您只需要在表单的KeyPress事件程序中,去拦截使用者在表单中所按下的每一个键,并且判断它是否是特定功能键,便能决定是否要执行特定的操作。 ----然而,这却引发了另一个值得讨论的问题,那就是并非只有表单才拥有KeyPress事件,许多控件也拥有KeyPress事件。 比方说,您目前在表单中的某一TEXT输入框中,此时若按下并放开某一按键,所引发的将是此TEXT输入框的KeyPress事件,而表单的KeyPress事件将不会引发。 因此也许您会问,我们是否必须为表单中所有控件的KeyPress事件程序都撰写判断使用者是否按下功能键的程序码? 当然不是,因为这样不仅繁琐,而且还会降低效率。 ----要让表单的KeyPress事件拦截作用控件的KeyPress事件,也就是先引发所属的表单的KeyPress事件再引发作用控件的KeyPress事件,只要将表单的KeyPressView属性设为.T.即可。 这样,您只需要在表单的KeyPress事件程序中撰写判断使用者是否按下建立功能键的程序码,而不需要在表单所内含的各个控件的KeyPress事件中撰写此程序码。 ----几项说明: ----1、由于VFP本身已经为各个功能键定义了按键集合,因此要使您所设定的各个功能键生效,首先必须清除VFP的按键集合定义。 要清除VFP的按键集合定义,必须在表单的INIT事件程序中加入下面这道命令: ----CLEARMACROS ----2、请务必将表单的属性设定为逻辑真值。 ----3、VFP会自动传递两个参数给KeyPress事件程序,因此您必须在KeyPress事件程序的开头处使用LPARAMETERS或PARAMETERS命令来接收这些参数,否则将发生错误。 第一个参数nKeyCode是一个数值型参数,其值为使用者是否按下功能键。 第二个参数nShiftAltCtrl是一个数值型参数,从这个参数您可以判断出使用者按按键是否包含组合键Shift/Alt/Ctrl键。 ----KeyPress事件程序的代码: LPARAMETERSnKeyCode,nShiftAltCtrl DOCASE CASEnKeyCode=-1&&[F2] WITHTHISFORM.cmdfind .SetFocus .Click ENDWITH CASEnKeyCode=-2&&[F3] WITHTHISFORM.cmdprint .SetFocus .Click ENDWITH CASEnKeyCode=-3&&[F4] WITHTHISFORM.cmdadd .SetFocus .Click ENDWITH ENDCASE ----从上面的程序中您可以发现,当按下特定功能键后,我们调用相对应的按钮的Click事件程序,也就是说,要执行的操作仍然是写在各个按钮本身的Click事件中。 而调用SetFocus事件的是为了造成该按钮在外观和视觉上被选定的感觉。 ----4、我们希望在程序结束执行后,恢复默认的按钮集合定义。 要达到此目的,必须在表单的退出事件中撰写下列命令: ----RESTOREMACROS 如何使用_Screen对象 只所以在这里把_screen作为技术篇一个单独的问题提出来,是因为作为主窗口的_screen对象相对与其他一般表单,有许多的特殊之处,但是,大家在进行程序设计的时候,无一例外全部都要遇到主窗口的属性设置问题,所以把它单独的作为技术篇中的一个单独题目,也就不足为怪了! 在我想写这篇文章的时候,无意中在“狐友俱乐部”中见到了茉莉花写的一篇关于_screen的文章,所以便来个借花献佛,对于其中一些未提及的问题稍微做了一些补充,以饷大家,让我们向茉莉花表示衷心的感谢! 在VisualFoxPro中充分利用_SCREEN对象,就能对主窗口进行各种操作,如可以动态地改变主窗口的图标、标题、颜色等,也可以通过它引用其它的对象或属性。 _SCREEN对象(即指主窗口)是从表单类派生出来的,表单中的部分属性、事件和方法在_SCREEN对象也存在,因而可以把主窗口当作表单来操作(但也有所不同,如在_SCREEN中不能像表单那样对LOAD、ACTIVATE等事件添加代码,即不能够为_screen指定事件)。 下面举例说明如何利用_SCREEN对象: 1.更改图标和标题 把VFP窗口的小狐狸图标和“MicrosoftVisualFoxPro”标题,改为你所喜欢的图标和标题,只需执行代码 _SCREEN.ICON=″你的图标文件名(.ICO)″ _SCREEN.CAPTION=″你的标题名″ 如果需要修改的东西很多,大家也可以用with…endeith进行设定,如: with_screen .visible=.t. .closable=.t. .controlbox=.t. .maxbutton=.t. .minbutton=.t. .movable=.t. .top=0 .left=0 .windowstate=2 .caption='建设银行计算机台帐管理系统' .picture='zhj6.bmp' .icon='support.ico' endwith 2.动态地改变主窗口的图标和标题 即让主窗口的图标和标题随时间的变化而变化。 这就需要在_SCREEN中加入一个Timer类,Timer类是每经过一定的时间(在Interval属性中设定,单位为毫秒)循环地执行其Timer事件中的代码。 方法如下: 先定义你的Timer类: 点“文件/新建/类/新建文件”,这时弹出一窗口,上面有这几项需要填写: “类名”项填新建类名(如MyTimer),“派生于”项选Timer,“来源于”项不用填,“存储于”项填新建类库名(如MyClass)。 确定后出现类设计器(很像表单设计器),上有一小闹钟(Timer控件)把其Interval属性设为1000(时间间隔,毫秒),在Init事件中输入代码: PUBLNN NN=0&&NN为变化的标志变量 在Timer事件(每隔一定时间执行)输入: _SCREEN.ICON=IIF((-1)^NN,″所需加入的图题1″,″图标2″) _SCREEN.CAPION=IIF((-1)^NN,″所需加入的标题1″,″标题2″) NN=NN+1 关闭并保存,类建立完毕。 可视地把该类添到_SCREEN中: 由于_SCREEN与表单有所区别,故不能用表单设计器工具来完成拖放类定义,而是用“类浏览器”来完成,寻工具/类浏览器”后,弹出一打开窗口,选择刚才建立的类库文件(MYCLASS),确定后,弹出类浏览器窗口,选中MyTimer类,这时在类浏览器的左上角有一小闹钟,把它拖放到主窗口中,你就会惊奇地发现你的主窗口不再是死气沉沉的了。 不信? 试试! 3.利用_SCREEN得到主窗口内包含的表单数量 执行: ? _SCREEN.FORMCOUNT即可 4.在_screen中加入对象(如: 图画),举例如下: _screen.addobject("imge1","quit1")&&建立一副图画 defineclassquit1asimage top=-10 left=0 *height=_screen.height-50 *width=_screen.width-50 picture='main_bmp.bmp' backstyle=0 visible=.t. *stretch=1 procedureclick quit endproc enddefine 基于这个例子,上面第2个问题中加入timer类的问题可以这样解决: _screen.addobject("tmr1","caption1")&&建立一个timer defineclasscaption1astimer1 Interval=1000 procedureinit PUBLNN NN=0&&NN为变化的标志变量 endproc proceduretimer _SCREEN.ICON=IIF((-1)^NN,″所需加入的图题1″,″图标2″) _SCREEN.CAPION=IIF((-1)^NN,″所需加入的标题1″,″标题2″) NN=NN+1 endproc enddefine 以上是有关_SCREEN对象的简单阐述,想要你的窗口美化起来,具体的工作还需要你自己去做。 如何使用_Screen对象2 在VisualFoxPro中充分利用_SCREEN对象,就能对主窗口进行各种操作,如可以动态地改变主窗口的图标、标题、颜色等,也可以通过它引用其它的对象或属性。 _SCREEN对象(即指主窗口)是从表单类派生出来的,表单中的部分属性、事件和方法在_SCREEN对象也存在,因而可以把主窗口当作表单来操作(但也有所不同,如在_SCREEN中不能像表单那样对LOAD、ACTIVATE等事件添加代码)。 下面举例说明如何利用_SCREEN对象: 1更改图标和标题 把VFP窗口的小狐狸图标和“MicrosoftVisualFoxPro”标题,改为你所喜欢的图标和标题,只需执行代码_SCREEN.ICON=″你的图标文件名(.ICO)″ _SCREEN.CAPTION=″你的标题名″ 2动态地改变主窗口的图标和标题 即让主窗口的图标和标题随时间的变化而变化。 这就需要在_SCREEN中加入一个Timer类,Timer类是每经过一定的时间(在Interval属性中设定,单位为毫秒)循环地执行其Timer事件中的代码。 方法如下: 先定义你的Timer类: 点“文件/新建/类/新建文件”,这时弹出一窗口,上面有这几项需要填写: “类名”项填新建类名(如MyTimer),“派生于”项选Timer,“来源于”项不用填,“存储于”项填新建类库名(如MyClass)。 确定后出现类设计器(很像表单设计器),上有一小闹钟(Timer控件)把其Interval属性设为1000(时间间隔,毫秒),在Init事件中输入代码: PUBLNN NN=0&&NN为变化的标志变量 在Timer事件(每隔一定时间执行)输入: _SCREEN.ICON=IIF((-1)^NN,″所需加入的图题1″,″图标2″) _SCREEN.CAPION=IIF((-1)^NN,″所需加入的标题1″,″标题2″) NN=NN+1 关闭并保存,类建立完毕。 可视地把该类添到_SCREEN中: 由于_SCREEN与表单有所区别,故不能用表单设计器工具来完成拖放类定义,而是用“类浏览器”来完成,寻工具/类浏览器”后,弹出一打开窗口,选择刚才建立的类库文件(MYCLASS),确定后,弹出类浏览
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 技巧 04
![提示](https://static.bdocx.com/images/bang_tan.gif)