zoukankan      html  css  js  c++  java
  • 多窗体应用中的注意点

    创建两个窗体 ,每个窗体上各有一个按钮,点击时隐藏其所在的那个窗体,切换出另一个窗体 来

    其实只需要两句写在按钮的单击响应中的语句就行了:

    两个窗体:Form1与Form2。

    Form1上的按钮为: Button1,Form2上的按钮为: Button2 

    于是,我毫不犹豫地在VS.NET中内开始我的第一个VB.NET的项 目了。首先,新建了一个VB.NET的Windows应用程序项目,自动生成了一个 Windows Form:Form1,在其上加入一个按钮控件:Button1;然后,添加了一个 Windows Form:Form2,在其上加入了一个按钮控件:Button2。

    在设计窗口 双击Button1后,编译器会切换到代码窗口的Button1的单击响应代码中。

    在代码段中故计重施,当我想写Form2.Show时,在Form2之后打个点,出现的智能 感知菜单中,却没有Show这一方法。真奇怪,这怎么可能?难道VB.NET改动有这 么大

    看了下Form1中的代码的开头处:

    Public Class Form1
        Inherits System.Windows.Forms.Form

    立刻就明白了,现在的Form1是一个从System.Windows.Forms.Form继承下来的类了,调用的时候当然需要先实例化了,

    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.Hide()
            Dim Frm2 As New Form2
            Form2.Show()
        End Sub
    
    End Class
    Public Class Form2
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Me.Hide()
            Dim Frm1 As New Form1
            Frm1.Show()
        End Sub
    End Class

    在 Form2 的 Button2 的单击事件中也相似地写了一段代码,运行 一下,和VB6的效果差不多了。

    但是问题也随之而来...

    我们在 Form1 中添加一个文本框 textbox1,清空其中的文字。然后运行了一下程序。在运行中,他在 文本框里写了几个字:“Hello World”,然后点击 Button1 切换到 Form2,接着点击Button2,重新出现的Form1的文本框中却变成了空白。

    “这……”我一时语塞,慢慢地想起点什么, “应该是程序通过 New 构造方法,每次点击按钮都会重新实例化一次Form类吧?

    所以每次重新出现的窗体都不是以前曾经出现过的那个。那以前的窗体也就失踪了,调不出来了。”

    虽然我们每次点击实例化一个新的窗口,但先前旧的窗口还在内存中。你每实例化一次,系统就会开辟一块内存给一个对象,并会有相应的线程对其进行控制与管理。

    如果作为进程中主线程的第一个 Form1 被 Hide 起来,没有关闭它,那么即使你关闭后来新创建的所有窗体,进程也不会被中止。那么,用什么方法去找回失踪的窗体呢,或者说怎么样就只使用一个对象,不再每次实例化呢?

    没错,“全局对象!”只有利用全局变量,使 Form1 与 Form2 只实例化一次,这样就可以了。

    请注意:这里不是在Form1 和 Form2 两个窗体中创建全局变量,因为这样会造成窗体启动时就对两个窗体就行相互的 NEW ,造成死循环。

    所以我们只有创建一个模块文件:module1.vb,并且同时在:解决方案管理器-〉项目名.sln -〉右点鼠标 -〉属性 -〉通用属 性->常规->启动对象 -〉改为Module1。让程序启动后先运行 Module1 中的代码指令,然后编写代码如下:

    Module Module1
        Public Frm1 As New Form1 '定义Form1的公用变量实例
        Public Frm2 As New Form2 '定义Form2的公用变量实例
        Sub main()
            '这句话表明程序启动了modele后,会接下来运行frm1,即form1的一个实例。主线程就成为运行期的frm1了。  
            Application.Run(Frm1)
        End Sub
    End Module

    这样一来,frm1、frm2 就成为全局变量了,在Button1与 Button2的单击响应代码中只要写:frm1.show就可以了。

    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.Hide()
            frm2.Show()
        End Sub
    End Class
    Public Class Form2
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Me.Hide()
            frm1.Show()
        End Sub
    End Class

    再运行程序,可以了,“Hello World”一直都会保持在 Form1 中的文本框里。

     

    然而,当我们把 frm1 隐藏起来的时候,关闭了Form2窗口 (frm2实例),桌面上什么窗体都没有了,进程又一次被陷入在无法中止的情况。

    那怎么解决关闭此窗口而不影响主窗口呢,请见本博客的另一篇文章“垃圾回收器 Dispose 和 Finalize 的互补作用

  • 相关阅读:
    人月神话阅读笔记之二
    第二阶段:团队开发Fooks第三天
    第二阶段:团队开发Fooks第二天
    第二阶段:团队开发Fooks第一天
    第十三周进度总结
    人月神话阅读笔记之一
    第一阶段意见评论
    拓扑排序
    欧拉回路
    矩阵优化
  • 原文地址:https://www.cnblogs.com/lfls128/p/4943078.html
Copyright © 2011-2022 走看看