请教关于对象的生命周期的问题
当我在一个过程中调用一个对象的某一方法时,首先被调用的是其Initialize()方法,然后是该方法本身,最后是Terminate()方法,也就是说该对象每次被调用时都要经过构造和析构,换句话说在该过程结束前该对象就已经从内存中被卸载(该过程中不止是调用该对象该方法的一条语句),请问如果我想让它的生命周期变的和在c++中的一样该怎么办?
ps:大家是否觉得vb中的对象的生命周期有点奇怪?
问题点数:100、回复次数:15Top
1 楼slyse(slyse)回复于 2002-04-23 21:09:54 得分 0
我想可能是你哪里搞错了,我自己写的类正常得很,好象没有这个问题?Top
2 楼goodbox(追忆现实)回复于 2002-04-23 21:13:09 得分 0
大概面向对象和面向事件有很多区别吧!Top
3 楼kevindude(kevin)回复于 2002-04-23 21:18:00 得分 0
不会吧,难道是我的类有问题?Top
4 楼kevindude(kevin)回复于 2002-04-23 21:34:02 得分 0
类
Private cnnHeatTracer As ADODB.Connection
Private recRecords As ADODB.Recordset
'连接数据库,传入数据库的存放路径
·Public Sub Connect(ByVal strDataSource As String)
cnnHeatTracer.ConnectionString = "Provider=MSDataShape;Data Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & strDataSource
cnnHeatTracer.Open , "Admin"
·End Sub
'类初始化
·Private Sub Class_Initialize()
Set cnnHeatTracer = New ADODB.Connection
Set recRecords = New ADODB.Recordset
·End Sub
'类终止化
·Private Sub Class_Terminate()
Set cnnHeatTracer = Nothing
Set recRecords = Nothing
·End Sub
模块
Public data As New Class1
Public Sub Main()
Dim dataSource As String
dataSource = "E:\sourcecode\heattracer\database\heattracer.mdb"
Dim data As New Class1
data.Connect (dataSource)
Form1.Show
End Sub
以上是我的代码,datasource字串可以替换成现有的access数据库路径,大家可以做个实验,在标有·的地方设置断点,再对cnnHeatTracer.state和cnnHeatTracer.connectionstring添加监视,看看是否在form1显示出来之前Initialize(),Connect(),Terminate()是否都执行过,以及cnnHeatTracer.state和cnnHeatTracer.connectionstring这两个值的变化。注意要添加ado库。Top
5 楼whoke(hy)回复于 2002-04-23 22:07:10 得分 15
没问题
你是需要在Form1执行前cnnheattracer不关闭吗?,把form1.show 改为form1.show vbModal即可Top
6 楼kevindude(kevin)回复于 2002-04-23 22:08:44 得分 0
什么意思啊,请说明一下好吗?Top
7 楼wzy_123()回复于 2002-04-23 22:10:27 得分 0
类的使用和C++中基本相同的。Top
8 楼kevindude(kevin)回复于 2002-04-23 22:17:14 得分 0
vbModal是什么意思啊?Top
9 楼water_j(随心所欲)回复于 2002-04-23 22:20:57 得分 10
UserDocument 对象的存活期
普通的 Visual Basic 窗体的存活期中有一些明显的关键事件,例如 Initialize、Load、QueryUnload 及 Unload。为了创建一个优良的应用程序,必须知道在窗体的生命周期中何时发生这些事件。
尽管 ActiveX 文档看起来与窗体十分类似,但它们有着不同的行为方式,这主要是因为 ActiveX 文档必须被其它的应用程序所包容。在编制 ActiveX 文档时,必须清醒地认识到 ActiveX 文档是“短命的”。当容器程序为 Web 浏览器(例如 Internet Explorer)时尤其如此。
UserDocument 对象生命周期中的关键事件包括:Initialize、InitProperties、Show、Hide 和 Terminate。下面将展示这些事件。
注意 本主题是创建示例 ActiveX 文档的步骤之一。如果要从头开始学习有关的内容,选择“创建 ActiveX 文档”主题。
要查看 FirstDoc UserDocument 对象的关键事件
在“工程资源管理器”窗口中双击“FirstDoc”,使它的设计器显示在桌面的最前面。
双击设计器,为 UserDocument 对象打开代码窗口。并在下列事件过程中输入代码:
Private Sub UserDocument_Initialize()
Debug.Print "Initialize"
End Sub
Private Sub UserDocument_InitProperties()
Debug.Print "InitProperties"
End Sub
Private Sub UserDocument_Show()
Static intCount As Integer
intCount = intCount + 1
Debug.Print "Show " & intCount
End Sub
Private Sub UserDocument_Hide()
Static intCount As Integer
intCount = intCount + 1
Debug.Print "Hide " & intCount
End Sub
Private Sub UserDocument_Terminate()
Debug.Print "Terminate"
End Sub
按 F5 键运行工程。
在 Internet Explorer 中,直接键入文件 FirstDoc.vbd 作为 URL,或单击“地址”文本框旁边的箭头,从下拉列表中选择 FirstDoc.vbd,然后浏览该 ActiveX 文档。
按 ALT+Tab 键使 Visual Basic 回到桌面的最前面。注意,这时在“立即”窗口中将有三个事件:Initialize、InitProperties 和 Show,它们被显示在窗口中。象 UserControl 对象一样,Intialize 事件先于 InitProperties 事件发生。
注意 可以看到在 Show 的后面紧跟了一个 1,这表示 ActiveX 文档被 Internet Explorer 显示了一次。只要对该 ActiveX 文档的引用保留在 Internet Explorer 的高速缓存中,那么每当从另外的 URL 中定位至该文档,数字将加一。
按 ALT+Tab 键切换回 Internet Explorer。下面漫游到另一个 URL,这可以在“地址”文本框中输入合法的 URL 值,也可以使用下拉列表。不必考虑具体到达哪个 HTML 页。
在定位到新的 URL 之后,按 ALT+Tab 键切换回 Visual Basic。观察“立即”窗口,可以看到发生了 Hide 和 Terminate 事件。
按 ALT+Tab 键返回 Internet Explorer。单击“后退”,直至再一次看到 FirstDoc ActiveX 文档。
按 ALT+Tab 键切换回 Visual Basic。查看“立即”窗口,可以看到 Initialize、InitProperties 以及 Show 事件被触发。
Initialize 与 InitProperties 事件
Initialize 与 InitProperties 事件有一些相似的地方,但必须注意到它们之间存在的区别。简单地说,当 ActiveX 文档被加载时,总会触发 Initialize 事件,但是 InitProperties 事件仅在每次保存文档时被触发一次。在 Initialize 事件发生时,将触发 ReadProperties 和 WriteProperties 事件。请看下面的例子:
如果 Internet Explorer 仍在运行,则关闭它。
如果 ActXDoc 工程仍在运行,则停止它。为了触发 InitProperties 事件,这一步是必需的。
重新启动 ActXDoc 工程。
在 Internet Explorer 中,在“地址”文本框中输入 FirstDoc.vbd 文件的路径,或从 URL 的下拉列表中选择曾经用过的值。
在 TextBox (txtFirstDoc) 控件中输入一些文字。
关闭 Internet Explorer。应用程序将提示保存所作的修改。单击“是”。
重新启动 Internet Explorer。(但是不要中止 ActXDoc 工程的运行)。
按 ALT+Tab 键切换回 Visual Basic。
注意在“立即”窗口中,可以看到 InitProperties 仅仅触发了一次:第一次在 Internet Explorer 中浏览 FirstDoc 文档的时候。在第二次浏览 FirstDoc 文档时仅仅触发了 Initialize 事件,而没有触发 InitProperties 事件;取而代之的是触发了 ReadProperties 事件。
必须注意上述的区别,这关系到应该把代码放到什么地方。毫无疑问,如果希望在启动文档时总是执行某个过程,那么把它放到 Initialize 事件中。如果希望仅在第一次浏览 ActiveX 文档时才执行某一段程序,那么把它放到 InitProperties 事件中。
但是,必须注意到在使用 Initialize 事件时的限制条件。简单地说,在 Initialize 事件中不能获得有关容器的信息(例如 Parent 属性)的过程。解决的办法是使用 Show 事件,该事件发生在 ActiveX 文档在容器中定位之后。
Top
10 楼water_j(随心所欲)回复于 2002-04-23 22:22:21 得分 10
窗体常数
显示参数
常数 值 描述
vbModal 1 模式窗体
vbModeless 0 无模式窗体
Show 方法
用以显示 MDIForm 或 Form 对象。不支持命名参数。
语法
object.Show style, ownerform
Show 方法的语法包含下列部分:
部分 描述
object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,则与活动窗体模块关联的窗体缺省为 object。
Style 可选的。一个整数,它用以决定窗体是模式还是无模式 。如果 style 为 0,则窗体是无模式的;如果 style 为 1,则窗体是模式的。
ownerform 可选的。字符串表达式,指出部件所属的窗体被显示。对于标准的Visual Basic 窗体,使用关键字 Me。
说明
如果调用 Show 方法时指定的窗体没有装载,Visual Basic 将自动装载该窗体。
当 Show 在显示无模式窗体时,随后遇到的代码则要执行。当 Show 在显示模式窗体 (modal form) 时,则随后的代码直到该窗体被隐藏或卸载时才能执行。
当 Show 在显示模式窗体时,除了模式窗体中的对象之外不能进行输入(键盘或鼠标单击)。对其它窗体进行输入前程序必须隐藏或卸载模式窗体(通常是处于响应用户某些操作状态)。MDIForm 不能是形式的。
在模式窗体显示时,虽然应用程序中的其它窗体失效,但其它应用程序不会失效。
应用程序的启动窗体在其 Load 事件调用后会自动出现。
下面的例子说明如何使用ownerform 参数:
Private Sub cmdShowResults_Click()
' 显示模式窗体 frmResults.
frmResults.Show vbModal, Me
End Sub
Top
11 楼Mike_sun(漠风)回复于 2002-04-23 22:23:27 得分 10
vbModal = Modal formTop
12 楼kevindude(kevin)回复于 2002-04-23 22:46:16 得分 0
to water_j(jxp):那关于类是怎么样的呢?Top
13 楼luckyen(新月)回复于 2002-04-23 23:04:29 得分 0
UpTop
14 楼ltpao(啊炮)回复于 2002-04-24 10:56:46 得分 35
你的程序不对,把Main函数中的Dim data As New Class1去掉即可
Top
15 楼whoke(hy)回复于 2002-04-24 13:17:33 得分 20
对,你同时定义了两个data,一个全局,一个局部.Top




