论文部分内容阅读
摘要:本文叙述了在vfp编程过程中遇到的问题:即vfp中顶层表单中如何调用其他表单及退出时确认信息的实现的探索过程及解决问题的方法,以及留给我们的启示。
关键词:VFP;顶层表单;确认信息
中图分类号:TP317文献标识码:B文章编号:1009-3044(2008)08-10ppp-0c
笔者教授vfp已有八九年了,但从笔者学习及教授vfp这些年中体会vfp教授中遇到的许多问题及其解决的方法,下面是笔者在教学中遇到的比较典型的案例,下面写出来与大家分享。
1 问题提出
笔者在指导学生用vfp编写程序时,用的是顶层表单作为主程序界面,为了便于叙述姑且命名为:“表单1”,为了屏蔽系统窗口,不影响系统的总体界面,采取在config.fpw中加入一句:screen=off这样才能屏蔽掉系统窗口,不致影响软件的效果。结果是系统菜单不出现了,但在菜单中调用其他表单时却无法显示新调用的表单(为便于叙述命名为“表单2”),任务管理器中明明显示已经在运行可是就是屏幕无法显示,笔者试了多种方法比如:在菜单中用命令: “表单2.show”,故障依旧,检查其他属性也正常,笔者很是郁闷,可又是没有办法。因为手头没有资料,上网查吧,网上关于vfp编程的资料少的可怜,都是2002年的占多数,据行内人士说:谁还用vfp编程早就淘汰了,言下之意:你啊太老土啦。这些说法更加打消了笔者的自信心,可是笔者很是不服气,既然淘汰了,为什么国家二级还在考呢,难道笔者多少年教授vfp积累下来的经验就白费了么,我很是不死心。笔者就天生就有股不服输的心,我就不信一门语言,它本身应当具备完备性,这样的问题肯定能解决。
2 探索
于是笔者,一个接一个的查表单的属性,挨个实验,功夫不愧有心人,终于让笔者找到了,当笔者找到属性showwindow其下面有三个选项:“0—在屏幕中(默认) ,1—在顶层表单中,2—作为顶层表单”。找到这里我恍然大悟,原来这一属性“默认值”为:“0—在屏幕中(默认)”,而我在config.fpw文件中恰恰关闭了屏幕,自然无法显示了。找到了症结我欣喜若狂,可是冷静下来之后又遇到了问题:如果将config.fpw文件中screen=off重新变为:screen=on吧,在顶层表单“表单1”中调用“表单2”时倒是可以显示了,可是影响软件整体效果的系统屏幕显示出来了,不可取,我有重新将screen=on改为screen=off,试一试第二选项吧我将,showwindow属性设为:1—在顶层表单中,接下来运行顶层表单“表单1”中菜单调用“表单2”,显示倒是能显示,可是结果让人大跌眼镜,原来这一表单显示在顶层表单中,把原来的表单的布局,控件覆盖的面目全非,看来似乎也是不行。于是我再考虑第三个选项:2—作为顶层表单,这倒是能分别显示,可是一个软件中只能由一个顶层表单,正所谓:“家有千口主事一人”。否则在顶层表单中设置的全局变量统统都要作废了,况且在顶层表单中使用菜单或程序中调用表单:
do form表单1.scx
接下来一句是:
readevents
以便激活表单处于显示等待状态,可是在关闭表单时一般要加上一句:
clear events
以便释放内存彻底关闭vfp。基于这样的观念我在每一个表单的
destory事件
中都加上一句:clear events
这样我在关闭“表单2”时结果把顶层表单“表单1”也关闭了。
这是在后来的调试中才发现的,现在我主要考虑第二个选项:“1—在顶层表单中”,这样考虑是正确的因为 “表单1”是顶层表单做为主程序,“表单2”只是它的子表单,而且要求在关闭“表单2”时“表单1”不能关闭,基于这样的考虑我又查找“表单2”的属性,最终让我找到了解决的办法。
3 问题解决
问题最终解决办法如下
表单2属性:
showwindow设为1—在顶层表单中
desktop 设为 .T.*其默认值为 .F.,该属性设置表单是否在vfp主窗口中(这一属性很关键费了我好几天的时间才发现)
关键的一条是在“表单2”的“destroy”事件中去掉: clear enents
而只保留“表单1” 的“destroy”事件: clear enents。
这样万事大吉问题全部解决。
有以上的编程调试程序经验,我还解决了在“退出”表单前,如何加上确认信息的问题:
就是在“关闭”按钮里输入的不是:
thisform.release
而是:
ThisForm.QueryUnload
因为表单在卸载前,首先要询问表单的QueryUnload事件,然后再卸载表单。也就是说,QueryUnload事件是表单卸载时第一个被触发的事件。在 QueryUnload 事件过程中执行 NODEFAULT命令可以阻止表单卸载。这样我们通过在QueryUnload 事件中巧妙包含NODEFAULT,就能避免直接卸载表单。
而在表单的QueryUnload事件中输入以下命令
nYesNo = MessageBox("确定要退出吗?",4 48 256,"提示")
*--上面显示包含“是”、“否”两个按钮的对话框
If nYesNo = 6
关键词:VFP;顶层表单;确认信息
中图分类号:TP317文献标识码:B文章编号:1009-3044(2008)08-10ppp-0c
笔者教授vfp已有八九年了,但从笔者学习及教授vfp这些年中体会vfp教授中遇到的许多问题及其解决的方法,下面是笔者在教学中遇到的比较典型的案例,下面写出来与大家分享。
1 问题提出
笔者在指导学生用vfp编写程序时,用的是顶层表单作为主程序界面,为了便于叙述姑且命名为:“表单1”,为了屏蔽系统窗口,不影响系统的总体界面,采取在config.fpw中加入一句:screen=off这样才能屏蔽掉系统窗口,不致影响软件的效果。结果是系统菜单不出现了,但在菜单中调用其他表单时却无法显示新调用的表单(为便于叙述命名为“表单2”),任务管理器中明明显示已经在运行可是就是屏幕无法显示,笔者试了多种方法比如:在菜单中用命令: “表单2.show”,故障依旧,检查其他属性也正常,笔者很是郁闷,可又是没有办法。因为手头没有资料,上网查吧,网上关于vfp编程的资料少的可怜,都是2002年的占多数,据行内人士说:谁还用vfp编程早就淘汰了,言下之意:你啊太老土啦。这些说法更加打消了笔者的自信心,可是笔者很是不服气,既然淘汰了,为什么国家二级还在考呢,难道笔者多少年教授vfp积累下来的经验就白费了么,我很是不死心。笔者就天生就有股不服输的心,我就不信一门语言,它本身应当具备完备性,这样的问题肯定能解决。
2 探索
于是笔者,一个接一个的查表单的属性,挨个实验,功夫不愧有心人,终于让笔者找到了,当笔者找到属性showwindow其下面有三个选项:“0—在屏幕中(默认) ,1—在顶层表单中,2—作为顶层表单”。找到这里我恍然大悟,原来这一属性“默认值”为:“0—在屏幕中(默认)”,而我在config.fpw文件中恰恰关闭了屏幕,自然无法显示了。找到了症结我欣喜若狂,可是冷静下来之后又遇到了问题:如果将config.fpw文件中screen=off重新变为:screen=on吧,在顶层表单“表单1”中调用“表单2”时倒是可以显示了,可是影响软件整体效果的系统屏幕显示出来了,不可取,我有重新将screen=on改为screen=off,试一试第二选项吧我将,showwindow属性设为:1—在顶层表单中,接下来运行顶层表单“表单1”中菜单调用“表单2”,显示倒是能显示,可是结果让人大跌眼镜,原来这一表单显示在顶层表单中,把原来的表单的布局,控件覆盖的面目全非,看来似乎也是不行。于是我再考虑第三个选项:2—作为顶层表单,这倒是能分别显示,可是一个软件中只能由一个顶层表单,正所谓:“家有千口主事一人”。否则在顶层表单中设置的全局变量统统都要作废了,况且在顶层表单中使用菜单或程序中调用表单:
do form表单1.scx
接下来一句是:
readevents
以便激活表单处于显示等待状态,可是在关闭表单时一般要加上一句:
clear events
以便释放内存彻底关闭vfp。基于这样的观念我在每一个表单的
destory事件
中都加上一句:clear events
这样我在关闭“表单2”时结果把顶层表单“表单1”也关闭了。
这是在后来的调试中才发现的,现在我主要考虑第二个选项:“1—在顶层表单中”,这样考虑是正确的因为 “表单1”是顶层表单做为主程序,“表单2”只是它的子表单,而且要求在关闭“表单2”时“表单1”不能关闭,基于这样的考虑我又查找“表单2”的属性,最终让我找到了解决的办法。
3 问题解决
问题最终解决办法如下
表单2属性:
showwindow设为1—在顶层表单中
desktop 设为 .T.*其默认值为 .F.,该属性设置表单是否在vfp主窗口中(这一属性很关键费了我好几天的时间才发现)
关键的一条是在“表单2”的“destroy”事件中去掉: clear enents
而只保留“表单1” 的“destroy”事件: clear enents。
这样万事大吉问题全部解决。
有以上的编程调试程序经验,我还解决了在“退出”表单前,如何加上确认信息的问题:
就是在“关闭”按钮里输入的不是:
thisform.release
而是:
ThisForm.QueryUnload
因为表单在卸载前,首先要询问表单的QueryUnload事件,然后再卸载表单。也就是说,QueryUnload事件是表单卸载时第一个被触发的事件。在 QueryUnload 事件过程中执行 NODEFAULT命令可以阻止表单卸载。这样我们通过在QueryUnload 事件中巧妙包含NODEFAULT,就能避免直接卸载表单。
而在表单的QueryUnload事件中输入以下命令
nYesNo = MessageBox("确定要退出吗?",4 48 256,"提示")
*--上面显示包含“是”、“否”两个按钮的对话框
If nYesNo = 6