诛仙3造化天道:vfp 全面总结(精华)

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 00:43:50

*表单属性设置

***********************************

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()

DEFINE BAR _med_undo OF EdtShort PROMPT "撤消(\

MESSAGE "撤消上一次命令或操作"

DEFINE BAR 3 OF EdtShort PROMPT "\-"

DEFINE BAR _med_cut OF EdtShort PROMPT "剪切(\

SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;

MESSAGE "移去选定内容并将其放入剪贴板"

DEFINE BAR _med_copy OF EdtShort PROMPT "复制(\

SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;

MESSAGE "将选定内容复制到剪贴板上"

DEFINE BAR _med_paste OF EdtShort PROMPT "粘贴(\

SKIP FOR empty(_cliptext) ;

MESSAGE "粘贴剪贴板上的内容"

DEFINE BAR _med_clear OF EdtShort PROMPT "删除(\

SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;

MESSAGE "移去选定内容,并且不将其放到剪贴板上"

DEFINE BAR 8 OF EdtShort PROMPT "\-"

DEFINE BAR _med_slcta OF EdtShort PROMPT "全部(\

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 "撤消(\

MESSAGE "撤消上一次命令或操作"

DEFINE BAR 3 OF EdtShort PROMPT "\-"

DEFINE BAR _med_cut OF EdtShort PROMPT "剪切(\

SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;

MESSAGE "移去选定内容并将其放入剪贴板"

DEFINE BAR _med_copy OF EdtShort PROMPT "复制(\

SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;

MESSAGE "将选定内容复制到剪贴板上"

DEFINE BAR _med_paste OF EdtShort PROMPT "粘贴(\

SKIP FOR empty(_cliptext) ;

MESSAGE "粘贴剪贴板上的内容"

DEFINE BAR _med_clear OF EdtShort PROMPT "删除(\

SKIP FOR _screen.activeform.activecontrol.sellength = 0 ;

MESSAGE "移去选定内容,并且不将其放到剪贴板上"

DEFINE BAR 8 OF EdtShort PROMPT "\-"

DEFINE BAR _med_slcta OF EdtShort PROMPT "全部(\

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.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 "剪切(\

KEY CTRL+X, "" ;

SKIP For med_cut=.F.

Define Bar _Med_copy Of shortcut Prompt "复制(\

KEY CTRL+C, "" ;

SKIP For med_copy=.F.

Define Bar _Med_paste Of shortcut Prompt "粘贴(\

KEY CTRL+V, "" &&;

* SKIP For Empty(_Cliptext)

Define Bar _Med_clear Of shortcut Prompt "删除(\

KEY DEL, "" ;

SKIP For med_clear=.F.

Define Bar 7 Of shortcut Prompt "\-"

Define Bar _Med_slcta Of shortcut Prompt "全选(\

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"+"\"+TRANSFORM(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 To 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")