VFP知识点点.doc_第1页
VFP知识点点.doc_第2页
VFP知识点点.doc_第3页
VFP知识点点.doc_第4页
VFP知识点点.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VFP知识点点设置目录路径1.如何取得系统目录nPath_ls=fullpath(,2)nPath=strtran(nPath_ls,COMMAND.COM,) &取得Windows的目录名*如果想得到SYSTEM目录则:nPath=strtran(nPath_ls,COMMAND.COM,system) &取得Windowssystem的目录名当然下面的代码更简单:mWinPath=getenv(windir) &取得Windows的目录名2.如何取得运行程序的盘符和当前目录Dqml=sys(5)+sys(2003)+ 3.设置隐含路径DQML=SYS(5)+SYS(2003)CXLJ=SYS(16)FOR JSQ=1 TO LEN(CXLJ)CXZF=LEFT(RIGHT(CXLJ,JSQ),1)IF CXZF=CXLJ=STUFF(CXLJ,LEN(CXLJ)-JSQ+1,JSQ,)EXITENDIFENDFORSET DEFAULT TO &CXLJ即把exe文件所在有目录设为隐含目录。4.调用WINDOWS对话框GETPRINTER()显示 Windows 的“打印设置”对话框,并返回所选择的打印机名称GETFILE( )显示“打开”对话框,并返回选定文件的名称GETFONT( )显示“字体”对话框,并返回所选定字体的名称GETCOLOR( )显示 Windows 的“颜色”对话框,并返回选定颜色的颜色编号GETPICT( )显示“打开图象对话框”对话框,并返回选定图片文件的文件名5.如何取得某个文件的大小、修改日期及属性 Vfp为我们提供了一个非常强大函数ADIR(), 语法: ADIR(ArrayName , cFileSkeleton , cAttribute , cCreatorType)使用:X=Adir(Myml,C:TEMP*.DBF)返回:X=符合cFileSkeleton条件的文件或目录个数 (数值型)Myml=一个有五列内容的数组。这五列的含义是:1 文件名 字符型 2 文件大小 数值型 3 文件日期 日期型 4 文件时间 字符型 5 文件属性 字符型 例:我们想得到某个文件的大小或文件修改日期及属性:X=Adir(Myml,C:TEMPabc.DBF)IF X#0 wjsize=Myml(1,2) &取得文件大小 wjdate=Myml(1,3) &取得修改日期及属性 wjAttr=Myml(1,5) &取得文件属性ELSE wait wind 没有您指定的文件!ENDIF文件属性的含义:A 档案文件 一 可读写 H 隐藏文件 R 只读文件 S 系统文件D 目录或文件夹 我们利用Adir()还可以检查某个目录是否存在:X=Adir(Myml,C:ABCDE,D) IF X=0 wait wind 该目录不存在.ENDI 当然用下面的更简单:if ! file(C:ABCDEnul) wait wind 该目录不存在.endi 总之Adir()可以达到很多目的,具体使用请看查看帮助。6.如何删除只读属性的文件 Vfp没有提供改变文件属性的命令或函数,在Vfp代码中无法删除只读属性的文件,我发现可以利用Rename命令来解决。如c:tempXX1.DAT是一个只读属性的文件。Rename c:tempXX1.DAT TO C:RECYCLEDXX1.DAT 将XX1.DAT文件改名到RECYCLED回收站,就等于删除了该文件。 VFP下的Rename命令当TO后面的文件夹与前面的不一致时,相当于资源管理器里的剪切命令,这是不是也是BUG呢?7.如何改变文件的属性 Vfp没有提供改变文件的属性的命令或函数,要想改变文件的属性必须转个弯,先把原文件改名,再拷贝回一个然后再删除就到达了目的, 如有一文件: XX1.DAT是只读属性的文件,不改属性无法往文件里写新内容。Rename c:tempXX1.DAT TO C:tempXX1.DDD &先改名Copy file C:tempXX1.DDD to C:tempXX1.DAT&再拷贝Rename c:tempXX1.DDD TO C:RECYCLEDXX1.DAT &再删除这样新拷贝的XX1.DAT就是解除了只读属性的文件了。表格:1.表格(Grid)控件的 View 属性设为1或2可以得到如下界面,即左窗口为浏览,右窗口为编辑格式此主题相关图片如下:2.问:在用表格显示数据表的内容时,我们怎样锁定其中的一列,如人事库中的姓名,当移动滚动条时姓名这一列,不移动?答:在表格的左下角有一个黑色的小方块,用鼠标按住它往右拉就可达到您的要求。另外可以设置表格的partition属性做到。3.(1)在网格中交替显示颜色 记录号有序排列时,可以在网格的列中交替显示白色和灰色的记录,代码如下: thisform.Grid1.SetAll(DynamicBackColor,IIF(MOD(RECNO(),2)=0,RGB(255,255,255),RGB(192,192,192),Column,&交替显示白色和绿色的记录 (2)符合条件的记录显示颜色 进行查询时,想在网格中动态地显示符合条件的记录的颜色,可以充分利用DynamicBackColor和DynamicForeColor特性。下例将符合条件的记录的字体变为红色Thisform.Grid1.Column1.DynamicForeColor=IIf(Database.Category_ID=A02,RGB(225,0,0),RGB(0,0,124)4. 问:如果我想在表单上加入一个表格,用于显示所有的记录,当鼠标点到某条记录时,其它控件的各项内容也同时变化,怎么实现好呢?答:在表格的afterrowcolchange事件中编入刷新控件的命令即可。5.Wait命令应用很方便,可是我们在VFP中使用时常常只是用到了它的部分功能,而忽略了 一些很有用的功能。 Wait命令也有不少子句:WAITcMessageTextTO MemVarNameWINDOW AT nRow, nColumnNOWAITCLEAR | NOCLEARTIMEOUT nSeconds比如我们的使用常常只是:WAIT WIND 暂停使暂停这两个字停留在其默认窗口的右上角,其实完全可以用 AT nRow, nColumn来改变其停留位置:WAIT WIND 暂停 AT 10,30 &使暂停停留在指定的第10行,第30列上。WAIT WIND 暂停 +CHR(13)+另起一行 AT 10,30 &在提示信息中加上CHR(13),提示信息可分行显示。 而:WAIT WIND 暂停10秒 TIMEOUT 10 &则可在无击键和鼠标移动的情况下只暂停10秒。6.问:如何解决公元2000年以后的日期问题?答:可以采用以下这些方法,1)采用严格日期格式(SET STRICTDATE TO 1 或SET STRICTDATE TO 2)2)固定使用四位数年份,即SET CENTURY ON3)使用SET CENTURY ON 命令指定2位数年份的默认世纪4)避免使用CTOD()与CTOT()函数,而改用DATE()与DATETIME()函数7.DBF表在查看状态下添加新行:CTRL+Y8.VFP 支持长(带空格)文件夹路径名拷贝,可以将文件夹及文件名称用字符串界定符号界定即可。如:copy file c:programfilesaa bb cc?.? to d:ss dfrt ddee ww?.?9. 把EXCEL文件导入DBF表中先新建一个与EXCEL文件字段长度和类型相同的表,然后用命令append from d:test.xls TYPE XLS 把D盘下的TEST文件导入到DBF表中,当想把查询结果导出成EXCEL文件时,可以用命令copy to d:test.xls TYPE XLS来实现10. 问: 为什么当filter设置时,应该用locate代替seek?答: 当你的查找字段是建立了索引且当前索引是该索引时,SEEK 通常是查找单个记录的最快的方法。不过,当设置了filter时,SEEK 非常慢。理由是SEEK将查找符合你的搜索标准的第一个记录。FoxPro为了移动记录指针到相应的记录上,必须找到和你的标准相匹配且和filter条件相称的记录。和 SEEK不同, LOCATE 是可进行Rushmore优化的. 当一个可优化的filter 起作用时,LOCATE FOR CustId=m.CustId 通常比SEEK m.CustId 更快。在GO TOP 和 GO BOTTOM 中也存在相似的问题。用无子句的LOCATE来执行GO TOP,将会使记录指针移动到符合filter 条件的第一个记录。要执行 GO BOTTOM, 设置当前索引标识的降序然后LOCATE, 在将索引设置为原来的升序。11.焦点的转移:解决Grid的刷新问题你也许碰到过这样的问题:你想用一个VCR按钮来移动表的指针,比如上一个、下一个等等,却发现Grid不刷新、老是停留在原来的位置;还有,你想在一个添加按钮的代码中把焦点移入表格的一列中,用setfocus()方法却根本没有反应。这是怎么回事呢?关于Gird中的控件的焦点转移有点特殊性。给普通表单上的控件设置焦点我们可以用简单的代码实现,比如:thisform.textbox1.setfocus()thisform.refresh()但是Grid中的控件则不行,如果你使用以下的代码,什么都不会发生:thisform.grid1.column1.text1.setfocus()thisform.refresh()同时,你要从Grid中移出焦点到表单的控件上也一样,下面的代码同样没有反应:grid1.cloumn1.text1.lostfocus():mand1.setfocus()thisform.refresh()另外,当我们使用移动记录按钮在表中移动时,并不会反映到Grid中,比如:sele dbfnamego bottomthisform.refresh()而Grid仍然停在原来的记录上。这是怎么一回事呢?原来,对Grid中控件焦点的移入移出,必须通过Grid来转移!这一点在所有的教科书、程序员手册中都找不到,嘿嘿,是我自己摸索出来的。下面我们来解决上面的三个问题:1、从表单的命令按钮向Grid中的文本框设置焦点thisform.grid1.setfocus()thisform.grid1.column1.text1.setfocus()thisform.refresh()2、从Grid中的文本框中移出焦点grid1.column1.text1.lostfocus():thisform.grid1.setfocus()mand1.setfocus()thisform.refresh()3、当数据指针移动时刷新Gridsele dbfnamego bottomthisform.grid1.setfocus()thisform.refresh()12. GRID动态添加点表头的排序方法:新建myheader.prg:DEFINE CLASS NewHeader as Header Name=NewHeaderPROCEDURE click oGrd=This.Parent.ParentnColumns=This.Parent.ColumnOrder Thisform.LockScreen= .T. &锁定屏 cFileName=oGrd.RecordSource &取得绑定的数据源名IF !EMPTY(cFileName)IF RECCOUNT(&cFileName)0FOR i=1 TO This.Parent.Parent.ColumnCount cField=This.Parent.ControlSource &取得绑定的字段名SELECT (cFileName)IF INLIST(VARTYPE(&cField),C,N,D,T,Y,L) &判断字段数据类型 IF i=nColumns & 点击的GRID头cCap=ALLTRIM(This.Caption)DO CASE CASE AT(,cCap)0This.Caption=STRTRAN(cCap,)SELECT &cFileNameINDEX on &cField TO gIdx SET ORDER TO gIdx ASCENDING CASE AT(,cCap)0 This.Caption=STRTRAN(cCap,) SELECT &cFileNameINDEX on &cField TO gIdxSET ORDER TO gIdx DESCENDING OTHERWISE This.Caption=This.Caption+SPACE(1)+SELECT &cFileNameINDEX on &cField TO gIdx SET ORDER TO gIdx DESCENDING ENDCASE ELSE & 没有点击的GRID头cCap=ALLTRIM(oGrd.Columns(i).Header1.Caption)DO CASE CASE AT(,cCap)0oGrd.Columns(i).Header1.Caption=STRTRAN(cCap,)CASE AT(,cCap)0 oGrd.Columns(i).Header1.Caption=STRTRAN(cCap,) OTHERWISE *不变ENDCASE ENDIF & 结束点击的GRID头判断 ENDIF &结束字段数据类型判断 ENDFOR &结束 ENDIF ENDIF SELECT (cFileName)GO TOP Thisform.LockScreen= .F. &解锁屏 oGrd.Refresh ENDPROC ENDDEFINE *动态添加方法,我放在GRID的init:*动态添加排序 IF Thisform.grid1.ColumnCount0 FOR i=1 TO Thisform.grid1.ColumnCount WITH Thisform.grid1.Columns(i)cCpation=.Header1.Caption nFornts=.Header1.Fontsize.RemoveObject(Header1) &移除Header1 .Newobject(NewHeader1,NewHeader,myHeader.prg) &根据PRG中声明类增加 .NewHeader1.Caption=cCpation.NewHeader1.Fontsize=nFornts.NewHeader1.Name=Header1 &改回默认,对应PRG。如不改就同时改PRGENDWITH ENDFOREndif13.在程序源代码中加上必要的注释,可以增强程序的可读性,也便于日后的维护。注释语句是一种非执行语句,在VFP支持3种类型的注释格式:1、使用NOTE或*命令声明该行是一个注释行;2、使用&命令在一个语句的末尾加入注释;3、直接在IF.ENDIF、DO.ENDDO、FOR.ENDFOR 等语句后面直接写注释。列表框1.将列表框(ListBox)的 MultiSelect 属性设为 .T. 即可用Shift 或 Ctrl 键同时选择连续或不连续的多项.此主题相关图片如下:2.在给列表框(ListBox)控件添加数据项时,可以在表达式前面添加一个反斜杠来废止一个数据项。例:This.AddItem (此项禁止)This.AddItem (梅子论坛)此主题相关图片如下:3.用一个分割符加一个连字符-可以给列表框(ListBox)控件加入一条分割条This.AddItem (梅子论坛)This.AddItem (-)This.AddItem (帮助论坛)此主题相关图片如下:组合框1.ComboBox自动下拉,Getfocus事件:KEYBOARD “F4”2.ComboBox(组合框)的选择性输出 控件ComboBox综合了TextBox(文本框)和ListBox(列表框)的特性,可显示一列项目。但要在ComboBox中对Table(表)中的某个Field(字段)的内容进行选择性输出却较为困难。现利用Foxpro的Query,举出一种解决办法: (1)设置Combo1的Style属性为2Dropdown List(下拉列表框)。 (2)设置Combo1.Rowsourcetype为4Query(.QPR)查询文件。 (3)设置Combo1.Rowsource为符合要求的查询文件。 如:Select S&选择表中的字段 From Database!Sinfor&标明表所在的数据库 Where S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论