VFP9模态表单显示的大问题!

MadeInWhere 2010-06-10 09:47:26
加精
一个以前用VFP9开发的程序,在维护中收到客户不断地抱怨,原因是当多个模态表单层叠(一个模态表单中又DO FORM另一个模态表单)时,如果此时通过任务栏切换到其它应用程序的窗口或者单击当前活动模态窗口在任务栏上的图标使其最小化到任务栏上后,当再次激活该应用程序在任务栏上的图标时,原本最顶层的那个模态表单竟然“躲”到调用者表单的后面,也就是说本应该在最上面的那个模态表单竟然被调用者的窗口给覆盖了,导致的后果就是应该接收鼠标或键盘操作的表单被隐藏起来了,无法响应鼠标或键盘操作,当然就不能关闭;而显示的这个表单却中看不中用,也无法关闭。最终的结局是用户必须使用任务管理器强行Kill。

所有模态表单的设置均采用如下设置:
ShowWindow = 1 &&In Top-level Form
WindowType = 1 &&Modal
ShowTips = .T.
AlwaysOnTop = .F. &&默认值
Desktop = .T.

尝试过的方法如下(在所有模态表单的init()事件中):
1.调用模态表单的ZOrder(0)方法以及设置表单的AlwaysOnTop = .T.;
2.调用WIN API SetForegroundWindow(THISFORM.hWnd);
3.调用WIN API SetWindowPos函数。具体参数为:

#define HWND_TOP 0 &&仅限于进程内所有窗口的最顶层窗口
#define HWND_TOPMOST -1 &&不分应用程序,成为所有窗口的最顶层窗口
#define SWP_NOSIZE 0x0001
#define SWP_NOMOVE 0x0002
#define SWP_SHOWWINDOW 0x0040
LOCAL nFlag as Integer
nFlag = BITOR(SWP_NOMOVE,SWP_NOSIZE,SWP_SHOWWINDOW)
=SetWindowPos(THISFORM.hwnd,HWND_TOPMOST,0,0,0,0,nFlag)


以上三种方法均无法100%解决问题,当快速频繁点击任务栏上VFP应用程序的图标使其在最小化与还原之间切换时,还会偶尔发生原本最顶层的模态表单被调用者窗口遮蔽的情况。

而在VC++中无论级联调用多少个模态对话框均不会出现最后一个对话框被前一个遮挡住的情况。看来应该是VFP的问题。

CMyDialog dlg;
dlg.DoModal();


有人遇到过此种情况吗?怎么解决?
...全文
2208 99 打赏 收藏 转发到动态 举报
写回复
用AI写文章
99 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南雨田 2012-11-26
  • 打赏
  • 举报
回复
更正:“表单1和表单2的切换只能通过任务栏进行” 忘了说,我用的是VFP9.0,sp2_7423
江南雨田 2012-11-26
  • 打赏
  • 举报
回复
我曾经也遇到一个关于模式表单的问题: 1、建一个"表单1",showWindow= 1 -在顶层表单中,windowType=1 -模式,在这个表单添加一个按钮,click为:do form 表单2 2、建另一个表单“表单2”,showWindow=2-作为顶层表单,windowType=0-无模式,alwaysOnTop = .T. 运行“表单1”,点击按钮调出“表单2”,这时会出现以下问题: 表单1和表单2的切换只能通过工具栏进行,在屏幕上点击表单无法切换。 后来我用了一个方法解决了,添加一个timer控件,用API中的GetCursorPos和ClientToScreen检测鼠标位置,如果鼠标移动到“表单2”区域内,执行:表单2.show(),这样表单2就自动被激活。
npxyg 2011-12-17
  • 打赏
  • 举报
回复
我也在用VFP6,用VFP9会出现问题:
关于表单在顶层表单中显示的两个问题
我把一个表单设为"顶层表单",其它表单为"在顶层表单中".
对顶层表单中的菜单项,对应的为打开表单"命令".所以运行时,在顶层表单中,点击菜单项时,打开对应的表单,在顶层表单中显示.
问题1:多次点击某个菜单项时,会多次打开同一表单.如何设置只打开表单一次?
问题2:在顶层表单界面中,如何实现只有在关闭已打开的一个表单后,才能打开另一个表单?
月沐庭轩 2011-09-10
  • 打赏
  • 举报
