第一次机房收费系统--模块(三)

  最近对于模块有了新的认识,其实模块就是将每个窗体中重复的部分拿出来放到模块中,公共定义,可以让每个有需要的窗体调用,这样可以少些很多代码,节省时间,提高效率。
  
 下面就是对于模块的详细了解,其实很简单!

代码:

Public Function Connectstring() As String
  '返回一个数据库连接
  Connectstring = "FileDSN=charge.dsn;UID=sa;PWD=123456"
End Function

Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
  '传递参数SQL传递查询语句,MsgString传递查询信息

  '自身以一个数据集对象的形式返回
  Dim Cnn As ADODB.Connection
  '定义连接
  Dim Rst As ADODB.Recordset
  '定义字符串
  Dim sTokens() As String

  '异常处理
  On Error GoTo ExecuteSQL_Error
  '用Split函数产生一个包含各个子串的数组
  sTokens = Split(SQL)

  '创建连接
  Set Cnn = New ADODB.Connection
  '打开连接
  Cnn.Open Connectstring

    '判断字符串中时候含有指定内容
    If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then    '判断字符串中是否含有指定内容?
                                                                 '非SELECT语句
      '执行查询语句
      Cnn.Execute SQL
      '返回查询信息
      MsgString = sTokens(0) & "query successful"    '查询成功
    Else                                                         'SELECT语句
      '创建数据集对象
      Set Rst = New ADODB.Recordset
      '返回查询结果
      Rst.Open Trim$(SQL), Cnn, adOpenKeyset, adLockOptimistic   '得到临时表,游标指向第一条记录
      'Trim$(SQL)为所执行的sql命令字符串。Cnn为Recordset对象的ActiveConnection属性值,即数据源的活动链接,即设定连接的是哪个数据库。后面两个参数为“键集游标”和“乐观锁”。
      '返回记录集对象
      Set ExecuteSQL = Rst    '返回记录集对象
      MsgString = "查询到" & Rst.RecordCount & "条记录"
      End If

ExecuteSQL_Exit:   '如果执行结束后,让CNN和RST都变成Nothing
  '清空数据集对象
  Set Rst = Nothing
  '中断连接
  Set Cnn = Nothing
Exit Function

  '错误类型判断
ExecuteSQL_Error:
  MsgString = "查询错误:" & Err.Description
  Resume ExecuteSQL_Exit
End Function

Sub Main()
  Dim fLogin As New FrmLogin

  '显示登陆窗体
  fLogin.Show vbModal
  '判断是否为授权用户,OK为frmMainFrom类的成员
  If Not fLogin.OK Then
    End
  End If

  Unload FrmLogin
  '判断是否将进入系统
  Set fMainForm = New frmMain
  fMainForm.Show
End Sub

部分详解:

SET…=NEW…

 NEW:
  1、在Dim语句中是可选的。可隐式地创建对象的关键字。如果使用 New 来声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用 Set 语句来给该对象引用赋值。New 关键字不能声明任何内部数据类型的变量,以及从属对象的实例,也不能与 WithEvents 一起使用。

  2、在Set语句中是可选的。通常在声明时使用 New,以便可以隐式创建对象。如果 New 与 Set 一起使用,则将创建该类的一个新实例。如果 objectvar 包含了一个对象引用,则在赋新值时释放该引用。不能使用 New 关键字来创建任何内部数据类型的新实例,也不能创建从属对象。

 SET…=NEW…:
对象分为值类型引用类型

所有的结构体都是值类型,所有的类对象都是引用类型

1、值类型在创建时不需要使用new来实例化,但引用类型需要使用new实例化
值类型包括大部分的数值对象,比如byte\int\long\datetime等这些类型,这些是不需要用new来声明的。

2、引用类型包括其他大部分的类型对象,比如数组、窗体对象、各种类型库对象都是。如果不用new声明,就会发生对象为空的错误 。

3、一个特例:string是引用类型,但它不需要使用new来声明
dim s as string = “…”

SPLIT函数

  定义:SPLIT是一个命令读取指定文件,以 1000 行大小写在一组输出文件上。功能是返回一个下标从零开始的一维数组,默认返回一维数组,以指定字符分割。
  功能:split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
函数:Split(expression[, delimiter[,count[, compare]]])

  1. expression:必需的。包含子字符串和分隔符的字符串表达式 。
    注:如果expression是一个长度为零的字符串(“”),Split则返回一个空数组,即没有元素和数据的数组。
  2. delimiter:用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(” “)作为分隔符。
  3. count:要返回的子字符串数,-1表示返回所有的子字符串。
  4. compare:数字值,表示判别子字符串时使用的比较方式。

 INSTR:返回子串在整个字符串中第一次出现的位置
  InStr(4, “abcabca”, “c”)返回6,可以这样理解,从第4个字符开始查找”c”,找到之后返回它的位置,对于整个 “abcabca”来说,第一个”c”被忽略,因为是从第四个字符开始,找到”c”后发现它在整个字符串的第六位,所以返回6。

如果省略InStr ()的第一个参数,则默认从整个字符串的第一个字符开始查找,找不到会返回0。

Sub Main启动与窗体启动(三种)

(1) 设置工程中的窗体为启动项
  缺省情况下,工程设置的是我们建立的第一个窗体为启动项的,因此,当程序运行时最先执行的便是第一个窗体中的代码。但我们可能第一个需要执行其他的窗体于是就需要修改工程的启动项。
  设置的步骤如下:点击工程资源管理器的 工程-属性-启动对象-选择需要作为新的启动项窗体

(2)不设置窗体为启动项
  还有就是当我们需要运行程序而不加载任何窗体时。比如说我们希望在运行窗体之前先执行一些其他的操作,就可以将这些操作写到模块中的 main子过程中。

下面是学生系统中sub main过程,系统启动后不启动窗体,而是先登录判断登录信息是否满足数据库中数据的登录条件。(即用户名和密码是否正确或存在)

‘系统启动后,需要对用户进行判断,如果登陆者是授权用户,将进入系统,否则程序停止执行。

Sub main()  
    Dim fLogin As New frmlogin               '调用登录界面来检验用户登录条件  
    fLogin.Show vbModal                      '根据调用来显示登录窗体  

    If Not fLogin.OK Then                    '判断是否为授权用户  
        'Login Failed so exit app  
        End  
    End If  
    Unload fLogin  

    Set fMainForm = New frmMain      '判断是将进入系统    
    fMainForm.Show                   '显示主窗体实例  
End Sub  

  Sub Main是在模块中定义的,如果一个程序中包含有多个模块,但是只能允许有一个Sub Main过程。
  Sub Main过程中可以包含若干语句,但它与其他语言中的主程序不同,程序启动时不会自动执行。人们可以指定程序从哪一个窗体或是Sub Main开始执行。如果选择了Sub Main,则程序运行时从模块的Sub Main过程开始。
  常常用Sub Main来完成一些初始处理,比如登录操作。

(3)显示启动时的快速显示
  如果程序的数据文件比较多,启动时执行文件需要用户等待的时间较长,这时候可能希望在启动时给出一个快速显示。
  快速显示也是一种窗体,它通常是显示程序的名称,比如我们进入VB界面时候不是直接进入程序而是出来一个VB程序的界面,其实这个时候就是后台在执行大量的数据文件,为防止用户以为系统太过卡 慢而给用户一种程序装载很快的错觉,当所有数据文件加载完成时,显示主窗体同时卸载快速显示窗体。
  这时也需要用sub main过程作为启动对象,并在sub main过程中用Show方法显示该窗体。

Private Sub Main ()  
  frmSplash.show           '显示快速启动窗体  

  ……                               ’其他过程  

  frmMain.show              '显示主窗体并卸载快速显示窗体  
  Unload frmSplash  
End Sub   
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值