这个问题涉及到两个知识点:线程/进程、类
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