CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

请教关于对象的生命周期的问题

楼主kevindude(kevin)2002-04-23 20:36:05 在 VB / 基础类 提问

当我在一个过程中调用一个对象的某一方法时,首先被调用的是其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

相关问题

  • 对象的生命周期和集合的使用
  • 方法里面定义的对象的生命周期是多长?
  • 请教:1、怎样改变application对象的生命周期?2、*.asa文件是干什么的?谢谢!
  • SOCKET的生命周期的问题.
  • 临时变量生命周期问题
  • session的生命周期是多少
  • Stateful Session Bean的生命周期问题
  • static 的生命周期问题?
  • 请问一下session的生命周期
  • Session Bean的生命周期问题?

关键词

  • 文档
  • activex
  • 应用程序
  • 模式
  • 代码
  • 窗体
  • initproperties
  • userdocument
  • cnnheattracer
  • firstdoc

得分解答快速导航

  • 帖主:kevindude
  • whoke
  • water_j
  • water_j
  • Mike_sun
  • ltpao
  • whoke

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo