vfp全面总结(精华)(上)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)
="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 bel1.Caption = "显示文本"
bel1.Alignment = 2 && 居中
bel1.ForeColor = BG(255,255,255)
bel1.fontsize = 12
ENDWITH
* ********************************
*数据转换问题
* 通常文本框是字符型,因此:转换到日期值:
*dDate1 = ctod(alltrim(thisform.tEXT1.Value ))
*dDate2 = ctod(alltrim(thisform.tEXT2.Value ))
*文本框转换成数值
iValue = VAL(ALLTRIM(thisform.teXT1.Value )) && iValue 是数值型变量
**********************************
* 在表单中进行操作时,对于多个标签、文本框添加时,采用复制的方法。

以后运用菜单上的格式.....对齐等。

**********************************
* 组合框和复选框:关键二点:一、选值来于何处。

二、值存于何表中的字段
* 主要用于为表输入数据、提供查询条件。

*将数据表加入环境
* cValue = ALLTRIM(bo1.DisplayValue ) && 字符型需去前后空格
* cValue = alltrim(thisform.list1.DisplayValue) && 字符型需去前后空格
* 要使用在选中时改变属性来美化效果,需要控件:bo1_InteractiveChange 事件中设置
***********************************
*设置:一、在表中选值
bo1.RowSource = 表名1.字段名
bo1.RowSourceType = 6 && 字段
bo1.ControlSource = 表名2.字段名 && 用于接收combo1值的主表和字段
bo1.SpecialEffect= 1 && =1 平面,=0 三维
bo1.ListCount = 10 && 列表显示的条数为10
*** 二、手工设定:
bo1.RowSource = "a,b,c,d" && 在a,b,c,d 中选取值
bo1.RowSourceType = 1 && =1 值
bo1.ControlSource = 表名2.字段名 && 用于接收combo1值的主表和字段
bo1.SpecialEffect= 1 && =1 平面,=0 三维
bo1.ListCount = 10 && 列表显示的条数为10
* sql取值
bo1.RowSource = "select 字段名from 表名1" && 在a,b,c,d中选取值
bo1.RowSourceType = 3 && =3 为sql类型bo1.ControlSource = 表名2.字段名 && 用于接收combo1值的主表和字段
bo1.SpecialEffect= 1 && =1 平面,=0 三维
bo1.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中:
mandgroup1.ButtonCount = 4
mand1.Caption = "首条记录"
mand2.Caption = "前一记录"
mand3.Caption = "下一记录"
mand4.Caption = "最后记录"
IF RECCOUNT()< 2 THEN
mandgroup1.Enabled = .F.
else
mandgroup1.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 mandgroup2
.command1.Caption ="增加"
.command2.Caption ="修改"
.command3.Caption ="删除"
.command4.Caption ="恢复"
mand4.Enabled = .F.
endwith
IF RECCOUNT()=0 then
mand2.Enabled = .F.
mand3.Enabled = .F.
else
mand2.Enabled = .t.
mand3.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 mand1.Caption ="增加" then
APPEND BLANK
thisform.Refresh
mand1.Caption ="保存"
ELSE
mand1.Caption ="增加"
thisform.Refresh
ENDIF
CASE nway2 ==2
IF mand2.Caption ="修改" then
thisform.grid1.ReadOnly = .F.
mand2.Caption ="保存"
ELSE
mand2.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()
DEFINE BAR _med_undo OF EdtShort PROMPT "撤消(\<U)" ;
MESSAGE "撤消上一次命令或操作"
DEFINE BAR 3 OF EdtShort PROMPT "\-"
DEFINE BAR _med_cut OF EdtShort PROMPT "剪切(\<T)" ;
SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;
MESSAGE "移去选定内容并将其放入剪贴板"
DEFINE BAR _med_copy OF EdtShort PROMPT "复制(\<C)" ;
SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;
MESSAGE "将选定内容复制到剪贴板上"
DEFINE BAR _med_paste OF EdtShort PROMPT "粘贴(\<P)" ;
SKIP FOR empty(_cliptext) ;
MESSAGE "粘贴剪贴板上的内容"
DEFINE BAR _med_clear OF EdtShort PROMPT "删除(\<D)" ;
SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;
MESSAGE "移去选定内容,并且不将其放到剪贴板上"
DEFINE BAR 8 OF EdtShort PROMPT "\-"
DEFINE BAR _med_slcta OF EdtShort PROMPT "全部(\<A)" ;
MESSAGE "选定当前窗口中的所有文本或数据项"
ACTIVATE POPUP EdtShort
**********************************************
* 错误处理代码
本错误程序可将程序发生的错误信息保存到一个表以便程序员对程序进行修改。

