VB考试教程:VB应用程序结构的模块

VB考试教程:VB应用程序结构的模块,第1张

一个应用程序实际上是使计算机完成特定任务的指令集。应用程序的结构就是指组织指令的方法,也就是指令存放的位置以及它们的执行顺序。应用程序越复杂,对结构的要求也就越明显。而且如何在一个大的应用程序中快速查找特定指令,程序的指令也起着重要的作用。

一、模块

VB的代码存储在模块中。在VB中提供了三种类型的模块:窗体模块、标准模块和类模块。

简单的应用程序可以只有一个窗体,所用的程序都驻留在窗体模块中,而当应用程序庞大复杂时,就要另外附加窗体。最终可能有几个窗体中有一些共同都要执行的代码,为了在两个窗体中不产生重复代码,可创建一个独立的模块,用它实现代码公用。该独立模块即是标准模块。此外还可以建立包含共享代码与数据的类模块。

每个标准模块、类模块和窗体模块可包含:

声明。 可将常数、类型、变量和动态链接库(DLL)过程的声明放在窗体、类或标准模块的声明部分。每个模块只有一个声明部分。

过程。每个模块可有多个过程,过程是划分VB代码的最小单元,每个过程是一个可执行的代码片段。VB中主要有事件过程、子过程、函数过程或者属性过程等。

1、各种模块类型

(1)窗体模块

由于VB是面向对象的应用程序开发工具,所以应用程序的代码结构就是该程序在屏幕上表示的对应模型。根据定义,对象包含数据和代码。应用程序中的每个窗体都有一个相对应的窗体模块(文件扩展名为.frm)

窗体模块是VB应用程序的基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、自定义类型和外部过程的窗体级声明。写入窗体模块的代码是该窗体所属的具体应用程序专用的;也可以引用该程序内的其它窗体和对象

每个窗体模块都包含事件过程,在事件过程中有为响应该事件而执行的程序段。窗体可包含控件。在窗体模块中,对窗体上的每个控件都有一个对应的事件过程集。除了事件过程,窗体模块还可包含通用过程,它对来自该窗体中任何事件过程的调用都作出响应。

(2)标准模块

可将那些与特定窗体或控件无关的代码放入标准模块中。标准模块中包含应用程序内的允许其它模块访问的过程和声明。它们可以包含变量、常数、类型、外部过程和全局声明或模块级声明。写入标准模块的代码不必固定在特定的应用程序上。

使用标准模块

标准模块或代码模块是具有文件扩展名.bas,并包含能够在程序任何地方使用的变量和过程的特殊文件。

在编写程序时,很可能会遇到一些使用相同变量和例程的窗体和事件过程。在缺省状态下,变量对于事件过程来说是局部的,就是说仅能在创建这些变量的事件过程中读取或者修改变量。与之相似,事件过程对于创建它们的窗体来说也是局部。为了在工程中的所有窗体和事件中共享变量和过程,需要在该工程的一个或多个标准模块中对它们进行声明和定义。

标准模块让你能够在整个程序中共享变量和过程。

正如窗体一样,标准模块被单独列在Project(工程)窗口内,并可通过使用File(文件)菜单中的Save Modulel As菜单项存盘。但是,与窗体不同,标准模块不包含对象或属性设置而只包含可在代码窗口中显示和我的代码。

创建并保存标准模块

创建标准模块:

如要在程序中创建新的标准模块,那么单击工具条“Add Form(添加窗体)”按钮上的下箭头并单击“Mode(添加模块)”,或者单击“Project(工程)”菜单中的“Add Module(添加模块)”菜单项,可以在工程中创建一个空的标准模块。

VB在工程中增加一个名为“Module1”的标准模块。该模块对应的代码窗口被打开,在这个代码窗口中的“对象”和“过程”列表框的内容表明该标准模块的通用声明已被打开。在此所声明的变量与过程在整个程序都可以使用。

这时打开“工程资源管理器”窗口,便能看到整个工程资源管理器窗口的一个新文件夹中列出了你添加到程序中的标准模块。括弧中的文件名Module1是该模块的缺省文件名。该模块的对象名(该模块在程序中的名称)显示在括弧的左侧。

从“属性窗口”可见,由于该模块不包含对象,因此它惟一的属性就是Name属性。可以修改Name属性,如改为modVariables,然后按ENTER键。

你也可以通过使用“Project(工程)”菜单中的“Add File(添加文件)”菜单项将此文件通过其文件名加载到另一个工程中。

保存标准模块:

在“File(文件)”菜单中,单击“Save Module1 As(Module1另存为)”菜单项将这个空的标准模块存盘。该标准模块作为.bas文件保存到磁盘,并且“工程资源管理器”窗口中该模块的文件名也同时更新。

删除标准模块

