精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 编程世界>>对象变量及其在VB编程中的妙用

主题:对象变量及其在VB编程中的妙用
发信人: jhchen()
整理人: jchao(2000-03-22 12:16:53), 站内信件
 
     
                                                                      
                             
 
                          对象变量及其在VB编程中的妙用

                                         焦纯 杨国胜 王健琪


    一、对象变量的声明及其类型

      对象变量是这样一类变量:它指向某一类对象,并具有此类对象的所有
性质和属性,对象
    变量可看作是一个指针,指向项目中某一特定类型的对象,对此类变量进行
控制和操作,就是
    对项目中所有属于这一类的对象进行相同的控制和操作。它是一种具有对象
性质的特殊变量。

      这些被对象变量指向的对象可以是窗体、控制(包括自定义控制)、屏
幕以及数据库的
    表、记录、字段等对象。

      对象变量也是有类型的,而且针对具体的对象有不同的定义方式。所以
对象变量在使用前
    也必须先声明后使用。仍然可以用Dim、Static、Global等关键字来声明对象
变量。

    例如:Dim Acontrol As Control
    Dim Bcontrol As New Form1
    Dim Ccontrol As CommandButton
    Dim Dcontrol As Command1

    可见,对象类型包括控制和具体对象的名称(如Command1和Form1)、控制集
合(如Control、
    CommandButton等)、窗体集合(Form)以及屏幕对象(Screen)等。这些对
象类型的集合有
    大有小。一旦声明之后,VB将为对象变量分配内存空间(大小与具体类型有
关),在内存中建
    立一个其指向的对象或对象集合的拷贝。

    并且CommandButton、Label、TextBox等控制对象又可分别看作是同一类控制
的集合或总称,
    是CommandButton1、Label1、TextBox1等具体子对象的父对象。

    可见,对象变量在VB中应用极为广泛,VB中的绝大多数对象都可以有自己的
对象变量。

    二、对象变量的集合和指针特性

    对象变量还可以理解为一个项目(Project)中属于某种类型对象的集合,这
个集合可以有很
    多个对象,也可以只有一个,甚至可以是空集(即该种类型的对象在项目或
窗体内不存在)。

    对应于对象变量的集合特性,其Count属性是一个非常重要的属性。所有对象
变量都具有Count
    属性。一旦在程序中声明了对象变量后,该对象变量的Count属性自动记录该
类对象的个数,
    因而通过读取Count属性值,便可了解到该类对象的个数。利用它,对同一类
对象的某一共同
    属性进行访问或操作(如同一窗体上的所有控制的字体大小)是对象变量应
用的典范之一,能
    极大地节省程序代码。另一方面,对一类对象进行搜寻,即可选出符合一定
条件的子对象,从
    而达到程序智能化的目的。

    在对象变量声明之后,再用Set语句使一个对象变量指向一个具体的控制,这
样所有与对象变
    量所指向的对象相关联的属性(如位置、大小、状态、内容等)均可通过对
象变量来传递。这
    样对象变量就具有了对象的特点,可以像对象一样在程序中赋予其属性。当
需要对一个指定的
    窗体或控件的属性进行操作时,可用过程、函数及方法对其进行访问。当用
户改变一个对象变
    量的性质时,与之相关联的原始数据也随之而改变,因此具有了类似与过程
中的通过指针传送
    参数的效果。这即是对象变量的指针特性。

    另外,Set语句还可用来简化很长的控件指针。值得注意的是,Set语句并不
是单纯的变量赋值
    语句,它不像赋值语句一样产生对象的一个拷贝,而是把一个对象变量设定
为对象指针,指向
    不同对象变量。

    下面是一个程序实例,主要完成对一个项目内所有控制的字体、字号进行统
一的操作。

    (1)在一个全局模块文件中定义两个全局变量。
    Global Font As Control,Aform As Form
    (2)在此全局模块文件中定义一个子过程FontAllSame。具体如下:
    Sub FontAllSame( )
    For I% = 0 To Forms.Count - 1 ’Count属性值是从0开始的整数
    Set Aform = Forms(I%)
    For J% = 0 To Aform.Controls.Count - 1
    Set Font = Aform.Controls(J%)
    Font.FontName = “宋体”
    Font.FontSize = 13.5
    Next J%
    Next I%
    End Sub
    (3)在项目中的所有窗体的Activate事件中加入以下语句:
    FontAllSame

    通过以上程序代码,此项目中的任一窗体一经载入,其上所有控件的字体就
都被指定为宋体,
    字号为13.5。

    由以上可见,如果对象变量可以指向项目中所有满足一定条件的对象,那么
对对象变量进行定
    向操作,被指向的所有对象的属性即可按用户的意图变化,从而达到控制程
序流程的目的。

    下面是一段可以在一个项目中搜寻到非使能控制的程序实例。
    Dim Acontrol As Control ,I as Integer
    For I = 0 To Controls.Count - 1
    If Not( Control(I).Enabled ) Then
    Set Acontrol = Control( I )
    Acontrol.Enabled = True ’非使能控制改为使能状态
    Msg1$=Acontrol.Caption + "控制已改为使能状态!"
    Msgbox Msg1$ 
    End If
    Next I
    可见,灵活应用对象变量还可以帮助程序判断控制的状态,这种技巧在程序
调试中可以节省很
    多时间和力气。

    当对象变量使用完后,可用以下语句释放对象变量所占的内存空间。

    Set 对象变量 = Nothing
      在对象变量的声明中还可以使用New关键字,通过它可以在内存中产生一
