您的位置:寻梦网首页编程乐园VB 编程乐园VB问题全功略

VB问题全功略(52)

上一页(52)下一页

256、您使用 ADO 存取 Access 2000 时会出现错误吗?
257、如何侦测光驱中是否有光盘存在?
258、您知道每一个表单 (Form) 最多可以放多少个控制项吗?
259、如何动态新增控制项?
260、如何查看目录所占的字节数?

256、您使用 ADO 存取 Access 2000 时会出现错误吗?

很多 VB 的程序设计师,以往在 VB6 中利用 ADO OLEDB Provider 3.51 存取 Access 97 资料库,系统都能正常的执行。但是自从将 Access 97 升级到 Access 2000 之后,就无法顺利的存取 Access 2000 资料库了,不知道您是否也曾遇到这样的情形呢?

其实这种事情在 Microsoft 已经是思空见惯的事情了!任何软件只要有了新的版本,就会有和旧版本相容的问题产生!

而这一次是因为 由于 Access2000 己经使用 Jet 4.0 Engine,所以解决方法如下:

在您的 ADO 的 Connect String 中的 Provider 必须修改为:"PROVIDER=Microsoft,Jet.OLEDB.4.0"

257、如何侦测光驱中是否有光盘存在?

要快速的判断光驱中是否有光盘存在,您必须使用 Scripting Runtime library 中 Drive 物件的 IsReady 属性!一旦光驱中有光盘存在,它会传回 True,否则传回值是 False!

要使用 Drive 物件的 IsReady 属性,您必须先引用 Microsoft Scripting Runtime library,方法如下:

Menu【项目】-->选择【设定引用项目】-->选择【Microsoft Scripting Runtime】(Scrrun.dll)

再来,您必须知道光驱的磁盘代号,这个问题,我们之前在 问题:如何判断目前电脑中所有磁盘之型态? 中曾经讨论,不过在这 我们不用那个方法了,我们要直接使用 Drive 物件的 DriveType 属性!

程序码如下:

Private Sub Command1_Click()
Dim FSO As FileSystemObject
Dim aDrive As Drive
Set FSO = New FileSystemObject
For Each aDrive In FSO.Drives
If aDrive.DriveType = CDRom And aDrive.IsReady = False Then
MsgBox "请放入光盘片!"
Exit For
ElseIf aDrive.DriveType = CDRom Then
MsgBox aDrive.VolumeName
Exit For
End If
Next
Set FSO = Nothing
End Sub

258、您知道每一个表单 (Form) 最多可以放多少个控制项吗?

如果我说每一个表单 (Form) 最多可以放无限多个控制项,您相信吗?往下看到最后您或许就相信了!

根据 Microsoft 的官方说法,一个表单中最多可以有 254 个控制项的「名称」(注意,是控制项的名称!),不过还是要看您放在表单中的控制项种类以及您机器中的系统资源有多少而定!

若您想突破控制项的名称数及系统资源的限制,以下有三个方法:

1、使用控制项阵列:

您可以产生一个控制项阵列来放相同种类的控制项,他们共用一个控制项「名称」!

2、动态产生控制项:

如果您不需要同时使用那么多控制项,Form_Load 时就不要 Load 进来,用到时再动态产生即可能!

3、将控制项放在 UserControl 中:

这个方法和使用控制项阵列相似,您可以将很多个控制项放在一个 UserControl 中,然后将这个 UserControl 放进 Form 中,举个例子来说,如果您的表单中需要 500 个 TextBox,您可以建立一个包含 250 个 TextBox 的 UserControl,那么,您只要放二个 UserControl,您就有 500 个 TextBox 了,但是您总共只用到二个控制项而已!

注意:

虽然,一个表单中最多可以有 254 个控制项的名称,但是控制项如果太多了,便会严重影响您的程序的效能(performance),甚至您会得到一个记忆体不足(out-of-memory) 的错误讯息!因此想要让您的应用程序效能好一点,您应该尽量减少控制项的数量!

259、如何动态新增控制项?

VB 从 6.0 版开始,已经可以允许我们使用 Controls Collection 的 Add Method 在程序执行时动态新增控制项!今天这个单元就是要告诉大家如何动态新增 VB 预设的控制项或是 ActiveX 控制项。

在以下的范例中,我们会在程序执行时动态新增二个预设的控制项及一个 ActiveX 控制项,也会告诉大家如何处理动态新增控制项的事件!如果您新增的控制项,在项目的【设定使用元件】、【设定引用项目】中没有声明的话,您还必须先将这个控制项的 License Key 加到 License Collection 中!(注一)

如果您要使用这个新增控制项的属性时,您必须使用物件的关键字来存取这个控制项的属性。如果您不使用物件的关键字的话,您会得到一个错误代码为 438 的错误讯息如下:

"Object doesn't support this property or method." (物件不支援这个属性或方法)


当您在声明区中使用 VBControlExtender object 及 WithEvents 来新增 ActiveX 控制项时,您必须使用 ObjectEvent method 来处理所有这个控制项的事件。如果您声明一个预设的控制项事件,您将会得到您声明的这个物件类别的所有标准事件,如何得知呢?加入以下的声明,然后在程序码视窗的控制项 Combo 中,找到您声明的这个控制项变数,然后点选事件 Combo,您就会看到了!

Dim WithEvents cmdMyCommand as VB.CommandButton

以下是我们的范例:

1、建立一个标准的新项目,预设会产生 Form1,不必加入任何控制项。

2、在 Form1 中加入以下的程序码:

Option Explicit
' 在程序执行时要动态新增 ActiveX 控制项,而这个新增的控制项,
' 在项目的【设定使用元件】、【设定引用项目】中没有声明的话,
' 您必须将它声明成 VBControlExtender
Dim WithEvents ctlDynamic As VBControlExtender
Dim WithEvents ctlText As VB.TextBox
Dim WithEvents ctlCommand As VB.CommandButton

Private Sub ctlCommand_Click()
ctlText.Text = "You Clicked the Command button"
End Sub

Private Sub ctlDynamic_ObjectEvent(Info As EventInfo)
' 测试 TreeView 的 Click 事件
If Info.Name = "Click" Then
ctlText.Text = "You clicked " & ctlDynamic.object.selecteditem.Text
End If
End Sub

Private Sub Form_Load()
Dim i As Integer

' 将 TreeView 的 License Key 加到 License Collection 中。
' 但是,如果这个 License Key 已经存在 License Collection 中,
' 您会得到一个编号 732 的执行期错误讯息。
Licenses.Add "MSComctlLib.TreeCtrl"

' 动态新增 TreeView 控制项到 Form 中,如果您想将这个控制项
' 加到 Form 以外的 Container 中,例如 Frame 或 Picture,那么,
' 在 Controls.Add 的第三个参数必须修改成 Container 的名称。
Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl", "myctl", Form1)

' 设定 TreeView 控制项的位置及大小
ctlDynamic.Move 1, 1, 2500, 3500

' 新增 TreeView 控制项的 nodes
For i = 1 To 10
ctlDynamic.object.nodes.Add Key:="Test" & Str(i), Text:="Test" & Str(i)
ctlDynamic.object.nodes.Add Relative:="Test" & Str(i), _
Relationship:=4, Text:="TestChild" & Str(i)
Next i

' 设定 TreeView 控制项的 Visible 属性为 True
ctlDynamic.Visible = True

' 动态新增 TextBox 控制项
Set ctlText = Controls.Add("VB.TextBox", "ctlText1", Form1)

' 设定 TextBox 控制项的位置及大小
ctlText.Move (ctlDynamic.Left + ctlDynamic.Width + 50), 1, 2500, 100

' 设定 TextBox 控制项的 backcolor 属性
ctlText.BackColor = vbYellow

' 设定 TextBox 控制项的 Visible 属性为 True
ctlText.Visible = True

' 动态新增 CommandButton 控制项
Set ctlCommand = Controls.Add("VB.CommandButton", "ctlCommand1", Form1)

' 设定 CommandButton 控制项的位置及大小
ctlCommand.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
ctlText.Height + 50, 1500, 500

' 设定 CommandButton 控制项的标题
ctlCommand.Caption = "Click Me"

' 设定 CommandButton 控制项的 Visible 属性为 True
ctlCommand.Visible = True
End Sub

3、您现在可以执行看看了!按一下 CommandButton 或是 TreeView 的不同 Node,看看 TextBox 中出现什么!

注一:

如果您想知道多一点关于 License Collection 的资料,您可以到以下这个网址看看:

http://support.microsoft.com/support/kb/articles/Q188/5/77.ASP

它的主题是:HOWTO: What is the Licenses Collection Used For? (Licenses Collection 要做什么用 ?)

260、如何查看目录所占的字节数?

该函数返回目录使用的字节数:

Function DirUsedBytes(ByVal dirName As String) As Long
Dim FileName As String
Dim FileSize As Currency
If Right$(dirName, 1) <> "\" Then
dirName = dirName & "\"
Endif
FileSize = 0
FileName = Dir$(dirName & "*.*")
Do While FileName <> ""
FileSize = FileSize + _
FileLen(dirName & FileName)
FileName = Dir$
Loop
DirUsedBytes = FileSize
使用:
MsgBox DirUsedBytes("C:\Windows")

上一页(52)下一页