***********************************
*表单属性设置 *********************************** 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系统配置文件,对生成的程序进行运行环境等各方面的设定。具体方法如下:
撤消 —MED—UNDO *在应用程序中打开项目管理器,在代码一栏内新建一程序,其代码如下: screen=off sysmenu=off * 然后存为一个名叫CONFIG的文件, 这时系统默认的扩展名为PRG,保存好文件后退出。 * 在刚才保存的位置找到刚才存好的CONFIG .PRG文件,将其重命名为CONFIG.FPW然后重新进入项目管理器,在代码栏内选中该文件,单击右键选择“排除”一项,这样系统在编译的时候就不将其编译在内而*将它视为系统文件。这样你的程序一运行就先自动搜索当前路径或默认路径下是否存在该系统配置文件,如存在就执行进入系统配置。 **************************************************** * 可选用菜单用于编辑用 选单项目 内部命令 重做 —MED—REDO 剪切 —MED—CUT 复制 —MED—COPY 粘贴 —MED—PASTE 清除 —MED—CLEAR 查找 —MED—FIND 替换 —MED—REPL 全部选定 —MED—SLCTA 将上述选单项所对应的系统选单内部命令输入,核对无误后,生成主选单,这时就能在应用系统中非常方便地使用各种编辑功能了
******************************************************
* 错误处理代码
本错误程序可将程序发生的错误信息保存到一个表以便程序员对程序进行修改。
在主程序中写入以下代码 过程文件: ******************************************************** * 右击菜单的源程序 para oREF DEFINE POPUP EdtShort SHORTCUT RELATIVE FROM MROW(),MCOL() ACTIVATE POPUP EdtShort **********************************************
* 错误处理代码
本错误程序可将程序发生的错误信息保存到一个表以便程序员对程序进行修改。
在主程序中写入以下代码 过程文件: ******************************************************** * 右击菜单的源程序 para oREF DEFINE POPUP EdtShort SHORTCUT RELATIVE FROM MROW(),MCOL() ACTIVATE POPUP EdtShort **********************************************
* 重新编序号
*用recn()作顺序号在记录进行了物理删除后很可能会产生重复的序号,如果不是使用VFP9的自动增量字段,建议使用select语句来计算序号
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 "撒消(\<U)" ; KEY CTRL+Z, "" Define Bar 2 Of shortcut Prompt "\-" Define Bar _Med_cut Of shortcut Prompt "剪切(\<T)" ; KEY CTRL+X, "" ; SKIP For med_cut=.F. Define Bar _Med_copy Of shortcut Prompt "复制(\<C)" ; KEY CTRL+C, "" ; SKIP For med_copy=.F. Define Bar _Med_paste Of shortcut Prompt "粘贴(\<P)" ; KEY CTRL+V, "" &&; * SKIP For Empty(_Cliptext) Define Bar _Med_clear Of shortcut Prompt "删除(\<D)" ; KEY DEL, "" ; SKIP For med_clear=.F. Define Bar 7 Of shortcut Prompt "\-" Define Bar _Med_slcta Of shortcut Prompt "全选(\<A)" ; KEY CTRL+A, "" ; SKIP For med_slcta=.F. Activate Popup shortcut ******************************************
FIND、SEEK和LOCATE及
作用:前两个命令FIND和SEEK是在一个已经建立了索引文件的表中,定位到关键字中的内容与命 令行中字符串相同的第一个记录。后一个命令在用USE打开表文件以后,locate for 直接查询表中字段内容。 格式:FIND <“字符串”>|<字符串 SEEK <表达式 LOCATE [<范围>] [FOR <条件>] [WHILE<条件 CONTINUE 说明:FIND命令与SEEK命令的区别是前者后跟字符串,而后者后跟表达式。在用LOCATE命令找到 一个匹配记录后,可用CONTINUE命令搜索表的剩余部分来寻找其他匹配的记录。 **********************************************
*************************************************************
**************如何将日期替换为空值************************
repl 出生日期 with {} / {^} / .null. / ctod('')
用blank更方便(9.0) REPL (FIELD_DATE) WITH {//} REPL
******************************用grid设置显示色*****************************
2008-12-26 10:08
|
|