回复
有用处,为了避免这种现象,像我这种菜鸟,只有尽量不在模式表单里又调用 模式表单了。
可是假如真有这种情况,还是要按照十豆三所说的那么去办了。
everyday1212 2011-08-19
  • 打赏
  • 举报
回复
这个没玩过,学习一下
cinplehhf 2010-06-25
  • 打赏
  • 举报
回复
很好,很强大
TTEERREENNCCEE 2010-06-24
  • 打赏
  • 举报
回复
怎么还不给我分啊?
a498545088 2010-06-24
  • 打赏
  • 举报
回复
怎么还不给我分啊?
qy506 2010-06-23
  • 打赏
  • 举报
回复
顶一顶,增加点积分!!
firstxinjie 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 83 楼 apple_8180 的回复:]
引用 82 楼 babydog01 的回复:
还有人用VFP???


是的,因为还有人在吃饭。
[/Quote]

似乎看到过原来VFP开发小组的老大说过一句话,翻译过来,大致就是:无论是曾经,还是现在,对真正了解VFP的人来说,它是最棒的。
roly87 2010-06-22
  • 打赏
  • 举报
回复
好好学习一下
liang2010wa 2010-06-22
  • 打赏
  • 举报
回复
大家好
liang2010wa 2010-06-22
  • 打赏
  • 举报
回复
hehe
czw8819 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 junshi_network 的回复:]

个人感觉楼主对模式表单的作用理解不准确,VFP的模式表单一般是用来输入数据用的,在模式表单未关闭前,你用鼠标单击模式表单外的其他东西是没有反应的,所以同时运行的模式表单不应该超过一个,你在模式表单里又调用其他的模式表单不出问题才怪。
你要表单能在桌面自由移动而不是在主表单里,直接设置为顶层表单就可以了,又不是说除了主表单外其他表单就不能是顶层表单了。
[/Quote]
正解
十豆三 2010-06-22
  • 打赏
  • 举报
回复
楼主有空用 表单集 试试
MadeInWhere 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 junshi_network 的回复:]
个人感觉楼主对模式表单的作用理解不准确,......你在模式表单里又调用其他的模式表单不出问题才怪。
你要表单能在桌面自由移动而不是在主表单里,直接设置为顶层表单就可以了,又不是说除了主表单外其他表单就不能是顶层表单了。
[/Quote]

有必要对这位朋友的观点纠正一下,以免对VFP不熟的朋友被您的观点误导了!

"你在模式表单里又调用其他的模式表单不出问题才怪。"
----谁规定的在模态表单里不能再调用其它的表单?

“直接设置为顶层表单就可以了,又不是说除了主表单外其他表单就不能是顶层表单了。”
----您说的当然没错,但您能在do form TOP-LEVEL类型的表单时使用with向被调用的TOP-LEVEL表单传递参数吗?

楼上有版主和大版主都没对模态表单的使用提出异议,您为什么不考虑为什么呢?您为什么不下载那个测试项目试一试或下载那个测试的视频看一看呢?每个参与帖子的人都应该抱着严谨求知的态度来对待问题,而不是为了那10分而稀里糊涂来蜻蜓点水,否则您就是在浪费一次学习的机会!您付出了时间却没得到回报,这样损失的还是您自己吧。

to: apple_8180
现在暂时没时间使用表单集进行测试,因为这只是对之前旧项目的维护,只有这个项目是用VFP编的,再投入时间意义不大。再次感谢您和dkfdtf的热情相助!
qewei87 2010-06-22
  • 打赏
  • 举报
回复
努力学习!!!
GORY666 2010-06-22
  • 打赏
  • 举报
回复
菜鸟路过...
十豆三 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 babydog01 的回复:]
还有人用VFP???
[/Quote]

是的,因为还有人在吃饭。
babydog01 2010-06-22
  • 打赏
  • 举报
回复
还有人用VFP???
加载更多回复(74)

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