编程小技巧04.docx

上传人:b****4 文档编号:5465971 上传时间:2022-12-16 格式:DOCX 页数:68 大小:618.58KB
下载 相关 举报
编程小技巧04.docx_第1页
第1页 / 共68页
编程小技巧04.docx_第2页
第2页 / 共68页
编程小技巧04.docx_第3页
第3页 / 共68页
编程小技巧04.docx_第4页
第4页 / 共68页
编程小技巧04.docx_第5页
第5页 / 共68页
点击查看更多>>
下载资源
资源描述

编程小技巧04.docx

《编程小技巧04.docx》由会员分享,可在线阅读,更多相关《编程小技巧04.docx(68页珍藏版)》请在冰豆网上搜索。

编程小技巧04.docx

编程小技巧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),确定后,弹出类浏览

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1