个与原始窗体或
    控制完全相同的拷贝,这种特性在对窗体或控制的大规模内存调度时极为有
意义(前提是内存
    足够)。这种相同的拷贝还足以完成数据的缓冲以及一些特技效果的实现。
如在窗口对象变量
    的拷贝中预先改变窗口的界面设计,再用一个简单的赋值语句,再加上一个
清屏命令即可实现
    窗口的突变。使用得当还可以实现一定的动画效果。由此可见,对象变量在
大内存调度中也是
    很有意义的,它能节省一大批变量的声明和定义。

      对于同一对象的多个拷贝,可以用Is操作符组成的比较表达式来进行判
断。这种方式尤其
    适用于对同一对象进行调用和操作又要防止冲突的情况,在程序中可以防止
改变其中一个变量
    的属性会导致另一个变量的属性发生变化。
    例如
    Dim Aform As New Form1
    Dim Bform As Form
    Sub Compare( )
    If Aform Is Bform Then
    Msg1$ = “两者属于同一窗体!”
    Else
    Msg1$ = “两者不属于同一窗体!”
    End If
    MsgBox Msg1$
    End Sub

    三、对象变量在数据库编程中的应用
      运用数据存取对象变量(Data Access Object Variable)的方法是VB专
业版数据库编程
    中最重要的三种方法之一。相比使用数据控制项和绑定控制项和直接调用OD
BC 2.0 API接口函
    数两种方法而言,它可以极大地提高数据库应用程序的灵活性和精巧性。除
了一些需求有限的
    数据库应用可以用基本的数据控件和绑定控制项法解决以外,其它的VB数据
库应用程序大都能
    用数据存取对象法来完成。

      利用它可以在程序中存取ODBC 2.0的管理函数;可以在执行期间动态地
建立表、字段、及
    索引;同步更新几张表;在执行期间“显示”数据库的基本结构;可以控制
多种记录类型:
    Dynaset、Snapshot及Table记录集合对象;可以存取存储过程和查询动作;
可以存取数据库集
    合对象,如TableDefs、Fields、Indexes以及QueryDefs;具有真正的事物处
理能力。

      首先,只有VB的专业版才支持使用数据存取对象变量的编程方法。即只
有使用专业版才能
    获得数据存取对象变量。

      数据存取对象最大的扩展是它提供了一个一致的数据库编程接口。即以
抽象方式表示的数
    据库的内部结构和操作,这种抽象可以将许多复杂问题(包括静态操作和动
态操作)封装起
    来。显然,VB的数据存取对象在ODBC 2.0数据库接口之上又提供了一个简明
一致的附加层次。

      在VB的数据存取对象里,所有的数据库均可以看作是一个由结构良好、
一致的对象所组成
    的大包。程序员可以使用对象的属性及方法对这些对象进行检验、操作、创
建及删除。

    VB专业版中的数据存取对象可以分为两类,一类用于数据库结构的维护和管
理,其中表示数据
    库结构时可以使用下面的对象:DataBase、TableDef、Field、Index,以及
三个集合
    (Collection):TableDefs、Fields和Indexes。另一类数据存取对象则用
于数据的存取。

    每一个对象集合都是由若干个对象组成的,这些数据对象的集合可以完全看
作是一个数组,并
    按数组的方法来调用。

    一旦数据库对象建立后,就可以用它对数据库的结构进行修改和数据处理。


    数据库对象变量之间的关系具体如图1所示。其中可见DataBase是最基本也是
最重要的变量。

    以下是打开一个数据库后,并取得其内各个表单(Table)的具体信息的程序
实例。
    Sub PrintTableInfo ( )
    Dim I,J As Integer,Fname As String
    Dim Db1 As DataBase,Td1 As TableDefs
    Dim Fld1 As Fields
    Dim FieldNum As Integer
    ’CMD1是一个打开文件对话框的控制名
    CMD1.Filter = “ 数据库文件(*.MDB)|*.MDB|所有文件|*.* ” 
    CMD1.DialogTitle = “ 调入数据库文件 ”
    CMD1.FilterIndex = 1
    CMD1.Action = 1
    Fname$ = CMD1.Filename
    Set Db1 = OpenDataBase( Fname$ ) ’打开一个数据库文件
    Set Td1 = Db1.TableDefs
    ’读取并在窗体内打印所有表单的名字,每个表单内的字段数以及字段名和
类型
    For I = 0 To Db1.TableDefs.Count - 1
    Print Td1(I).Name
    Set Fld1 = Td1( I ).Fields
    FieldNum% = Fld1.Count
    Print “当前表单共有”;Str$( FieldNum );“个字段”
    For J=0 To Fld1.Count - 1
    Print “字段名:”,Fld1( J ).Name
    Print “类型:”,Fld1( J ).Type
    Next J
    Next I
    End Sub

      从以上可以清晰地看到各数据库对象变量的层次关系。可见对较复杂和
有更多要求的数据
    库应用程序来说,使用数据存取对象变量是最好的一种方法。

    以上程序均在486 DX4/100机上调试通过。

    四、结束语

      对象变量是VB提供的一类很特殊但极有用的变量,利用它可极大地提高
编程的效率和灵活
    性。特别是数据存取对象变量在VB的数据库编程中具有不可替代的作用。因
而熟悉对象变量的
    应用技巧对挖掘VB的编程潜力和提升VB的编程功力是绝对有帮助的。 
                                                                      
                             
 
     
                                                                      
                             


                                                       


--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.12.114]

[关闭][返回]