VFP知识点点.docx

上传人:b****7 文档编号:9998065 上传时间:2023-02-07 格式:DOCX 页数:21 大小:103.93KB
下载 相关 举报
VFP知识点点.docx_第1页
第1页 / 共21页
VFP知识点点.docx_第2页
第2页 / 共21页
VFP知识点点.docx_第3页
第3页 / 共21页
VFP知识点点.docx_第4页
第4页 / 共21页
VFP知识点点.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

VFP知识点点.docx

《VFP知识点点.docx》由会员分享,可在线阅读,更多相关《VFP知识点点.docx(21页珍藏版)》请在冰豆网上搜索。

VFP知识点点.docx

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,才跳转。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1