分享

vfp的编程知识<一>

 翠竹斋 2011-01-04
l        如何给表单填加背景图片?

&Oslash;        不要直接用表单的picture来填加背景图片,图片的大小不可控制。

&Oslash;        解决办法:用图像控件:image, 来显示背景图片(缩放方式为:变比填充),并在表单的activate事件中用代码方式对image 控件的位置(top=0、 left=0) 和大小(height、width)属性做适当的设置,让image 控件的大小等于表单的大小。

&Oslash;        若想实现表单的尺寸大小改变时,背景图片同步改变大小,请在表单的resize事件中做上述同样的代码设置即可。

l        为什么回不到设计状态?

&Oslash;        程序挂起了,参看教材12章:程序的调试部分---挂起suspend命令。

&Oslash;        解决办法:在命令窗口中输入命令:cancel回车;或者单击“程序”菜单中的“取消”命令。

l        怎样快速找到出错的命令行代码?

&Oslash;        出错时,点“挂起”来打开调试器,看到出错的行,找到原因;

&Oslash;        在调试器中单击,“跳出”工具按钮,来回到错误状态;

&Oslash;        单击“取消”按钮,回到设计状态修改错误代码。

l        为什么数据类型不匹配?

&Oslash;        请注意表中字段的数据类型与你写的表达式的数据类型一致,数据类型不一致不能运算。如表达式:123>”1000”

&Oslash;        解决办法:用转换函数(推荐用前者)或者改表中的字段类型。

l        如何在一个顶层表单中调用一般菜单?

1、建立一般菜单

&Oslash;        文件/新建/菜单-----存成菜单定义文件.MNX

&Oslash;        显示/常规选项/选中“顶层表单”  (告诉系统将来这个菜单要在一个顶层表单中调用)

&Oslash;        生成.MPR菜单程序文件

2、在一个“顶层表单”的表单文件中调用上面的菜单

&Oslash;        将表单设置为顶层表单:将表单的showwindow设置为2。

&Oslash;        顶层表单的init事件代码如下:DO xx.MPR WITH THIS, .T.

l        如何在一个表单中调用快捷菜单?

&Oslash;        新建/菜单/快捷菜单(同一般菜单)

&Oslash;        保存文件MNX-----生成文件MPR

&Oslash;        在表单(控件)的右击事件(Rightclick)来调用,输入代码:Do  XX.mpr

l        如何书写主程序?

**main.prg**

_screen.visible=.f.

do form  xx.scx

read events

quit

l        用VFP编写管理系统的一般模式是什么?

主程序(main.prg)  调用  密码验证表单(顶层表单)  调用  主控表单(顶层表单)  调用  菜单(xtcd.mpr)—

 调用  其他功能表单(showwindow属性设置为1:在顶层表单中)

注:顶层表单:showwindow属性设置为2:作为顶层表单

l        浏览功能表单的设计思路?

是一个数据表单,表单上可以有相应的控件(从数据环境中直接拖入即可),要求控件只读,还要有一些按钮来移动记录指针。还可以增加简单的查询功能,来实现按查询的条件来浏览表中的记录信息。

注:若用到表格(grid)控件,请去掉表格控件的删除列,即修改deletemark属性:deletemark=.f.



l        查询功能表单的设计思路?

&Oslash;        用set filter to实现:

是 一个数据表单,表单上有相应的表格(grid)控件,(表格控件要求只读),用文本框来接收用户的查询关键字段的值,再用set filter to命令来对表格控件的数据源表进行条件过滤,来模拟查询的效果。若是多关键字查询,请用选项按钮组来让用户选择要查询的关键字类别,如:按姓名或按学号 等。

&Oslash;        用SQL语句Select实现:

是一个数据表单,表单上有相应的表格 (grid)控件,(表格控件要求只读),用文本框来接收用户的查询条件,填加一个“查询”按钮,单击该按钮时,执行select查询语句,查询语句的结 果放到表格(grid)控件中显示(该表格控件的数据源用代码方式设置为:thisform.grid1.recordsourcetype=4,即 SQL说明;thisform.gird1.recordsource=“select * from 表 where 条件 into cursor temp”。)

