怎么把多个VB模块放到一起
答案:3 悬赏:80 手机版
解决时间 2021-04-05 14:41
- 提问者网友:泪痣哥哥
- 2021-04-04 14:34
怎么把多个VB模块放到一起
最佳答案
- 五星知识达人网友:荒野風
- 2021-04-04 14:48
本示例演示了如何用类模块定义类(然后可以用它创建对象)。还将展示如何为新的类创建属性和方法并演示对象是如何创建和撤消的。
打开一个新的“标准 EXE”工程,在“工程”菜单中选中“添加类模块”插入一个类模块。在窗体上画四个按钮。下表列出了本示例中要设置的对象属性值。
对象 属性 设置值
Class 类模块 Name Thing
Command1 Caption 显示该 Thing
Command2 Caption 颠倒该 Thing 的名称
Command3 Caption 创建新的 Thing
Command4 Caption 临时的 Thing
注意 类模块保存在扩展名为 .cls 的文件中。
添加下列代码到类模块的声明段:
Option Explicit
Public Name As String
Private mdtmCreated As Date
变量 Name 将成为 Thing 对象的属性,因为它声明为 Public。
注意 不要把这个 Name 属性和上表设置的类模块的 Name 属性混淆(类模块的 Name 属性为 Thing 类提供了名称)。为什么要给 Thing 类命名呢?最好应该反过来问,为什么不?应该给 Thing 类一个名称因为事物总是有名称的!应该知道 Visual Basic 使用属性和方法的名称并没有什么特殊点。可以为自己不同的类使用相同的属性和方法名。
变量 mdtmCreated 是私有数据成员,用于存储只读的 Created 属性的值。Created 属性返回 Thing 对象产生的日期和时间。为了实现 Created 属性,将以下 Property Get 代码添加到类模块的声明部分:
Property Get Created() As Date
Created = mdtmCreated
End Property
注意 如果通过“工具”菜单下的“添加过程”对话框添加属性过程,应确认删除了 Property Let 声明,它是通过本对话框自动添加的。Property Let 只用于读写属性,参见“运用属性过程”部分。
Thing 对象有一个方法 ReverseName,用于颠倒 Name 属性的字母顺序。它不返回值,因此是一个 Sub 过程。向类模块添加以下 Sub 过程。
Public Sub ReverseName()
Dim intCt As Integer
Dim strNew As String
For intCt = 1 To Len(Name)
strNew = Mid$(Name, intCt, 1) & strNew
Next
Name = strNew
End Sub
类模块有两个事件:Initialize 和 Terminate。从类模块的“对象”下拉列表中,选择“类”。下拉出的“过程”列表将显示事件。将以下代码放到事件过程中:
Private Sub Class_Initialize()
'设置对象创建的日期/时间,
' 由只读的 Created 属性返回。
mdtmCreated = Now
'显示对象属性。
MsgBox "Name: " & Name & vbCrLf & "Created: " _
& Created, , "Thing Initialize"
End Sub
Private Sub Class_Terminate()
'显示对象属性。
MsgBox "Name: " & Name & vbCrLf & "Created: " _
& Created, , "Thing Terminate"
End Sub
一般 Initialize 事件包含了对象创建时所需的所有代码,如为 Created 属性提供时间标记。Terminate 事件包含撤消对象后进行清理的所有代码。
本示例中,两个事件主要用来提供 Thing 对象创建或撤消的可视化指示。
Thing 对象的使用
添加以下代码到窗体模块的声明段:
Option Explicit
Private mth As Thing
变量 mth 保存了对一个 Thing 对象的引用,该对象是在窗体的 Load 事件中产生的。将以下代码分别添加到 Form_Load 事件过程及四个按钮的 Click 事件过程中。
Private Sub Form_Load()
Set mth = New Thing
mth.Name = InputBox("Enter a name for the Thing")
End Sub
'按钮“显示该 Thing”
Private Sub Command1_Click()
MsgBox "Name: " & mth.Name & vbCrLf _
& "Created: " & mth.Created, , "Form Thing"
End Sub
'按钮“颠倒该 Thing 的名称”
Private Sub Command2_Click()
mth.ReverseName
'单击“显示该 Thing”
Command1.Value = True
End Sub
'按钮“创建新的 Thing”
Private Sub Command3_Click()
Set mth = New Thing
mth.Name = InputBox( _
"Enter a name for the new Thing")
End Sub
'按钮“临时的 Thing”。
Private Sub Command4_Click()
Dim thTemp As New Thing
thTemp.Name = InputBox( _
"Enter a name for the Temporary Thing")
End Sub
运行工程
按 F5 键运行该工程。观察 Form_Load 事件过程可知 New 操作符用于创建 Thing 对象。对该对象的引用赋给了变量 mth。
InputBox 函数要求输入 Thing 的名称。输入名称并按 ENTER 键后,返回值被赋予 Thing 对象的 Name 属性。
显示窗体 Thing
可以通过按下第一个按钮“显示该 Thing”来验证所赋的 Name 属性值,此时将显示一个包含了 Thing 对象所有属性的消息框。
颠倒 Thing 的名称
按第二个按钮“颠倒该 Thing 的名称”。该按钮调用 ReverseName 方法把 Thing 对象的名称倒过来,然后按第一个按钮显示更新过的属性值。
创建新的 Thing
单击“创建新的 Thing”按钮撤消已存在的 Thing 对象后再创建一个新的对象。(或,反过来进行,创建一个新的 Thing 对象然后撤消旧的。)
New 操作符创建一个新的 Thing,因此可以看见新 Thing 的 Initialize 事件显示的消息框。单击“确定”,对新 Thing 的引用被赋给了窗体级的变量 mth。
这样做清除了对旧的 Thing 的引用。由于不再有引用,所以它被撤消,因此可以看到 Terminate 事件的消息框。单击“确定”后,InputBox 语句要求输入新 Thing 的名称。
注意 如果希望在创建新的 Thing 之前撤消旧的,可以添加代码 Set mth = Nothing 到事件过程的开始部分。
临时的 Thing
第四个按钮演示了对象存活期的另一个方面。按下后,将提示输入临时 Thing 的名称。
可是等一等,这还不是一个临时的 Thing 对象。还没有见到其 Initialize 消息框,怎么赋给它名称呢?
由于变量 thTemp 已被 As New 声明过了,因此当一个属性或方法被使用时就会创建 Thing 对象。这将发生在输入框返回的值被赋给 Name 属性时。在输入框键入名称后单击“确定”。
此时可以看到 Initialize 的消息框,其中的 Name 属性还是空白。当单击“确定”关闭消息框后,InputBox 语句的值终于赋给了 Name 属性。看看这一行代码作了多少事。
当然,当完成了这一切后,Click 事件过程也结束了,变量 thTemp 也超出可见范围,对临时 Thing 的对象引用也被释放,因此可以看到 Thing 的 Terminate 消息框,注意其中包含所提供的名称。
每次单击该按钮将创建另一个临时 Thing,并进行命名,将它撤消。
关闭程序
单击窗体的“关闭”按钮可终止应用程序。不要使用工具栏上的 End 按钮。应用程序终止时,Form1 被撤消。变量 mth 也超出可见范围,Visual Basic 清除对 Thing 的引用。由于已不存在对 Thing 的引用,因此被撤消并显示 Terminate 事件的消息框。
再次运行应用程序,这次用工具栏上的 End 按钮终止程序。注意这时没有显示 Thing 对象的 Terminate 消息框。
应特别记住使用 End 按钮终止应用程序或在代码中用 End 语句立即退出应用程序,并不能运行任何对象的 Terminate 事件。最好能通过卸载所有的窗体来关闭应用程序。
通过 F8 键以每次运行一行代码的形式运行示例,是一个很有用的方法。这有利于理解创建和撤消对象的事件的顺序。
重点 在实际的应用程序中,Initialize 和 Terminate 事件不应包含消息框或其它任何使 Windows 显示消息的代码。一般来说,调试对象的存活期时最好用 Debug.Print 语句。
打开一个新的“标准 EXE”工程,在“工程”菜单中选中“添加类模块”插入一个类模块。在窗体上画四个按钮。下表列出了本示例中要设置的对象属性值。
对象 属性 设置值
Class 类模块 Name Thing
Command1 Caption 显示该 Thing
Command2 Caption 颠倒该 Thing 的名称
Command3 Caption 创建新的 Thing
Command4 Caption 临时的 Thing
注意 类模块保存在扩展名为 .cls 的文件中。
添加下列代码到类模块的声明段:
Option Explicit
Public Name As String
Private mdtmCreated As Date
变量 Name 将成为 Thing 对象的属性,因为它声明为 Public。
注意 不要把这个 Name 属性和上表设置的类模块的 Name 属性混淆(类模块的 Name 属性为 Thing 类提供了名称)。为什么要给 Thing 类命名呢?最好应该反过来问,为什么不?应该给 Thing 类一个名称因为事物总是有名称的!应该知道 Visual Basic 使用属性和方法的名称并没有什么特殊点。可以为自己不同的类使用相同的属性和方法名。
变量 mdtmCreated 是私有数据成员,用于存储只读的 Created 属性的值。Created 属性返回 Thing 对象产生的日期和时间。为了实现 Created 属性,将以下 Property Get 代码添加到类模块的声明部分:
Property Get Created() As Date
Created = mdtmCreated
End Property
注意 如果通过“工具”菜单下的“添加过程”对话框添加属性过程,应确认删除了 Property Let 声明,它是通过本对话框自动添加的。Property Let 只用于读写属性,参见“运用属性过程”部分。
Thing 对象有一个方法 ReverseName,用于颠倒 Name 属性的字母顺序。它不返回值,因此是一个 Sub 过程。向类模块添加以下 Sub 过程。
Public Sub ReverseName()
Dim intCt As Integer
Dim strNew As String
For intCt = 1 To Len(Name)
strNew = Mid$(Name, intCt, 1) & strNew
Next
Name = strNew
End Sub
类模块有两个事件:Initialize 和 Terminate。从类模块的“对象”下拉列表中,选择“类”。下拉出的“过程”列表将显示事件。将以下代码放到事件过程中:
Private Sub Class_Initialize()
'设置对象创建的日期/时间,
' 由只读的 Created 属性返回。
mdtmCreated = Now
'显示对象属性。
MsgBox "Name: " & Name & vbCrLf & "Created: " _
& Created, , "Thing Initialize"
End Sub
Private Sub Class_Terminate()
'显示对象属性。
MsgBox "Name: " & Name & vbCrLf & "Created: " _
& Created, , "Thing Terminate"
End Sub
一般 Initialize 事件包含了对象创建时所需的所有代码,如为 Created 属性提供时间标记。Terminate 事件包含撤消对象后进行清理的所有代码。
本示例中,两个事件主要用来提供 Thing 对象创建或撤消的可视化指示。
Thing 对象的使用
添加以下代码到窗体模块的声明段:
Option Explicit
Private mth As Thing
变量 mth 保存了对一个 Thing 对象的引用,该对象是在窗体的 Load 事件中产生的。将以下代码分别添加到 Form_Load 事件过程及四个按钮的 Click 事件过程中。
Private Sub Form_Load()
Set mth = New Thing
mth.Name = InputBox("Enter a name for the Thing")
End Sub
'按钮“显示该 Thing”
Private Sub Command1_Click()
MsgBox "Name: " & mth.Name & vbCrLf _
& "Created: " & mth.Created, , "Form Thing"
End Sub
'按钮“颠倒该 Thing 的名称”
Private Sub Command2_Click()
mth.ReverseName
'单击“显示该 Thing”
Command1.Value = True
End Sub
'按钮“创建新的 Thing”
Private Sub Command3_Click()
Set mth = New Thing
mth.Name = InputBox( _
"Enter a name for the new Thing")
End Sub
'按钮“临时的 Thing”。
Private Sub Command4_Click()
Dim thTemp As New Thing
thTemp.Name = InputBox( _
"Enter a name for the Temporary Thing")
End Sub
运行工程
按 F5 键运行该工程。观察 Form_Load 事件过程可知 New 操作符用于创建 Thing 对象。对该对象的引用赋给了变量 mth。
InputBox 函数要求输入 Thing 的名称。输入名称并按 ENTER 键后,返回值被赋予 Thing 对象的 Name 属性。
显示窗体 Thing
可以通过按下第一个按钮“显示该 Thing”来验证所赋的 Name 属性值,此时将显示一个包含了 Thing 对象所有属性的消息框。
颠倒 Thing 的名称
按第二个按钮“颠倒该 Thing 的名称”。该按钮调用 ReverseName 方法把 Thing 对象的名称倒过来,然后按第一个按钮显示更新过的属性值。
创建新的 Thing
单击“创建新的 Thing”按钮撤消已存在的 Thing 对象后再创建一个新的对象。(或,反过来进行,创建一个新的 Thing 对象然后撤消旧的。)
New 操作符创建一个新的 Thing,因此可以看见新 Thing 的 Initialize 事件显示的消息框。单击“确定”,对新 Thing 的引用被赋给了窗体级的变量 mth。
这样做清除了对旧的 Thing 的引用。由于不再有引用,所以它被撤消,因此可以看到 Terminate 事件的消息框。单击“确定”后,InputBox 语句要求输入新 Thing 的名称。
注意 如果希望在创建新的 Thing 之前撤消旧的,可以添加代码 Set mth = Nothing 到事件过程的开始部分。
临时的 Thing
第四个按钮演示了对象存活期的另一个方面。按下后,将提示输入临时 Thing 的名称。
可是等一等,这还不是一个临时的 Thing 对象。还没有见到其 Initialize 消息框,怎么赋给它名称呢?
由于变量 thTemp 已被 As New 声明过了,因此当一个属性或方法被使用时就会创建 Thing 对象。这将发生在输入框返回的值被赋给 Name 属性时。在输入框键入名称后单击“确定”。
此时可以看到 Initialize 的消息框,其中的 Name 属性还是空白。当单击“确定”关闭消息框后,InputBox 语句的值终于赋给了 Name 属性。看看这一行代码作了多少事。
当然,当完成了这一切后,Click 事件过程也结束了,变量 thTemp 也超出可见范围,对临时 Thing 的对象引用也被释放,因此可以看到 Thing 的 Terminate 消息框,注意其中包含所提供的名称。
每次单击该按钮将创建另一个临时 Thing,并进行命名,将它撤消。
关闭程序
单击窗体的“关闭”按钮可终止应用程序。不要使用工具栏上的 End 按钮。应用程序终止时,Form1 被撤消。变量 mth 也超出可见范围,Visual Basic 清除对 Thing 的引用。由于已不存在对 Thing 的引用,因此被撤消并显示 Terminate 事件的消息框。
再次运行应用程序,这次用工具栏上的 End 按钮终止程序。注意这时没有显示 Thing 对象的 Terminate 消息框。
应特别记住使用 End 按钮终止应用程序或在代码中用 End 语句立即退出应用程序,并不能运行任何对象的 Terminate 事件。最好能通过卸载所有的窗体来关闭应用程序。
通过 F8 键以每次运行一行代码的形式运行示例,是一个很有用的方法。这有利于理解创建和撤消对象的事件的顺序。
重点 在实际的应用程序中,Initialize 和 Terminate 事件不应包含消息框或其它任何使 Windows 显示消息的代码。一般来说,调试对象的存活期时最好用 Debug.Print 语句。
全部回答
- 1楼网友:一把行者刀
- 2021-04-04 15:54
把代码粘贴到一个模块内即可,要注意:
1、API函数的引用、变量的定义要放在代码的前边;
2、如果有private sub(function),要注意重名问题。
- 2楼网友:人间朝暮
- 2021-04-04 15:23
(以下代码转载)
---- 下面是一段示例代码,这是一个多文档记事本程序中的一部分:
模块中声明:
Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hwnd As Long, ByVal fAccept As Long)
Public Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop As Long)
Public Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_DROPFILES = &H233
Public Const GWL_WNDPROC = (-4)
Public OldWndProc&
Public Sub NewtxtWndFunc(ByVal Hwndl&)
OldWndProc = SetWindowLong(Hwndl, GWL_WNDPROC, AddressOf txtWndProc)’返回 窗口的默认窗口函数的地址,以便恢复
End Sub
Public Sub OldtxtWndFunc(ByVal Hwndl&)' 恢复窗口的默认窗口函数
SetWindowLong Hwndl, GWL_WNDPROC, OldWndProc
End Sub
Public Function txtWndProc&(ByVal NewHwnd&,ByVal uMsg&, ByVal wParam&, ByVal lParam&)
Select Case uMsg
Case WM_DROPFILES
Dim Handle&, FileNameBuff$, Result&, hDrop&, FileNum&
Dim fLine$
hDrop = wParam
FileNameBuff = Space(100)
Result = DragQueryFile(hDrop, (-1), FileNameBuff, 100)'获得拖动的文件的数目
For I& = 0 To Result - 1
DragQueryFile hDrop, I, FileNameBuff, 100
xyOpenFile Trim(FileNameBuff)
Next
DragFinish hDrop
txtWndProc = 1
Case Else
txtWndProc = CallWindowProc(OldWndProc, NewHwnd, uMsg, wParam, lParam)
End Select
End Function
Public Function xyOpenFile(ByVal FN$) As Boolean
If BeUsed(MDIForm1.ActiveForm) Then
MDIForm1.MunNew_Click
End If
Dim FileNum&, fLine$
FileNum = FreeFile()
MDIForm1.ActiveForm.Caption = FN
Open FN For Input As #FileNum
fLine = StrConv(InputB(LOF(FileNum), #FileNum), vbUnicode)
MDIForm1.ActiveForm.Text1 = fLine
Close
End Function
在子窗口Form1中有一个Text1文本框,Form1的Load过程中代码如下:
Private Sub Form_Load()
DragAcceptFiles Text1.hwnd, True
NewtxtWndFunc Text1.hwnd
End Sub
习惯上要在窗口的退出过程中恢复窗口的默认窗口函数:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
OldtxtWndFunc Text1.hwnd
End Sub
---- 这个程序支持多个文件的拖动,BeUsed(Byval hwnd1)是一个自己编的函数,用于测试hwnd1这个窗口是否已用于打开其他的文件。MDIForm1是一个多文档窗口。DragQueryFile中的文件名缓冲区一定要足够大,否则VB会出现“一般保护性错误(GPF)”(Global Protection Failure)而把程序连同VB一起关掉,当初我设为20,就老是出现这样的现象,还无法通过调试查其确切原因,VB中使用API经常会因为传入参数类型不对或缓冲区太小而出现GPF,大家使用的时候要小心注意,调试前及时存盘。
---- 这个小程序只是一个引子,和拖动相关的函数还有:DragObject()、DragDelect()、DragQueryPoint(),第一个是拖动一个对象,后两个是测试拖动点的,这样可以实现Netants的链接拖动功能。希望这个程序能给你一点小的提示。
请参考
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