编程小技巧04文档格式.docx
- 文档编号:18453473
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:68
- 大小:618.58KB
编程小技巧04文档格式.docx
《编程小技巧04文档格式.docx》由会员分享,可在线阅读,更多相关《编程小技巧04文档格式.docx(68页珍藏版)》请在冰豆网上搜索。
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_LEN
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
ENDCASE
L_0JS=L_0JS+1
ELSE
IFL_0JS>
+L_SZ
L_0JS=0
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)&
不要单位的情况下
cRMBDX=cRMBDX+cNumbers+cDWS
nCd=nCd-1
ENDFOR
RETURNcRMBDX
如何从表单返回一个值
可以在表单的Unload事件中用来RETURN命令返回一个值。
如何在输入无效的情况下使用户不能离开当前对象
在Valid事件中使用RETURN0命令。
为什么编译后的程序运行时屏幕一闪就不见了
你需要在你的程序中建立“等待状态”。
可以用READEVENTS命令来建立等待状态。
要清除等待状态,可使用CLEAREVENTS命令。
如果你只有一个屏幕,把表单的WindowState属性设置为Modal。
这也提供等待状态,但是不允许你使用菜单。
当模式表单被释放时,等待状态结束并返回至操作系统。
如何把数组作为参数传递给表单
在FoxPro中,数组必须按址传递。
SETUDFPARMS决定参数的传递方式。
在默认情况下,当你用DO…WITH调用过程或表单时,参数是按址传递。
在函数或方法中,参数是按值传递。
DIMENSIONarray[10]
DOFORMForm1WITHarray
在这种情况下,你必须用一个"
@"
符号强迫参数的传递为按址传递。
MyForm=CREATEOBJECT("
Form1"
@myarray)
如何检查变量是否存在
使用TYPE()函数来检查一个变量是否存在。
IFTYPE("
Var"
)=.t.
MESSAGEBOX("
Itexists"
0,"
)?
ENDIF
或你可以检查是否TYPE("
)="
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="
.Left=10
.Top=50
ENDWITH
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Wait命令的应用
Wait命令应用很方便,我在VB,DELPHI等语言中就始终没有找到与其功能相似的语句,
可是我们在VFP中使用时常常只是用到了它的部分功能,而忽略了一些很有用的功能。
Wait
命令也有不少子句:
WAIT
[cMessageText]
[TOMemVarName]
[WINDOW[ATnRow,nColumn]]
[NOWAIT]
[CLEAR|NOCLEAR]
[TIMEOUTnSeconds]
比如我们的使用常常只是:
WAITWIND'
暂停…'
使'
这两个字停留在其默认窗口的右上角,其实完全可以用[ATnRow,nColumn]来改
变其停留位置:
AT10,30
停留在指定的第10行,第30列上。
+CHR(13)+'
另起一行…'
在提示信息中加上CHR(13),提示信息可分行显示。
而:
暂停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
CASEnKeyCode=-2&
[F3]
WITHTHISFORM.cmdprint
CASEnKeyCode=-3&
[F4]
WITHTHISFORM.cmdadd
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类的问题可以这样解决:
tmr1"
caption1"
建立一个timer
defineclasscaption1astimer1
Interval=1000
procedureinit
PUBLNN
NN=0&&NN为变化的标志变量
endproc
proceduretimer
_SCREEN.ICON=IIF((-1)^NN,″所需加入的图题1″,″图标2″)
以上是有关_SCREEN对象的简单阐述,想要你的窗口美化起来,具体的工作还需要你自己去做。
如何使用_Screen对象2
_SCREEN对象(即指主窗口)是从表单类派生出来的,表单中的部分属性、事件和方法在_SCREEN对象也存在,因而可以把主窗口当作表单来操作(但也有所不同,如在_SCREEN中不能像表单那样对LOAD、ACTIVATE等事件添加代码)。
下面举例说明如何利用_SCREEN对象:
1更改图标和标题
把VFP窗口的小狐狸图标和“MicrosoftVisualFoxPro”标题,改为你所喜欢的图标和标题,只需执行代码_SCREEN.ICON=″你的图标文件名(.ICO)″
_SCREEN.CAPTION=″你的标题名″
2动态地改变主窗口的图标和标题
即让主窗口的图标和标题随时间的变化而变化。
NN=0&&NN为变化的标志变量
在Timer事件(每隔一定时间执行)输入:
_SCREEN.CAPION=IIF((-1)^NN,″所需加入的标题1″,″标题2″)
NN=NN+1
关闭并保存,类建立完毕。
可视地把该类添到_SCREEN中:
由于_SCREEN与表单有所区别,故不能用表单设计器工具来完成拖放类定义,而是用“类浏览器”来完成,寻工具/类浏览器”后,弹出一打开窗口,选择刚才建立的类库文件(MYCLASS),确定后,弹出类浏览
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 技巧 04