看郑少秋版的烟雨蒙蒙:vfp 全面总结(精华)(上)
*表单属性设置
***********************************
WITH thisform.FontName = 宋体
thisform.FontSize = 10
thisform.ForeColor = gb( 255,255 ,255 )
thisform.AutoCenter =.T.
thisform.Width = 600
thisform.Height =400
thisform.BorderStyle = 0 && 普通
thisform.MaxButton =.f.
thisform.MinButton =.f.
thisform.MDIForm =.f. &&是否是多文档界面
thisform.WindowState = 2 &&0为普通、1为最小化、2 为最大化
thisform.ShowWindow = 1 && 1 在顶层窗口内、2、为顶层窗口 主表单设为2,其余为1
thisform.BackColor = gb(0,0,0)
thisform.Name ="cName"
thisform.Caption ="我的表单"
ENDWITH && do和 with 中间无空格
* form 方法
thisform.Hide
thisform.Show
* 文本框属性
WITH thisform.text1.Alignment = 2 && 居中
thisform.text1.FontSize = 12
thisform.text1.ForeColor =GB(255,255,255)
thisform.text1.BorderColor = GB(0,255,0)
ENDWITH*****************************************************
* 用for.....endfor 对多文本框一次性设置
n=0
FOR n = 1 TO 10
WITH thisform.text&n.Alignment = 2 && 居中
thisform.text&n.FontSize = 12
thisform.text&n.ForeColor =GB(255,255,255)
thisform.text&n.BorderColor = GB(0,255,0)
ENDWITH
n=n+1
ENDFOR
* 用复制的方法,可以使各个文本框属性一致*
*标签设置 WITH thisform.label1.Caption = "显示文本"
thisform.label1.Alignment = 2 && 居中
thisform.label1.ForeColor = BG(255,255,255)
thisform.label1.fontsize = 12
ENDWITH
* ********************************
*数据转换问题
* 通常文本框是字符型,因此:转换到日期值:
*dDate1 = ctod(alltrim(thisform.tEXT1.Value ))
*dDate2 = ctod(alltrim(thisform.tEXT2.Value ))
*文本框转换成数值
iValue = VAL(ALLTRIM(thisform.teXT1.Value )) && iValue 是数值型变量
**********************************
* 在表单中进行操作时,对于多个标签、文本框添加时,采用复制的方法。以后运用菜单上的格式.....对齐等。。。
**********************************
* 组合框和复选框:关键二点:一、选值来于何处。二、值存于何表中的字段
* 主要用于为表输入数据、提供查询条件。
*将数据表加入环境
* cValue = ALLTRIM(thisform.combo1.DisplayValue ) && 字符型 需去前后空格
* cValue = alltrim(thisform.list1.DisplayValue) && 字符型 需去前后空格
* 要使用在选中时改变属性来美化效果,需要控件:thisform.combo1_InteractiveChange 事件中设置
***********************************
*设置:一、在表中选值
thisform.combo1.RowSource = 表名1.字段名
thisform.combo1.RowSourceType = 6 && 字段
thisform.combo1.ControlSource = 表名2.字段名 && 用于接收combo1值的主表和字段
thisform.combo1.SpecialEffect= 1 && =1 平面,=0 三维
thisform.combo1.ListCount = 10 && 列表显示的条数为10
*** 二、手工设定:
thisform.combo1.RowSource = "a,b,c,d" && 在a,b,c,d中选 取值
thisform.combo1.RowSourceType = 1 && =1 值
thisform.combo1.ControlSource = 表名2.字段名 && 用于接收combo1值的主表和字段
thisform.combo1.SpecialEffect= 1 && =1 平面,=0 三维
thisform.combo1.ListCount = 10 && 列表显示的条数为10
* sql取值
thisform.combo1.RowSource = "select 字段名 from 表名1" && 在a,b,c,d中选 取值
thisform.combo1.RowSourceType = 3 && =3 为sql类型
thisform.combo1.ControlSource = 表名2.字段名 && 用于接收combo1值的主表和字段
thisform.combo1.SpecialEffect= 1 && =1 平面,=0 三维
thisform.combo1.ListCount = 10 && 列表显示的条数为10
****************************************************
*关于grid重点:
* 作用:1、显示数据。2、作数据输入
* 美化表格显示特效(选中时背景变色,字体。。。。。。)需在事件:thisform.grid1_AfterRowColChange 中设置
* 显示数据时注意grid的只读属性设置。
* 表单中的控件(command、chang.....)必须refresh,否则表格内的数据不会更新显示(但数据源表内数据改变了)。
* 选中单元,记录号= recno(),取值方法:go recno()
***************************************************
*设置:
WITH thisform.grid1.DeleteMark = .F. && 不显示删除标记栏
thisform.grid1.RecordMark = .F. && 不显示记录标记列
thisform.grid1.ColumnCount = 6 && 显示列数
thisform.grid1.column1.header1.Caption = "标题1"
thisform.grid1.column1.header1.Alignment = 2 && 标题是居中
thisform.grid1.column1.Width = 60 && 设置列宽度
ENDWITH* ...........................................
* 设置数据源
* SELECT 字段1,字段2 FROM 表名 ; && 后面必须有“;”
*WHERE 字段X = ALLTRIM(thisform.tEXT1.Value ) AND BETWEEN( 日期字段名,ctod(),CTOD()) ; && 后面必须有“;”
*group by 字段2 ;
*INTO CURSOR temp
*thisform.grid1.RecordSource = "temp" && 设置为临时表,也可以是固定的表名
* 或: thisform.grid1.RecordSource = "sele........"
thisform.grid1.RecordSourcetype = 4 && sql .....型
thisform.Refresh && 更新表单是的数据。必写!!!!!
**************************************************
* 注意:在书写sele语句时 哪些地方必须保留空格?哪些未尾需要 “;”
* 两表中查询时,from 表1,表2 前面字段需写成:表1.字段名 ,表2.字段名。。。。。。
*
***************************************************
* 关于导航条
* 首页、前面、下页、最后页的代码
* 用 commandgroup
****************************************************在表单初始化init中:
thisform.commandgroup1.ButtonCount = 4
thisform.commandgroup1.command1.Caption = "首条记录"
thisform.commandgroup1.command2.Caption = "前一记录"
thisform.commandgroup1.command3.Caption = "下一记录"
thisform.commandgroup1.command4.Caption = "最后记录"
IF RECCOUNT()< 2 THEN
thisform.commandgroup1.Enabled = .F.
else
thisform.commandgroup1.Enabled = .T.
ENDIF*commandgroup1 的interactivechang事件代码
local nway && 声明一个数值变量
nway=this.value &&是第几个命令按钮按下了
&&你也可以取这个按钮的caption 如 nway=this.buttons(this.Value).caption
do case
case nway==1 &&第一个 单击
GO top
CASE nway == 2
IF !BOF()
SKIP -1
endif
CASE nway ==3
IF !EOF()
SKIP 1
ENDIF
CASE nway ==4
GO BOTTOM
ENDCASE
**********************************************
*用命令组 对表数据进行操作
* 实现:增加记录、修改记录、删除记录、恢复记录
*commandgroup2
**********************************************
*表单的init事件中:
WITH thisform.commandgroup2
.command1.Caption ="增加"
.command2.Caption ="修改"
.command3.Caption ="删除"
.command4.Caption ="恢复"
thisform.commandgroup2.command4.Enabled = .F.
endwith
IF RECCOUNT()=0 then
thisform.commandgroup2.command2.Enabled = .F.
thisform.commandgroup2.command3.Enabled = .F.
else
thisform.commandgroup2.command2.Enabled = .t.
thisform.commandgroup2.command3.Enabled = .t.
ENDIF
COPY 表名 to temptable && 以便以后恢复
**********************************************
* *commandgroup2 的interactivechang事件代码
local nway2 && 声明一个数值变量
nway2=this.value &&是第几个命令按钮按下了
&&你也可以取这个按钮的caption 如 nway=this.buttons(this.Value).caption
DO case
CASE nway2 ==1
IF thisform.commandgroup2.command1.Caption ="增加" then
APPEND BLANK
thisform.Refresh
thisform.commandgroup2.command1.Caption ="保存"
ELSE
thisform.commandgroup2.command1.Caption ="增加"
thisform.Refresh
ENDIF
CASE nway2 ==2
IF thisform.commandgroup2.command2.Caption ="修改" then
thisform.grid1.ReadOnly = .F.
thisform.commandgroup2.command2.Caption ="保存"
ELSE
thisform.commandgroup2.command2.Caption ="修改"
thisform.grid1.ReadOnly = .T.
thisform.Refresh
ENDIF
CASE nway2 ==3
IF MESSAGEBOX("确信要删除选中的记录吗?",1,"提示")
MESSAGEBOX("确信要删除选中的记录吗?",1,"提示")=6
DELETE
thisform.Refresh
ENDIF
CASE
CASE nway2 ==4
UPDATE 表名 SET temptable
PACK temptable
thisform.Refresh
ENDCASE *********************************************
* 退出
* 单击事件中
CLOSE TABLES
CLEAR EVENTS
thisform.Release
*********************************************
* 表单之间传递数据
* 定义一个全局变量:public vName
* vName = alltrim(form1.text1.value)
* form2.text1 = vName d在form2中调用 vName
********************************************
* 菜单
* 菜单建好后要通过”显示“下面有"选项" 内。。。。设置成主菜单。
* 只有主表单才能加载”主菜单“。在主表单init中使用: do 主菜单名 with this ,.T.
* 注意在主表单的destroy中写上:clear events
* 弹出菜单可以在一般表单中加载,命令相同,最后在。。。。 clear events
*********************************************
* 路径问题
*利用系统内部函数获取路径:
*mypath = SYS(5)+SYS(2003) && 也就是当前的路径 后面不含”\“
*通常表单都是在同一个目录下,互相调用时不必写路径(见上),但有时菜单与表单不在同一目录下,则调用菜单用:do 路径 菜单名.mpr
*在设置运行环境时,有二个路径要设定:
*SET DATABASE TO 数据库名
*SET DEFAULT TO .......路径
***********************************************
* vfp不能退出问题
* read events 和 clear events 是一个循环过程,在 系统退出时必须包含:clear events 或
ON SHUTDOWN quit
*或
ON SHUTDOWN do fileExit.scx && 写一个文件名为fileExit的程序,在"程序"--"新建" 存在默认路径下,后缀为.prg ON SHUTDOWN CLEAR EVENTS**************************************************** 脱离vfp方法*程序打包后, 安装运行时无法脱离VFP主窗口环境。这时你可以自己编辑一个CONFIG.FPW系统配置文件,对生成的程序进行运行环境等各方面的设定。具体方法如下:
*在应用程序中打开项目管理器,在代码一栏内新建一程序,其代码如下:
screen=off
sysmenu=off
* 然后存为一个名叫CONFIG的文件, 这时系统默认的扩展名为PRG,保存好文件后退出。
* 在刚才保存的位置找到刚才存好的CONFIG .PRG文件,将其重命名为CONFIG.FPW然后重新进入项目管理器,在代码栏内选中该文件,单击右键选择“排除”一项,这样系统在编译的时候就不将其编译在内而*将它视为系统文件。这样你的程序一运行就先自动搜索当前路径或默认路径下是否存在该系统配置文件,如存在就执行进入系统配置。
****************************************************
* 可选用菜单用于编辑用
选单项目 内部命令 撤消 —MED—UNDO
重做 —MED—REDO
剪切 —MED—CUT
复制 —MED—COPY
粘贴 —MED—PASTE
清除 —MED—CLEAR
查找 —MED—FIND
替换 —MED—REPL
全部选定 —MED—SLCTA
将上述选单项所对应的系统选单内部命令输入,核对无误后,生成主选单,这时就能在应用系统中非常方便地使用各种编辑功能了****************************************************** * 错误处理代码
本错误程序可将程序发生的错误信息保存到一个表以便程序员对程序进行修改。
在主程序中写入以下代码
set default to sys(5)+sys(2003) &&设置软件所在的目录
Default_Path=sys(5)+sys(2003)
*---------------------初始化系统变量------------------------
ERR_FILE =Default_Path+"\data\ERR_DBF.DBF" &&程序出错库 9
ON ERROR DO ERR_PRG WITH PROGRAM(),LINENO(),ERROR(),MESSAGE(),MESSAGE(1) &&定义错误处理程序
SET PROCEDURE TO tools ADDITIVE
过程文件:
文件名:tools .prg
*-----------------错误处理代码段-----------------
PROCEDURE ERR_PRG
PARAMETERS M_PROGRAM,M_LINEO,M_ERROR,M_MESSAGE,M_1
WORK_=SELE()
SELE 19
IF NOT(FILE(ERR_FILE))
CREATE TABLE(ERR_FILE) (错误程序名 C(40),行号 C(5),错误信息 C(40),错误内容 C(40),错误代码 C(5),出错日期 C(8),出错时间 C(8))
INSERT INTO &ERR_FILE (错误程序名,错误信息,出错日期) valueS ("主程序","创建出错库",DTOS(DATE()))
INDE ON 出错日期 TAG 出错日期
USE
Set Exclusive Off &&重新定义共享方式打开。操作数据必须在独占的情况下才能进行。
ELSE
USE &ERR_FILE SHAR
APPE BLANK
REPL 错误信息 WITH M_MESSAGE,错误内容 WITH M_1,出错日期 WITH DTOS(DATE()),出错时间 WITH TIME(),错误程序名 WITH M_PROGRAM,;
行号 WITH LTRIM(STR(M_LINEO)),错误代码 WITH LTRIM(STR(M_ERROR))
ENDIF
USE IN 19
SELE (WORK_)
=MESSAGEBOX(M_MESSAGE+CHR(13)+CHR(13)+"程序运行错误,请与作者联系!",16,"系统信息")
QUIT &&显示错误消息后,退出程序
RETURN
********************************************************
* 右击菜单的源程序
para oREF
DEFINE POPUP EdtShort SHORTCUT RELATIVE FROM MROW(),MCOL() SKIP FOR empty(_cliptext) ; ACTIVATE POPUP EdtShort 在主程序中写入以下代码 过程文件: ******************************************************** * 右击菜单的源程序 para oREF DEFINE POPUP EdtShort SHORTCUT RELATIVE FROM MROW(),MCOL() SKIP FOR empty(_cliptext) ; ACTIVATE POPUP EdtShort
DEFINE BAR _med_undo OF EdtShort PROMPT "撤消(\MESSAGE "撤消上一次命令或操作"
DEFINE BAR 3 OF EdtShort PROMPT "\-"
DEFINE BAR _med_cut OF EdtShort PROMPT "剪切(\
MESSAGE "移去选定内容并将其放入剪贴板"
DEFINE BAR _med_copy OF EdtShort PROMPT "复制(\
MESSAGE "将选定内容复制到剪贴板上"
DEFINE BAR _med_paste OF EdtShort PROMPT "粘贴(\
MESSAGE "粘贴剪贴板上的内容"
DEFINE BAR _med_clear OF EdtShort PROMPT "删除(\
MESSAGE "移去选定内容,并且不将其放到剪贴板上"
DEFINE BAR 8 OF EdtShort PROMPT "\-"
DEFINE BAR _med_slcta OF EdtShort PROMPT "全部(\MESSAGE "选定当前窗口中的所有文本或数据项"
本错误程序可将程序发生的错误信息保存到一个表以便程序员对程序进行修改。
set default to sys(5)+sys(2003) &&设置软件所在的目录
Default_Path=sys(5)+sys(2003)
*---------------------初始化系统变量------------------------
ERR_FILE =Default_Path+"\data\ERR_DBF.DBF" &&程序出错库 9
ON ERROR DO ERR_PRG WITH PROGRAM(),LINENO(),ERROR(),MESSAGE(),MESSAGE(1) &&定义错误处理程序
SET PROCEDURE TO tools ADDITIVE
文件名:tools .prg
*-----------------错误处理代码段-----------------
PROCEDURE ERR_PRG
PARAMETERS M_PROGRAM,M_LINEO,M_ERROR,M_MESSAGE,M_1
WORK_=SELE()
SELE 19
IF NOT(FILE(ERR_FILE))
CREATE TABLE(ERR_FILE) (错误程序名 C(40),行号 C(5),错误信息 C(40),错误内容 C(40),错误代码 C(5),出错日期 C(8),出错时间 C(8))
INSERT INTO &ERR_FILE (错误程序名,错误信息,出错日期) valueS ("主程序","创建出错库",DTOS(DATE()))
INDE ON 出错日期 TAG 出错日期
USE
Set Exclusive Off &&重新定义共享方式打开
ELSE
USE &ERR_FILE SHAR
APPE BLANK
REPL 错误信息 WITH M_MESSAGE,错误内容 WITH M_1,出错日期 WITH DTOS(DATE()),出错时间 WITH TIME(),错误程序名 WITH M_PROGRAM,;
行号 WITH LTRIM(STR(M_LINEO)),错误代码 WITH LTRIM(STR(M_ERROR))
ENDIF
USE IN 19
SELE (WORK_)
=MESSAGEBOX(M_MESSAGE+CHR(13)+CHR(13)+"程序运行错误,请与作者联系!",16,"系统信息")
QUIT &&显示错误消息后,退出程序
RETURN
DEFINE BAR _med_undo OF EdtShort PROMPT "撤消(\MESSAGE "撤消上一次命令或操作"
DEFINE BAR 3 OF EdtShort PROMPT "\-"
DEFINE BAR _med_cut OF EdtShort PROMPT "剪切(\
MESSAGE "移去选定内容并将其放入剪贴板"
DEFINE BAR _med_copy OF EdtShort PROMPT "复制(\
MESSAGE "将选定内容复制到剪贴板上"
DEFINE BAR _med_paste OF EdtShort PROMPT "粘贴(\
MESSAGE "粘贴剪贴板上的内容"
DEFINE BAR _med_clear OF EdtShort PROMPT "删除(\
MESSAGE "移去选定内容,并且不将其放到剪贴板上"
DEFINE BAR 8 OF EdtShort PROMPT "\-"
DEFINE BAR _med_slcta OF EdtShort PROMPT "全部(\MESSAGE "选定当前窗口中的所有文本或数据项"
select max(序号) from 表 into curs tempindex
nIndex=iif(isnull(max_序号),1,max_序号+1)*replace all 序号 with recno()
*对于索引,循环一下
nIndex=1
scan
replace 序号 with nIndex
nIndex=nIndex+1
endscan
**************************************************
* 密码格式 thisform.text1.PasswordChar="*"*************************************************** * 取grid中单元格值 thisform.text1.value=evaluate(field(nIndex))&&写在AfterRowColChange里 ************************************************** * 自动调整表格列的宽度,
thisform.grid1.AutoFit ************************************************* * 月份、年份问题RQ1={^1988-05-01}
RQ2={^2009-03-01}
NF1=YERA(RQ1)
NF2=YERA(RQ2)
YF1=MONTH(RQ1)
YF2=MONTH(RQ2)
*包含起始月,不包含结束月的月份数=(NF2-NF1)*12+YF2-YF1
*************************************************** * 收入、支出、余额分别是表格的第1、2、3列。
可以在表单的Grid1.column1.Text1下的LostFocus事件中放入:
thisform.grid1.column3.Text1.value=thisform.grid1.column2.text1.value+this.Value
Grid1.column2.Text1下的LostFocus事件中放入:
thisform.grid1.column3.Text1.value=thisform.grid1.column1.text1.value+this.Value &&同时还要考虑总余额的变化。 ******************************************************** 疯狂的VFPER之数值转换为金额大写
*将以下代码存为RMB.prg,在其它地方调用,如?RMB(123.45)。
Lparameters tnMoney
Private lcMoney,lnMoney,i,lcReturnValue
Local lcMoney,lnMoney,i,lcReturnValue
lcMoney = Iif(tnMoney<0,"负","")
lnMoney = Round(Abs(tnMoney)*100,0)
For i = Len(Alltrim(Str(lnMoney,15)))-1 To 0 Step -1
lcMoney = lcMoney+Subs("零壹贰叁肆伍陆柒捌玖",Int(Round(lnMoney/10^i,10))*2+1,2)+Subs("分角元拾佰仟万拾佰仟亿拾佰仟万",i*2+1,2)
lnMoney = Mod(lnMoney,10^i)
Endfor
lcMoney = Strtran(Strtran(Strtran(Strtran(Strtran(lcMoney,"零仟","零"),"零佰","零"),"零拾","零"),"零角","零"),"零分","整")
lcMoney = Strtran(Strtran(Strtran(Strtran(Strtran(lcMoney,"零零","零"),"零零","零"),"零亿","亿"),"零万","万"),"零元","元")
lcReturnValue = Iif(lcMoney="整","零元整",Strtran(Strtran(lcMoney,"亿万","亿"),"零整","整"))
Return (lcReturnValue) ********************************************************* 关于注册检测程序dluser=alltrim(upper(thisform.text1.value))
dlpassword=alltrim(upper(thisform.text2.value))
if empty(dluser) or empty(dlpassword)
messagebox("輸入錯誤",1)
thisform.text1.value=" "
thisform.text2.value=" "
else
select welcome
locate for alltrim(upper(用户))==dluser and alltrim(upper(密碼))==dlpassword
if eof()
messagebox("輸入錯誤,請再次輸入",1)
else
messagebox("注册成功",0)
do form welcome.scx
thisform.visible=.f.
endif
endif ********************************************* 彩色grid表格制作thisform.grdBook1.SetAll("dynamicbackcolor","IIF(a=[kk],RGB(255,0,0),IIF(a=[dd],RGB(0,255,0),RGB(255,255,255)))","column") *疯狂的VFPER之表格奇偶行不同背景色其实很简单,就一句代码:
This.grd1.SetAll("DynamicBackColor","iif(Mod(Recno(),2)=1,RGB(255,255,255),RGB(192,192,192))","Column") ******************************************* 完整的编辑菜单程序Release med_cut,med_copy,med_clear,med_slcta
Public med_cut,med_copy,med_clear,med_slcta
med_cut=Iif(This.SelLength>0,.T.,.F.)
med_copy=Iif(This.SelLength>0,.T.,.F.)
med_clear=Iif(This.SelLength>0,.T.,.F.)
med_slcta=Iif(Len(Alltrim(This.Text))>0,.T.,.F.)
Define Popup shortcut SHORTCUT Relative From Mrow(),Mcol()
Define Bar _Med_undo Of shortcut Prompt "撒消(\KEY CTRL+Z, ""
Define Bar 2 Of shortcut Prompt "\-"
Define Bar _Med_cut Of shortcut Prompt "剪切(\
SKIP For med_cut=.F.
Define Bar _Med_copy Of shortcut Prompt "复制(\
SKIP For med_copy=.F.
Define Bar _Med_paste Of shortcut Prompt "粘贴(\