VFP知识点点.docx
- 文档编号:9998065
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:21
- 大小:103.93KB
VFP知识点点.docx
《VFP知识点点.docx》由会员分享,可在线阅读,更多相关《VFP知识点点.docx(21页珍藏版)》请在冰豆网上搜索。
VFP知识点点
VFP知识点点
设置目录路径
1.如何取得系统目录
nPath_ls=fullpath('',2)
nPath=strtran(nPath_ls,'COMMAND.COM','') &&取得Windows\的目录名
*如果想得到SYSTEM目录则:
nPath=strtran(nPath_ls,'COMMAND.COM','system\')&&取得Windows\system\的目录名
当然下面的代码更简单:
mWinPath=getenv("windir") &&取得Windows\的目录名
2.如何取得运行程序的盘符和当前目录
Dqml=sys(5)+sys(2003)+'\'
3.设置隐含路径
DQML=SYS(5)+SYS(2003)
CXLJ=SYS(16)
FORJSQ=1TOLEN(CXLJ)
CXZF=LEFT(RIGHT(CXLJ,JSQ),1)
IFCXZF='\'
CXLJ=STUFF(CXLJ,LEN(CXLJ)-JSQ+1,JSQ,'')
EXIT
ENDIF
ENDFOR
SETDEFAULTTO&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:
\TEMP\abc.DBF')
IFX#0
wjsize=Myml(1,2)&&取得文件大小
wjdate=Myml(1,3)&&取得修改日期及属性
wjAttr=Myml(1,5)&&取得文件属性
ELSE
waitwind'没有您指定的文件!
'
ENDIF
文件属性的含义:
A档案文件一可读写
H隐藏文件
R只读文件
S系统文件
D目录或文件夹
我们利用Adir()还可以检查某个目录是否存在:
X=Adir(Myml,'C:
\ABCDE','D')
IFX=0
waitwind'该目录不存在...'
ENDI
当然用下面的更简单:
if!
file('C:
\ABCDE\nul')
waitwind'该目录不存在...'
endi
总之Adir()可以达到很多目的,具体使用请看查看帮助。
6.如何删除只读属性的文件
Vfp没有提供改变文件属性的命令或函数,在Vfp代码中无法删除只读属性的文件,我发现可以利用Rename命令来解决。
如c:
\temp\XX1.DAT是一个只读属性的文件。
Renamec:
\temp\XX1.DATTOC:
\RECYCLED\XX1.DAT
将XX1.DAT文件改名到RECYCLED[回收站],就等于删除了该文件。
VFP下的Rename命令当TO后面的文件夹与前面的不一致时,相当于资源管理器里的剪切命令,这是不是也是BUG呢?
7.如何改变文件的属性
Vfp没有提供改变文件的属性的命令或函数,要想改变文件的属性必须转个弯,先把原文件改名,再拷贝回一个然后再删除就到达了目的,如有一文件:
XX1.DAT是只读属性的文件,不改属性无法往文件里写新内容。
Renamec:
\temp\XX1.DATTOC:
\temp\XX1.DDD &&先改名
CopyfileC:
\temp\XX1.DDDtoC:
\temp\XX1.DAT &&再拷贝
Renamec:
\temp\XX1.DDDTOC:
\RECYCLED\XX1.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命令也有不少子句:
WAIT
[cMessageText]
[TOMemVarName]
[WINDOW[ATnRow,nColumn]]
[NOWAIT]
[CLEAR|NOCLEAR]
[TIMEOUTnSeconds]
比如我们的使用常常只是:
WAITWIND'暂停…'
使'暂停…'这两个字停留在其默认窗口的右上角,其实完全可以用[ATnRow,nColumn]来改变其停留位置:
WAITWIND'暂停…'AT10,30&&使'暂停…'停留在指定的第10行,第30列上。
WAITWIND'暂停…'+CHR(13)+'另起一行…'AT10,30&&在提示信息中加上CHR(13),提示信息可分行显示。
而:
WAITWIND'暂停10秒…'TIMEOUT10&&则可在无击键和鼠标移动的情况下只暂停10秒。
6.问:
如何解决公元2000年以后的日期问题?
答:
可以采用以下这些方法,
1)采用严格日期格式(SETSTRICTDATETO1或SETSTRICTDATETO2)
2)固定使用四位数年份,即SETCENTURYON
3)使用SETCENTURYON命令指定2位数年份的默认世纪
4)避免使用CTOD()与CTOT()函数,而改用DATE()与DATETIME()函数
7.DBF表在查看状态下添加新行:
CTRL+Y
8.VFP支持长(带空格)文件夹路径名拷贝,可以将文件夹及文件名称用字符串界定符号界定即可。
如:
copyfile'c:
\program files\aabbcc\?
?
?
.?
?
?
'to'd:
\ssdfrtdd\eeww\?
?
?
.?
?
?
'
9.把EXCEL文件导入DBF表中先新建一个与EXCEL文件字段长度和类型相同的表,然后用命令appendfromd:
\test.xlsTYPEXLS把D盘下的TEST文件导入到DBF表中,当想把查询结果导出成EXCEL文件时,可以用命令copytod:
\test.xlsTYPEXLS来实现
10.问:
为什么当filter设置时,应该用locate代替seek?
答:
当你的查找字段是建立了索引且当前索引是该索引时,SEEK通常是查找单个记录的最快的方法。
不过,当设置了filter时,SEEK非常慢。
理由是SEEK将查找符合你的搜索标准的第一个记录。
FoxPro为了移动记录指针到相应的记录上,必须找到和你的标准相匹配且和filter条件相称的记录。
和SEEK不同,LOCATE是可进行Rushmore优化的.当一个可优化的filter起作用时,LOCATEFORCustId=m.CustId通常比SEEKm.CustId更快。
在GOTOP和GOBOTTOM中也存在相似的问题。
用无子句的LOCATE来执行GOTOP,将会使记录指针移动到符合filter条件的第一个记录。
要执行GOBOTTOM,设置当前索引标识的降序然后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中,比如:
seledbfname
gobottom
thisform.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、当数据指针移动时刷新Grid
seledbfname
gobottom
thisform.grid1.setfocus()
thisform.refresh()
12.GRID动态添加点表头的排序方法:
新建myheader.prg:
DEFINECLASSNewHeaderasHeader
Name="NewHeader"
PROCEDUREclick
oGrd=This.Parent.Parent
nColumns=This.Parent.ColumnOrder
Thisform.LockScreen=.T.&&锁定屏
cFileName=oGrd.RecordSource&&取得绑定的数据源名
IF!
EMPTY(cFileName)
IFRECCOUNT('&cFileName')>0
FORi=1TOThis.Parent.Parent.ColumnCount
cField=This.Parent.ControlSource&&取得绑定的字段名
SELECT(cFileName)
IFINLIST(VARTYPE(&cField),"C","N","D","T","Y","L")&&判断字段数据类型
IFi=nColumns&&点击的GRID头
cCap=ALLTRIM(This.Caption)
DOCASE
CASEAT('▽',cCap)>0
This.Caption=STRTRAN(cCap,'▽','△')
SELECT&cFileName
INDEXon&cFieldTOgIdx
SETORDERTOgIdxASCENDING
CASEAT('△',cCap)>0
This.Caption=STRTRAN(cCap,'△','▽')
SELECT&cFileName
INDEXon&cFieldTOgIdx
SETORDERTOgIdxDESCENDING
OTHERWISE
This.Caption=This.Caption+SPACE
(1)+'▽'
SELECT&cFileName
INDEXon&cFieldTOgIdx
SETORDERTOgIdxDESCENDING
ENDCASE
ELSE&&没有点击的GRID头
cCap=ALLTRIM(oGrd.Columns(i).Header1.Caption)
DOCASE
CASEAT('▽',cCap)>0
oGrd.Columns(i).Header1.Caption=STRTRAN(cCap,'▽','')
CASEAT('△',cCap)>0
oGrd.Columns(i).Header1.Caption=STRTRAN(cCap,'△','')
OTHERWISE
***不变
ENDCASE
ENDIF&&&&结束点击的GRID头判断
ENDIF&&结束字段数据类型判断
ENDFOR&&结束
ENDIF
ENDIF
SELECT(cFileName)
GOTOP
Thisform.LockScreen=.F.&&解锁屏
oGrd.Refresh
ENDPROC
ENDDEFINE
*************************************
动态添加方法,我放在GRID的init:
*****动态添加排序
IFThisform.grid1.ColumnCount>0
FORi=1TOThisform.grid1.ColumnCount
WITHThisform.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。
如不改就同时改PRG
ENDWITH
ENDFOR
Endif
13.在程序源代码中加上必要的注释,可以增强程序的可读性,也便于日后的维护。
注释语句是一种非执行语句,在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属性为2-DropdownList(下拉列表框)。
(2)设置Combo1.Rowsourcetype为4-Query(.QPR)查询文件。
(3)设置Combo1.Rowsource为符合要求的查询文件。
如:
SelectSinfor.name &&选择表中的字段
FromDatabase!
Sinfor &&标明表所在的数据库
WhereSinfor.nameIN(″王″)
OR(Sinfor.nameIN(″李″))
这样便能在数据库Database中的表Sinfor的字段name中找出姓王和姓李的名字,并在ComboBox中输出。
此外,查询文件可利用Foxpro的Query自动生成。
3.组合框Combobox的使用
〈1〉组合框内要显示多列,可改变ColumnCount特性,但此时若不设置列宽度,将仅显示第一列。
可以通过逗号分隔的清单列来指定列宽。
如:
用“10,50,100”设置三列宽度。
也可以使用命令:
THISFORM.ComboBox1.ColumnWidths=10,50,100
〈2〉要想让用户每次查找时输入一个字母,把IncrementalSearch特性设置为True,运行时,当用户输入一个字母时,高亮条将移列表中第一个字母和输入字母相匹配的第一条目上。
〈3〉要将输入的内容加入到下拉列表中,可在组合框的Valid事件中加入This.Additem(This.Displayvalue)代码。
表单
1、表单调用最小化!
如果希望表单在调用时以最小化运行,可以向表单的Init事件传递一个参数:
1 例:
DO FORM formname WITH 1
2、想在按钮中加入快捷键,可在 标题(Caption)属性加入"\<"符号。
例:
Caption属性为 取消(\ 此主题相关图片如下: 3.给页框架(Pageframe)的标题加背景颜色 一般给页框架的各个页面加背景颜色时,总是页框架的标题(头部)加不上去,这时可将页框架Pageframe的Tabs特性改为·F·,然后将各个Page分别加入所需背景颜色,再把Tabs特性改为·T·即可。 4.显示符合条件的记录数 在进行查询或记录筛选时,要返回符合条件的记录数,可用下面代码: Publicaa0&&.定义变量 Counttoaa0&&.符合条件的记录数赋给变量 Thisform.Text1.value=aao&&.在文本框中显示出记录数 5.问: 为什么编译后的程序运行时,屏幕一闪就退出了,为什么? 答: 你需要在你的程序中建立'等待状态'。 可以用readevents命令来建立等待状态。 要清除等待状态,可使用clearevents命令。 6.问: 为什么当我要退出vfp时,得到一条信息'不能退出vfp'。 答: 检验onshutdown。 onshutdownquit&&若没有这句,可能不能退出VFP 7.可执行文件(.exe)既可以在VFP环境下运行,也可以在Windows环境下运行,但必须和动态链接库Vfp6r.dll和Vfp6rchs.dll(中文版)或Vfp6renu.dll(英文版)一起构成VFP所需的完整运行环境(注意必须放在同一个目录下)。 8.问: 我每次启动编译后的VFP程序,VFP的系统菜单总是先出现,我该怎样避免? 答: 在您的CONFIG.FPW文件中假如SYSMENU=OFF 的命令。 9.问: 如何在应用程序中避免出现vfp的窗口标题? 答: 在config.fpw文件中,加"title=你的标题"行。 另外,也可以在主程序中加入: _screen.caption="你的标题" 10.问: 当启动应用程序的.EXE文件时,如何隐藏VisualFoxPro桌面(怎样才能把VFP的主屏幕消掉)? 答: 在CONFIG.FPW配置文件中添加如下命令行: SCREEN=OFF 注意: 如果您无须将CONFIG.FPW作为单独的文件提供(也就是说,在连编.EXE文件之后,您不需要对它作任何改动)。 您可向项目中添加CONFIG.FPW文件,并将之标记为可包含的,该文件就会连编为.EXE文件的一部分。 只有顶层表单活动时,VisualFoxPro才可以隐藏桌面。 使用如下命令,您可以用编程方式隐藏桌面(假设已有一个顶层表单处于活动状态中): _VFP.Visible=.F. 11.问: 当所有窗口打开时,怎样才能看到VFP桌面上的内容? 答: 按ALT+CTRL+SHIFT将把全部打开的窗口隐藏起来,直到放开键。 12.问: 怎样同时设置多个对象的同一属性? 答: 用SetAll方法。 例如,你决定为全部网格中的标题设置9号宋体。 将以下代码放入网格的Init事件: THIS.SETALL("FontName","Arial","Header") 13.计时器(Timer)控件的Interval属性的取值范围从0至2147483647,也就是说最长的间隔约为596.5小时,超过24天,值为0时不触发Timer事件 14.问: 在form中如何禁止控件在填满内容时跳到下个控件,要用enter,才跳转。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP 知识 点点