|
|
|
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") |
|