当前位置: 代码迷 >> VFP >> VFP9模态表单显示的大有关问题
  详细解决方案

VFP9模态表单显示的大有关问题

热度:7027   发布时间:2013-02-26 00:00:00.0
VFP9模态表单显示的大问题!
一个以前用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();


有人遇到过此种情况吗?怎么解决?

------解决方案--------------------------------------------------------
没遇过,也没太明白你的情形
所以也无法在VFP中重现你的问题
所以也无法帮助你
------解决方案--------------------------------------------------------
好象很早以前有碰过,以screen为底不会有这问题
ShowWindow = 1 --》 0
------解决方案--------------------------------------------------------
本帖最后由 dkfdtf 于 2010-06-16 16:29:18 编辑
我升级到 7423 后立即出现录像中问题,换回 5815 版现象消失。

7423 主要是修复了 vfp9 对象辅助式报表的一些问题,如果你没有使用 vfp9 报表的这些新增功能(即没有 Set ReportBehavior 90)的话,建议不要升级到 7423 版。

vfp9 的几个后续升级版本,不断出现 bug 重现的状况,大概是临近 vfp 团队解散的原因,人员陆续离开,源代码管理肯定出现了混乱。感觉最稳定的还是 sp1 版本,bug 最少,如果不是 sp2(5815) 中修复了 image.PictureValue 这个需要使用的功能,我都不会升级到 sp2,但 sp2 至少又带入了一个常用功能的 bug: grid.header 的 tooltiptext 不显示,其他不常见的 bug 也重新出现了不少。

------解决方案--------------------------------------------------------
这是一个复杂问题

------解决方案--------------------------------------------------------
没有遇到过,学习~~
------解决方案--------------------------------------------------------
 7423 立即出现问题

------解决方案--------------------------------------------------------
十豆三是个好老师
------解决方案--------------------------------------------------------
我的环境: Windows XP SP3,VFP9.0 SP2 7423

测试1:直接运行 楼主5楼 提供的例子,不管是只运行一个实例还是二个实例,均几率很高的出现楼主描述问题。

测试2:我重新编译程序(不改变任何属性及代码),再测试,结果与 测试1 一样。

测试3:将 modalform1.scx 和 modalform1.scx 的 Desktop 属性 设为 .F.,再编译测试,没有出现,看来问题在 Desktop 属性 上。楼主不将 Desktop 属性 设为 .T.能否满足你的需求
------解决方案--------------------------------------------------------
  相关解决方案