如果要从工程中删除标准模块,那么在“工程资源管理器”窗口单击选中该模块,然后单击“Project(工程)”菜单中的“Remove(删除)”菜单项(或右击选择)。Remove(删除) *** 作并未将该模块从你的硬盘中删除,但它删除了该模块与当前工程之间的链接。

凡需要在整个工程范围内使用的变量、过程、类型和API函数声明都可放在标准模块中使用。

1.标准模块,只包含过程、类型以及数据的声明和定义的模块。在标准模块中,模块级别声明和定义都被默认为 Public。在 Visual Basic 的早期版本中将标准模块看作代码模块。是将那些与特定窗体或控件无关的代码(文件扩展名为 .BAS )中。

标准模块中可以包含变量、常数、类型、外部过程和全局过程的全局(在整个应用程序范围内有效的)声明或模块级声明。

2.一个过程可能用来响应几个不同对象中的事件,应该将这个过程放在标准模块中,而不应在每一个对象的事件过程中重复相同的代码。

3.在数据存储方式上,标准模块的数据不可能多于一份。这意味着若程序中某个部分改动了标准模块的公共变量,随后程序的其它部分读取该变量会得到该值。

4.标准模块中的数据在程序作用域内存在,也就是说,它存在于程序的存活期中。

5.当变量在标准模块中声明为 Public 时,则它在工程中任何地方都是可见的。

标准模块代码实例,其中声明了API函数和对象类型及将位图转换为JPG格式的过程,供整个应用程序的存活期中使用图形格式转换用。

Option Explicit

    Public Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long

    Public Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long

    Public Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hpal As Long, Bitmap As Long) As Long

    Public Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long

    Public Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal fileName As Long, clsidEncoder As GUID, encoderParams As Any) As Long

    Public Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long

    Public Declare Function GdipCreateBitmapFromFile Lib "GDIPlus" (ByVal fileName As Long, Bitmap As Long) As Long

    Public Type GUID

        Data1 As Long

        Data2 As Integer

        Data3 As Integer

        Data4(0 To 7) As Byte

    End Type

    Public Type GdiplusStartupInput

        GdiplusVersion As Long

        DebugEventCallback As Long

        SuppressBackgroundThread As Long

        SuppressExternalCodecs As Long

    End Type

    Public Type EncoderParameter

        GUID As GUID

        NumberOfValues As Long

        type As Long

        Value As Long

    End Type

    Public Type EncoderParameters

        Count As Long

        Parameter As EncoderParameter

    End Type

Public Function PictureBoxSaveJPG(ByVal pict As StdPicture, ByVal fileName As String, Optional ByVal quality As Byte = 80) As Boolean

    Dim tSI As GdiplusStartupInput

    Dim lRes As Long

    Dim lGDIP As Long

    Dim lBitmap As Long

    '初始化 GDI+

    tSI.GdiplusVersion = 1

    lRes = GdiplusStartup(lGDIP, tSI, 0)

    If lRes = 0 Then

        '从句柄创建 GDI+ 图像

        lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap)

        

        If lRes = 0 Then

            Dim tJpgEncoder As GUID

            Dim tParams As EncoderParameters

            

            '初始化解码器的GUID标识

            CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder

            

            '设置解码器参数

            tParams.Count = 1

            With tParams.Parameter ' Quality

                '得到Quality参数的GUID标识

                CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID

                .NumberOfValues = 1

                .type = 4

                .Value = VarPtr(quality)

            End With

            

            '保存图像

            lRes = GdipSaveImageToFile(lBitmap, StrPtr(fileName), tJpgEncoder, tParams)

            

            '销毁GDI+图像

            GdipDisposeImage lBitmap

        End If

        

        '销毁 GDI+

        GdiplusShutdown lGDIP

    End If

    

    If lRes Then

        PictureBoxSaveJPG = False

    Else

        PictureBoxSaveJPG = True

    End If

End Function

调用标准模块中转换图片格式PictureBoxSaveJPG过程的某窗体按钮事件代码实例代码:

Private Sub Command3_Click()

    ' 设置“CancelError”为 True

    CommonDialog1.CancelError = True

    On Error GoTo ErrHandler

    ' 设置标志

    CommonDialog1.Flags = cdlOFNHideReadOnly

    ' 设置过滤器

    CommonDialog1.Filter = "JPEG Files" & "(*.jpg)|*.jpg"

    ' 指定缺省的过滤器

    CommonDialog1.FilterIndex = 2

    ' 显示“打开”对话框

    CommonDialog1.ShowSave

    ' 显示选定文件的名字

    'MsgBox CommonDialog1.fileName

    Set Picture2.Picture = Picture1.Image '转移Picture1所绘图为Picture2.Picture赋值

    Dim ret As Boolean

    ret = PictureBoxSaveJPG(Picture2, CommonDialog1.fileName) '保存压缩后的图片

    If ret = False Then

        MsgBox "保存失败"

    End If

    Exit Sub

    

ErrHandler:

    ' 用户按了“取消”按钮

    Exit Sub

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11729272.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存