注:若用到表格(grid)控件,请去掉表格控件的删除列,即修改deletemark属性:deletemark=.f.



l        打印功能表单的设计思路?

&Oslash;        先做有关数据表的报表格式文件(frx)。

&Oslash;        做一个表单,上有按钮控件,单击该按钮,执行预览报表的命令:

report form xx.frx preview

&Oslash;        若想实现条件打印预览,只需在上面的命令中加上for条件语句:

report form xx.frx preview for <条件>

l        修改功能表单的设计思路?

实 质是一个数据表单,表单上有相应的表格(grid)控件(表格控件要求只读),或相应的ole绑定控件(从数据环境中直接拖入表单中产生的控件,控件要求 只读),还有“修改”按钮,单击该按钮,去掉上述控件的只读属性,允许用户来修改表单中显示的记录数据。还有一个“确定”按钮,单击该按钮,设置相应控件 的只读属性为真,不允许用户修改数据,表示数据修改结束。

注:若用到表格(grid)控件,请去掉表格控件的删除列,即修改deletemark属性:deletemark=.f.

l        删除功能表单的设计思路?

&Oslash;        假删除方法:建一个数据表单,表单上有相应的表格(grid)控件(表格控件要求只读)显示数据表中的记录,并且去掉表格(grid)控件的删除列,即 修改deletemark属性:deletemark=.f.;由用户在表格中选择一个要删除的记录,单击“删除”按钮,给记录加上删除标记,即逻辑删除 记录;然后执行set deleted on 命令来屏蔽(不显示)有删除标记的记录,来模拟删除的效果。最后,在“退出”按钮中,执行物理删除命令:pack,来真正删除表中的记录。

注:表必须以独占方式打开(可用命令:use 表 exclusive;也可在设置表单数据环境的属性:exclusive=.t.),否则会删除失败。

l        删除表单中的恢复删除功能实现?

表单中增加一个接收“记录号”的文本框和一个“恢复删除”按扭,单击该按钮,首先不屏蔽(显示)有删除标记的记录,然后执行recall命令来恢复相应的记录,最后再设置系统状态为:屏蔽(不显示)有删除标记的记录。

l        增加记录功能表单的设计思路?

方法1:是一个数据表单,表单上可以有相应的控件(从数据环境中直接拖入即可),要求控件只读。增加一个“增加记录”按钮,单击该按钮,实现在表的末尾增加一条空记录,并去掉相应字段的绑定控件只读属性,允许用户来修改新记录的内容。

注:如果数据库表中设置了主索引,上述方法会失败。原因是主索引的关键字是不许为空的。解决办法是:去掉表的主索引或者用SQL中的insert into 命令来实现。

方法2:建一个表单,表单上填加相应的控件,来接收用户输入的相应字段的值,然后用SQL中的insert into 命令来把新记录的值追加到表中即可。

insert into 表名(字段1, 字段2..) values( 值1,值2…)

l        为什么我的程序编译后一闪而过?

这 个问题有两种可能性,第一种是程序执行完成并退出,第二种是程序正在执行,但界面被隐藏。对于第二种情况,可直接按"Ctrl- Alt-Del"键观察到。造成这两种情况的原因如下:我们先看下面的一段示例程序,假如下面的示例程序是项目的主程序,并且应用项目 以VFP主窗口做为自己的主窗口。

*环境设置

Do Form myScreen &&启动封面表单 _

Screen.Show &&显示VFP主窗口

Do myMenu.mpr &&安装菜单系统

RETURN

