怎样切换到另一个form?

li_new 2002-09-06 11:07:13
加精
如果在一个form1上加一个button,在button的click中编写:
dim frm2 as new form2
frm2.show
me.close
问题是:form2出现后又会很快的消失掉,这是为什么?怎么解决?窗体之间不可以通过show和close切换吗?
...全文
364 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
superspeed123 2002-09-08
  • 打赏
  • 举报
回复
很简单哦
dim formi as new filename.form2
formi.showdialog()
LostAngel911 2002-09-07
  • 打赏
  • 举报
回复
第一个启动的FORM不能关闭
不然整个程序都会关闭
setfocus 2002-09-07
  • 打赏
  • 举报
回复
FORM做为一个类存在这是VB。NET突破的一点,对于ME是在没有声明的时候作为整个应用程序的,所以你没有指明也就是说ME在NET里面的概念已经改变!如果想用ME那么就生命!所以这是你最想知道的给你了:DIM WITHEVENTS FORM1 AS SYSTEM。WINDOWS。FORMS。FORM(在初始化中声明)然后就可以
FORM1=ME
还有一点,你单步执行的时候会发现你的写法会让程序在最后的落脚点在ME。CLOSE上!所以都关闭了,这是VB。NET的面向对象的改变!重新整理面向对象的概念吧!还有类的概念!
Latitude 2002-09-07
  • 打赏
  • 举报
回复
这个问题涉及到两个知识点:线程/进程、类
1)我们以前编C程序都知道,main()是程序开始执行的入口点。在我那篇贴子中,把module的sub main作为程序的入口点,也就是说它执行的就是进程的开始,占据了主线程。主线程如果一关闭,整个进程就会退出内存。那么,sub main做了什么事呀?只是一句 Application.Run(F1),意思就是把对程序的控制权交给了F1(form1的实例)。因此,关闭form1,程序就会关闭而退出。hide的目的也就是保留主线程
2)再来解释一下你程序中的错误,在于你不理解new的意思,new其实就是一个构造函数,用于在你的程序中实例化类。也就是说,你写一句:
dim frm1 as new form1
就在内存中开辟了一块用于实例化form1,表现上看,就是创建了一个form1这样的窗体。
我们来做个实验:
你在一个窗体frmMain里,放四个按钮,在每个按钮的click事件里写上
dim frm1 as new form1
frm1.show
那么,你将会看到四个一模一样的form1。
明白了吧?但此form1非彼form1,都是form1类的一个个实例化的内容。
所以你不能指望在调用的时候,命名一个局部的frm1就能一直都对form1的实例进行控制,这是不可能的,而在vb中是可以的,就是因为vb不是面向对象的,你在程序中的任何时候写form1,都是面条或包子它本人(看过面条与包子的系列斗争史吧?)
从vb到vb.net的过渡,每个vb程序员都会有这样的不解,不用担心。你慢慢会适应的。
明白了,你最后看到的那个form1,不是你最先hide起来的那个,而是你后来new出来的那个,所以你关它,当然退不出主线程,因为进程的控制权在你第一次hide起来的那个form1的实例那呢。
3)现在说明一下我指出我提供的程序的出错问题:
  我们知道,一个类的实例化,必须要先构造它,构造一次,才有一个实体,我程序中,只构造了一次,就是在module里命名public的时候,也就是说,从头到尾,form们的实例都分别只有一个,这也是你为何能唤出hide掉的主线程的那个form的原因。
  你用了close,就等于析构了你在module里构造的那个form的实例。也就是说毁掉了类的对象。不报错才怪//hehe


----
怎么解决,你想在程序中close掉一个窗,下一次还能用。这当然可以,但我现在不想马上说,你好好理解一下我这次写的内容,不行就翻一下类的书,理解好了,再回来继续讨论。

              by Henry(一个很疲惫的老人)

Latitude 2002-09-06
  • 打赏
  • 举报
回复
这个问题看来真是迈不过的坎了,很多新人都来问这个问题,我有必要单为它开个子版了//hehe
请看一下:
http://www.csdn.net/Expert/TopicView1.asp?id=965919
我详细地分析了类与对象在vb.net中的应用,以及窗体切换的方法。

----
Good Luck!

by Henry
mynewpc 2002-09-06
  • 打赏
  • 举报
回复
把frm2 定义为应用程序级全局变量即可
li_new 2002-09-06
  • 打赏
  • 举报
回复
Latitude(Henry):
你的文章我一看过,但你的解释我还有不明白的地方!
如果我们建立三个form分别为form1,form2,form3。在三个form上分别有三个button,分别为button1,button2,button3.
如果我这样做也可以从一个form跳到另一个form的:
button的click
dim frm2 as new form2
me.hide
frm2.show
button2的click
dim frm3 as new form3
me.close
frm3.close
当然,最后frm1是无法关闭的,这是为什么呢?还有application.run()具体是什么含义? 为了在窗口之间的切换我们必须要在内存中一直存在一个窗体吗?这样不是很占内存吗?
还有如果按照呢的方法我们在frm3中的button中写:
me.close
frm1.show
即frm1先隐藏后出现frm2,frm2关闭后出现frm3,frm3关闭后出现frm1。这时如果再次的点击button1将会出现:
未处理的“System.ObjectDisposedException”类型的异常出现在 system.windows.forms.dll 中
其他信息:无法访问名为“Form2”的已处置对象。
为什么???

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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