VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(53)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10333, 日期:2002-02-03
VB问题全功略(53)

261、您知道 VB6.0 的阵列最多可以包含几个元素吗?
262、如何抓取应用程序的图标 (Icon) 并存文件备用?
263、如何直接使用 VB 来打印 MS Access 的 Report?
264、如何打开 Windows 的创建快捷方式窗口
265、如何取得短文件名

261、您知道 VB6.0 的阵列最多可以包含几个元素吗?

其实这个问题和 问题:您知道每一个表单 (Form) 最多可以放多少个控制项吗? 一样,第一个条件就是决定于您机器中的系统资源有多少而定!

如果今天我们假设系统资源充足而不考虑系统资源的话,根据 Microsoft 的官方说法,一个阵列最多可到 2 的 31 次方,也就是 2147483648,不过如果您真的用到 2147483648 的话,您一定会得到一个「记忆体不足」的错误讯息!因为连 Windows NT 在一个 Process 中也只能支援到 4GB 的记忆体而已!

262、如何抓取应用程序的图标 (Icon) 并存文件备用?

有些应用程序的图标非常的漂亮,不禁让人想将它们据为己有,您是否常常想将它们抓下来私用呢?

一般可以抓出图标 (Icon) 的文件大概就是 .EXE 文件 .ICO 文件及 .DLL 文件三种,但是 .DLL 文件不一定会有图标!

我看过很多范例程序教人家如何从 .EXE 文件及 .DLL 文件中抓出图标,但是也常常在讨论区中看到有人在问,要如何将这些抓出的图标再存成 .ICO 文件?其实,在抓出图标之后,只要使用 SavePicture 陈述式就可以将这个图标再存成 .ICO 的图标文件了!

在含有图标的 .EXE 文件 及 .DLL 文件中不一定只包含一个图标而已,例如:C:\Windows\System\Shell32.dll 中就含有 72 个图标之多!

在以下的范例中,您开启文件之后,程序会告诉您,在该文件中共有几个图标,它会 Show 出其中的第一个图标(索引值是0),其他的图标您可以利用卷动轴来卷动浏览。

以下列出详细的程序码:

所需控制项说明:
Dlg:开文件存文件问话框 CommandDialog
CmdSave:另存图标按钮
CmdOpen:开启文件按钮
Picture1:显示图标
Label1:显示图标总数用
Label2:显示目前在 Picture1 中的图标在原文件中的索引值
Label3:显示目前在 Picture1 中的图标原文件名称
Scroll1:改变显示在 Picture1 中的图标索引值

Dim lIcon As Long
Dim sSourcePgm As String
Dim sDestFile As String

Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long

Private Sub CmdSave_Click() 注释:另存图标
On Error Resume Next
With Dlg 注释:存文件问话框
.filename = sDestFile
.CancelError = True
.Action = 2
If Err Then
Err.Clear
Exit Sub
End If
sDestFile = .filename
SavePicture Picture1.Image, sDestFile 注释:将抓出的图标存文件
End With
End Sub

Private Sub CmdOpen_Click() 注释:开启文件
Dim a%

On Error Resume Next
With Dlg 注释:开文件问话框
.filename = sSourcePgm
.CancelError = True
.DialogTitle = "请选择包含图标的 DLL 或 EXE 文件"
.Filter = "Icon Resources (*.ico;*.exe;*.dll)|*.ico;*.exe;*.dll|All files|*.*"
.Action = 1
If Err Then
Err.Clear
Exit Sub
End If
sSourcePgm = .filename
Label3.Caption = .filename
DestroyIcon lIcon
Do
lIcon = ExtractIcon(App.hInstance, sSourcePgm, a)
If lIcon = 0 Then Exit Do
a = a + 1
DestroyIcon lIcon
Loop
If a = 0 Then
MsgBox "在这个文件中没有任何图标!"
End If
Label1.Caption = "在这个文件中共有 " & a & " 个图标"
VScroll1.Max = IIf(a = 0, 0, a - 1)
VScroll1.Value = 0
VScroll1_Change
End With
End Sub

Private Sub Form_Load()
CmdOpen_Click
End Sub

Private Sub VScroll1_Change()
Label2.Caption = "正在浏览的图标索引值: " & VScroll1.Value
DestroyIcon lIcon
Picture1.Cls
lIcon = ExtractIcon(App.hInstance, sSourcePgm, VScroll1.Value)
Picture1.AutoSize = True
Picture1.AutoRedraw = True
DrawIcon Picture1.hdc, 0, 0, lIcon
Picture1.Refresh
End Sub

263、如何直接使用 VB 来打印 MS Access 的 Report?

在 Visual Basic 中,Access 2.0 可以使用 DDE 来操控,而 Access 97 及更新的版本,则可以使用 OLE Automation 来操控。不过我想,现在大部份的人使用的,都是某一个 32 位版本的 Access。

要在 Visual Basic 中来操控 Access,您首先要在 VB 的【工程】【设定引用项目】问话框中设定引用项目:

Access 7.0 设定的是 "Microsoft Access for Windows 95"
Access 8.0 设定的是 "Microsoft Access 8.0 Object Library"

引用项目设定完成之后,您就可以在您开发的应程序中,基于 Access application 来建立物件变量!只要使用一些简单的指令,您就可以用来开启资料库、执行 Access 报表及关闭资料库...等。

Dim ac As Access.Application
Set ac = New Access.Application
注释:指定要开启的资料库路径
ac.OpenCurrentDatabase("c:\foo\foo.mdb")
注释:只要使用 DoCmd 物件的 OpenReport method 就可以将报表送到打印机
ac.DoCmd.OpenReport "MyReport"
注释:关闭资料库
ac.CloseCurrentDatabase

很简单吧!就是上面这么简单的程序码!只是要记得,您设计的这些可以独立执行的报表,它需要出现什么样的提示讯息或问话框...等!
264、如何打开 Windows 的创建快捷方式窗口

以下的代码演示了如何利用 Win95 的 Wizard 在指定的目录中建立快捷方式。

Dim X As Integer
X = Shell("C:\WINDOWS\rundll32.exe AppWiz.Cpl,NewLinkHere " & App.Path & "\", 1)

265、如何取得短文件名

如果要传递文件到老的不支持长文件名的应用,以下的函数可以派上用场:
Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

Function ShortName(LongPath As String) As String
Dim ShortPath As String
Const MAX_PATH = 260
Dim ret&
ShortPath = Space$(MAX_PATH)
ret& = GetShortPathName(LongPath, ShortPath, MAX_PATH)
If ret& Then
ShortName = Left$(ShortPath, ret&)
End If
End Function