当前位置: 代码迷 >> VB Dotnet >> 咨询大家一下窗体间互相调用的有关问题
  详细解决方案

咨询大家一下窗体间互相调用的有关问题

热度:150   发布时间:2016-04-25 02:02:24.0
咨询大家一下窗体间互相调用的问题
我建了2个窗口form1和form2,2个窗口的load载入中分别放置各自的参数初始化,也分别放置了button1和button2按钮,点击button1会打开form2,form1会隐藏,而点击button2会打开form1,form2会隐藏,经常要点击button1和button2按钮使在form1和form2这2个窗口来回切换。我的代码具体如下:
form1的代码:
Public Class form1
Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim a1 As Integer = 1
End Sub

Private Sub button1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
Me.Hide()
Dim frm2 As New form2
             frm2.Show()
End Sub
End Class

form2的代码:
Public Class form2
Private Sub form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim a2 As Integer = 2
End Sub

Private Sub button2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click
Me.Hide()
Dim frm1 As New form1
             frm1.Show()
End Sub
End Class

具体疑问如下:
1.我需要经常要点击button1和button2按钮使在form1和form2这2个窗口来回切换,实际上我想要的效果是:当在form1点击button1,会“彻底”关闭form1(即不是所谓的hide隐藏掉),然后打开form2,同时form2的form2_Load会“重新”初始化a2;反之当在form2点击button2亦然。但上面的代码会不断实例化form2和form1窗口,会不断增加内存占用。这个有什么办法可以实现我想要的效果?
2.我试过不用窗体实例化,即不用Dim frm2 As New form2、frm2.Show()和Dim frm1 As New form1、frm1.Show(),直接使用form1.Show()和form2.Show()以及对应的hide(),这样不会增加内存占用,但是当在第2次来回切换这2个窗口时,不会调用对应Load来初始a1和a2,而且如果在这2个窗口加入me.close,都会把2个窗口关闭掉(我想要的效果是只是关闭当前窗口,另外一个窗口保持存在)。这种情况有什么办法解决?

感觉VB.NET这种窗体间互相调用机制很SB很不人性化。

------解决思路----------------------
有个最简单的办法,就是这样:
Application.Run(new Form2);
this.Close();
用新的线程去打开Form2,并且把它当做主线程,而Form1关闭后,之前的主线程就退出了

否则你将Form2当做一个子窗体打开的话,Form1关闭,主线程就退出了,Form2也会跟着关闭的
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

自己对程序的基本运行机制都不懂就随意的 说: "感觉VB.NET这种窗体间互相调用机制很SB很不人性化。"这种很幼稚的话我也是醉了....
自己的自己的程序设计有问题,不找原因....

那请问阁下支个招!

1--你要先说清楚你的彻底关闭是什么意思???
2--窗体Hide后你为什么不先判断窗体是否存在???存在就直接Show,不存在然后在NEW....不就不会陷入你所谓的"不断实例化form2和form1窗口,会不断增加内存占用"
第二个问题,你在定义全局变量的时候直接赋值,就不需要触发窗体的Load事件在复制,这样你不管Hide或者Show都不会影响你的赋值...如果需要改变可以在窗体的Active事件里面重新赋值....

1.例如打开form1的时候,form2彻底关闭,form2定义的变量控件什么之类都全部注销不留存内存之中;打开form2反之亦然。
2.我1楼的内容只是粗略举个例子。实际上按照你说的先判断form1的实例frm1存不存在,存在则show,不存在则重新new,但是这样的效果使得show的情况不能重新调用load,这不是我想要的结果。而每次来回切换都new实例化,就可以每次重新调用load,但是会"不断实例化form2和form1窗口,会不断增加内存占用",这就是今天我提出的问题的纠结之处。我查了网上一切方法都没有达到我的效果。
3.我需要有些变量或控件在form1和form2的load里定义,不想在模块之类的东西里定义公共变量。

以你的需求,添加一个主窗体,在程序运行时通过主窗体将From1或者From2显示出来后将自己隐藏,然后你在去实现你的相关功能,只要保证你的主线程不Exit,你From1和From2都可以进行Close操作....

我回头再试试。谢谢你先。

试了一下,在主窗体的load中加入form1.Show()和Me.Hide(),设置主窗体先启动,主窗体和form1会同时启动显示,主窗体不会自动隐藏。

那 就把主窗体设置成透明就可以了
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Opacity = 0
        Dim frm As New Form2
        frm.Show()
    End Sub
End Class
Public Class Form2
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New Form3
        frm.Show()
        Me.Close()
    End Sub
Public Class Form3
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New Form2
        frm.Show()
        Me.Close()
    End Sub
End Class
以上是我的测试代码....
透明方式有两种一种是用窗体的Opacity属性,另外一种是用WindowsAPI
  相关解决方案