在主程序中写入以下代码
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()
DEFINE BAR _med_undo OF EdtShort PROMPT "撤消(\<U)" ;
MESSAGE "撤消上一次命令或操作"
DEFINE BAR 3 OF EdtShort PROMPT "\-"
DEFINE BAR _med_cut OF EdtShort PROMPT "剪切(\<T)" ;
SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;
MESSAGE "移去选定内容并将其放入剪贴板"
DEFINE BAR _med_copy OF EdtShort PROMPT "复制(\<C)" ;
SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;
MESSAGE "将选定内容复制到剪贴板上"
DEFINE BAR _med_paste OF EdtShort PROMPT "粘贴(\<P)" ;
SKIP FOR empty(_cliptext) ;
MESSAGE "粘贴剪贴板上的内容"
DEFINE BAR _med_clear OF EdtShort PROMPT "删除(\<D)" ;
SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;
MESSAGE "移去选定内容,并且不将其放到剪贴板上"
DEFINE BAR 8 OF EdtShort PROMPT "\-"
DEFINE BAR _med_slcta OF EdtShort PROMPT "全部(\<A)" ;
MESSAGE "选定当前窗口中的所有文本或数据项"
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.T ext1下的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],RG B(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及CONTINUE 用法区别
作用:前两个命令FIND和SEEK是在一个已经建立了索引文件的表中,定位到关键字中的内容与命
令行中字符串相同的第一个记录。

后一个命令在用USE打开表文件以后,locate for 直接查询表中字段内容。

格式:FIND <“字符串”>|<字符串>
SEEK <表达式>
LOCATE [<范围>] [FOR <条件>] [WHILE<条件
CONTINUE
说明:FIND命令与SEEK命令的区别是前者后跟字符串,而后者后跟表达式。

在用LOCATE命令找到
一个匹配记录后,可用CONTINUE命令搜索表的剩余部分来寻找其他匹配的记录。

**********************************************
**************以下是文件夹删除操作****************
mbwjj="要删除的文件夹"
IF !DIRECTORY("&mbwjj.")
MESSAGEBOX("你要删除的文件夹不存在!",48,'系统提示:')
ENDIF
loFilesystem=CREATEOBJECT("Scripting.FileSystemObject") loFilesystem.DeleteFolder("&mbwjj.",.T.)
对日期型栏目中的月份进行批量替换?
如:把“出生日期”中的月份全部用11月替换,年和日不变?
UPDATE XXX SET XXdate= CTOD( TRANSFORM( YEAR(XXdate))+"\"+"11"+"\"+TRANSFOR M(DATE(xxdate)))
REPLACE all 出生日期WITH DATE(YEAR(出生日期),11,DAY(出生日期))
VFP技术QQ群
3842576
3962883
4001858
5718827
7177370
15547884
21796637
33659603
100=100的程序,看谁更简洁
有道小学题,要求应用VFP编程:
有100个馒头要分给100个和尚,其中大和尚每人三个,小和尚三个人分一个,求大和尚和小和尚各多少人。

要求在程序中不能有数字字符。

其实,这道题是小学的算术题。

在日常生活中经常会遇到,之所以要求不带数字,那就必须要有接收外面参数的语句,如果再有返回结果的语句,这个小程序就可以当成函数用。

Parameters n物,n人,n大人消耗,n小孩消耗
For n大人=0 To n人
n小孩=n人-n大人
If n大人消耗*n大人+n小孩消耗*n小孩=n物
Return Transform(n大人)+','+Transform(n小孩)
EndIf
EndFor
Return '-1,-1'
Para WS,RS,D,X &&物数,人数,每个大和尚消耗,每个小和尚消耗DA='' &&答案
For DS=0 T o RS
XS=RS-DS
If D*DS+X*XS=WS
DA=DA+'大和尚'+str(DS)+'人,小和尚'+str(XS)+'人'+chr(13) EndI
EndF
Retu iif(empt(DA),'无解',DA)
有人尝试,很好!谢谢2楼、3楼的朋友!为了答谢朋友的支持,我把我的构思亮一亮:
想想小学的算术的交换律:
我们100不说,因为人数=物数,所以可以撇开100不说,我们来讨论一下
1个大和尚分3个,人数1,物数3
3个小和尚分1个,人数3,物数
也是“人数=物数”即:1+3=3+1
大和尚+小和尚=大和尚物数+小和尚物数,这就是交换律,也是比和比例在日常生活上的应用
从算术角度上说,这道题目应该这样算:
100?1+3)=25 大和尚人数和小和尚分得物数
3?7=75 大和尚分得物数和小和尚人数
所以:25+75=75+25 (100=100)
程序:
para nZs,nDhs,nXhs && 总数(100),大和尚人均数(3),小和尚人数(1)
nFpa=nZs/(nDhs+nXhs)
nFpb=nDhs*nFpa
return "大和尚共有"+alltrim(str(nFpa))+"人,分得馒头"+alltrim(str(nFpb))+"个,小和尚"+alltrim(str(nFpb))+"人,分得馒头"+alltrim(str(nFpa))+"个"
由于大和尚人数=小和尚分得馒头数,小和尚人数=大和尚分得馒头数,所以合拼成2行算式。

上面显示好像有问题,算术算式是:
100/(1+3)=25 大和尚人数和小和尚分得物数
3*25=75 大和尚分得物数和小和尚人数
所以:25+75=75+25 (100=100)
这其实是"鸡兔同笼"问题,
2、3楼的方法可以解决问题,语句虽短,但没考虑算法的优化。

楼主提供的程序,在算法上似乎存在问题。

PARAMETERS N_头数,N_脚数,N_鸡脚,N_兔脚
N_鸡数 = (N_兔脚 * N_头数 - N_脚数)/(N_兔脚 - N_鸡脚)
N_兔数 = N_头数 - N_鸡数
RETURN TRANSFORM(N_鸡数)+","+TRANSFORM(N_兔数)
楼上的朋友真行!谢谢你,朋友!
不过我当时只认为是“按比例分配”的问题,就用小学算术“比例分配”解答,粗糙一点。

Grid.AfterRowColChange 事件如何获取列名称?
可以在表格的AfterRowColChange 事件中添加以下代码(假设表格名称为grdkhdw)
LPARAMETERS nColIndex
ls=ALLTRIM(STR(ncolindex))
theheader=thisform.grdkhdw.column&ls..header1.caption WAIT theheader WINDOW
************************************************************* **************如何将日期替换为空值************************
repl 出生日期 with {} / {^} / .null. / ctod('')
用blank更方便(9.0)
REPL (FIELD_DATE) WITH {//}
REPL
******************************用grid设置显示色*****************************
2008-12-26 10:08
可以用grid并用其setall()设置显示色:
.grdGrid1.SetAll("DynamicBackColor", "IIF(年龄<1, RGB(255,0,0), IIF(年龄=1,RGB(0,255,255),RGB(0,255,0)))", "Column")。

相关文档
最新文档