机房收费系统---(窗体显示) 实时错误426 只允许一个MDI窗体

前端之家收集整理的这篇文章主要介绍了机房收费系统---(窗体显示) 实时错误426 只允许一个MDI窗体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言:

关于窗体显示的问题一开始就遇到了,后来又遇到了,前后原因不一样,但是关于窗体显示的问题即便很小也有必要总结一下,毕竟窗体如果不显示,所有的东西都白费了。

【问题一】主窗体显示之后,点击菜单中的选项却显示不出子窗体.



方法:用API函数SetParent来解决这个问题。

Private Declare Function SetParent Lib"user32" (ByVal hWndChild As Long,ByVal hWndNewParent As Long) AsLong

①子窗体并非不能显示,只是子窗体位于Picture 控件和主窗体之间的位置,也就是说,picture控件把要显示的子窗体遮住了。所以我们需要重新为子窗体找一个父窗体,也就是找一个容器来盛放子窗体。(父窗体严格来说应该是容器)

②SetParent是一个API函数,它的作用是为一个物体指定一个新的父窗体。(也就是把一个物体转到另一个物体上去。

③Setparent 的用法相当简单 语法是: Setparent 物体句柄,目标句柄。

SetParent frmHanCharge.hWnd,FrmMain.hWnd

很简单的,frmHanCharge是子窗体,frmmain是主窗体,利用SetParent让子窗体在父窗体中重新显示

所以现在可以显示出来了,但是不知道大家有没有发现,子窗体是显示出来了,可是子窗体只是沿着主窗体的上方显示出了一道边,并不能显示全部窗体。如下图所示:

找了很到代码解决上面这个问题,查询关于让子窗体随父窗体的大小而变化大小的问题,网上关于这样的解决办法基本雷同,就是用窗体的Resize事件就可以。

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>Private Sub Form_Resize()       '当窗体改变时
MDIFrom.Width = Me.ScaleWidth     '重新设置Mdi子窗体为窗体有效宽度

MDIFrom.Height = Me.ScaleHeight              '重新设置Mdi子窗体为窗体有效高度
End Sub</strong></span>

但是我用了上面的代码并达到想要的效果,于是自己想了最笨的方法,设置窗体的大小和位置,当然最笨的办法也是最有效的办法,下图是后来的结果,不过觉得所有的窗体都这样设置是有些麻烦,但是也没有找到简便的方法,就将上面的代码复制一下粘到了所有的子窗体。

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>Private Sub Form_Load()
'固定窗体大小位置
     Me.Top = 0
     Me.Left = 2500
     Me.Width = 13000
     Me.Height = 9000
end sub 
</strong></span>

【问题二】将工程设置为sub main启动,后方便调试改为frmMain启动,当最后改为sub main启动的时候,竟然出了426错误


426错误,所有的子窗体都不能显示错误提示只允许一个MDI窗体,奇怪,我真的是只有一个MDI窗体的啊,为什么还是会报错?

①在网上查了很多,有10期的李雪师姐有过同样的错误和总结,我找到了他的博客细心研究,下面是博客链接http://www.jb51.cc/article/p-xkpfpirg-vo.html 大家有兴趣的可以看一下。

②但是我和师姐出现的原因还是不太一样,我的登录窗体的代码真的只写了一个frmMaind的show,没有多写。

③于是我查了一下关于出现这个问题的原因,毕竟找到根源自己才会彻.底解决问题。

④一个工程只允许有一个 MDIForm。此错误产生的原因及解决方法如下:

* 试图向工程中加载包含MDIForm 的文件,该工程中已经包含一个 MDIForm。

在加载其它文件之前,先删除包含已加载 MDIForm 的文件

* 试图加载 MDIForm 的第二个实例,该MDIForm 是用 Dim 或 Set 语句创建的。

在工程中仅能创建 MDIForm 的一个实例。

⑤看到这里我仿佛明白了些什么,大概意思就是不能同时加载两次MDI主窗体,我开始着手从代码里面找,因为错误出现在子窗体的加载,所以只可能是主窗体和模块以及子窗体的from load事件出的问题我按了之后发现真的是模块窗体出了问题。

⑥下面是模块窗体中sub main的代码,加了单引号变为注释的两行代码原来是有的,后来把这两句去掉之后就可以运行了,完美解决

'系统启动后,需要对用户进行判读,如果登陆者是授权用户,将进入系统,否则程序停止运行

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>Sub main()
    Dim fLogin As New FrmLogin
   'Dim FrmMain As New FrmMain
   fLogin.Show vbModal                         '显示登陆窗体实例
   
   If Not fLogin.OK Then
       End
    End If
    Unload fLogin
    
     '判断是否进入系统
    ' Set FrmMain = New FrmMain
       FrmMain.Show
   
End Sub
 </strong></span>

【总结】

有时候小的问题也会困扰很久,但是最重要的是不能懈怠,多查多问,总会有点眉目,然后加以思考,实在解决不了还有其他同学和师傅,做好问题记录,只要肯用心,总有收获。

猜你在找的VB相关文章