为 达到在显示启动封面之前不显示VFP主窗口的目的,在Config.fpw中已写Screen=off,当程序执行到Do Form myScreen这一句时,如果表单myScreen的ShowWindows属性被设为"在屏幕中",则不管是在 开发环境还是在编译环境下,程序都将停下来,表单被显示在_Screen中,而_Screen被隐藏了,因此表单跟着也被隐藏了,所以在屏幕上什么也看不 见。这就是第二种情况的产生原因。为了避免这种错误的出现,必须将myScreen表单的ShowWindow的属性设为"做为顶层表 单",这样就可使在_Screen被隐藏的情况下,myScreen仍然可以被显示出来。但请注意,在此情况下,Do Form myScreen这句话执行后,程序并不能停下来,而是顺序地执行下去,一直到执行到RETURN后程序退出,这也就是著名的"一闪而 过"现象了。为此必须在程序中包含事件处理命令Read Events使程序停下来,如下:

*环境设置

Do Form myScreen &&启动封面表单

Read Events &&开始事件处理:使启动封面停下来

_ Screen.Show &&显示VFP主窗口

Do myMenu.mpr &&安装菜单系统

Read Events &&开始事件处理

RETURN

程 序执行Do Form myScreen后,将启动封面显示在屏幕上,然后向下执行到Read Events开始事件处理,此时启动封面表单必须由用户关闭或由表单事件关闭,否则程序将一直停在Read Events这一句上。不管myScreen表单由谁关闭,在关闭代码中必须包含一句Clear Events的停止事件处理命令,以便开始执行Read Events的下一句指令,顺序执行完成_Screen.Show及Do myMenu.mpr后,用户的主界面就建立完成,同理,此处还需要一个事件处理命令让程序再次停下来,开始菜单系统的命令处理,一般情况,菜单系统中将 包含的"退出"项,其中有"Clear Events"清除事件处理代码,从而停止第二条"Read Events"事件处理命令,退出整个系统。

以上经验恐有谬误,敬请批评!

最后,VFP是个所谓"让我欢喜让我忧"的东东,有时百依百顺,有时莫名其妙。未曾恋爱过的男性最适合习之,以便为今后的恋爱打下坚实的心理基础。

在梅子那边看到经典问题里面有这个题目,话说了一堆,却没说到点子上。

说实话,以前也从来没看到过说到点子上的文章。大多数人也就是知道在主程序里面加了Read events 后能够避免一闪而过的问题而已,到底是什么原理还是不清除。

其实很简单,主程序是个什么文件?它就是一个PRG。

普通的PRG文件执行情况是怎么样的?从头到尾,每一行代码执行下去,然后立即退出。

OK,现在,再想一想,我们想要做的,是怎么样一个程序?是一个会出现菜单、主窗口,等待我们选择某个功能去执行的程序。也就是说,程序应该打开菜单、主窗口以后就中途停下来,等待我们操作的程序。

好,现在再想一下,怎么在PRG中间的某个地方让程序停下来进入那么一种状态?Wait window

可以做到,不过一按鼠标马上就又继续执行了,要让程序一直等着,即使进行了几个操作也不会退出,就只有用Read events了。

随便建一个PRG,不用把它设置成主程序,只要这个PRG中间有Read events,那么程序就会停下来等着,MSDN里面的许多示例就是这么干的。

现在,一闪而过的问题应该清楚了吧?你的菜单是打开了、主窗口是打开了,但是,因为没有进入这个等待状态,所以,程序马上继续执行到末尾然后退出,菜单、主窗口都马上又被关闭了。这些,都是一瞬间就执行完的,结果,看起来就是一闪而过。

再 看看Clear events,它的意思,就是从这种等待状态中退出。许多人把 Clear events 误会成一个退出程序的命令。不对,Clear events只是退出这种等待状态而已,如果你在它的后面再加上一个 Read events,那么程序就又会进入一种等待状态而不会结束。由于Clear events并不是立即退出程序,因此,在Clear events 后面的代码还是会继续执行,比如我们用来关闭数据库、恢复系统环境设置等等的命令之类的,都可以放在Clear events后面去执行。

这个解释,应该是【一闪而过】和【Read events】的最终解释了吧!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多