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

VB问题全功略(61

上一页61下一页

301、如何使用 VB 撰写自动解除安装的程序?
302、如何叫用系统的【查找】、【替换】的问话框?
303、如何隐藏及显示桌面上的图标?
304、如何让数字正确的在 ListBox 及 ComboBox 中排序?
305、如何从 Internet 上回某一个网页的内容?

301、如何使用 VB 撰写自动解除安装的程序?

一般软件在安装后,都会在【开始】菜单的【程序】中建立一个群组(Group),并且在群组中建立一些执行程序的快捷方式,而在这些快捷方式中通常都会含有一个自动解除安装的快捷方式。

所以,如果您安装了某一个软件之后,想要解除安装,您有二个方法:
1、开启【控制面板】中的【添加/删除程序】,选择该项软件来解除安装。
2、选择【开始】【程序】中该系统所产生的群组中的解除安装的快捷方式来解除安装。

上面的第一种方法,您不需要作任何处理,一般软件在安装完后,都会在【控制面板】中的【添加/删除程序】多一个该软件的选项。而第二种方法,就必须要我们写程序来解决了!

假设,今天我们写了一支程序叫 Test,当您完成 Test.exe 之后,您必须再多写一支自动解除安装的程序,我们将文件名称设为 unTest.exe(先不要管如何写,后面会说明)。二支程序都完成后,您使用 VB 提供的应用程序安装精灵 (Application Setup Wizard) 来制作安装程序时,必须额外再加入 unTest.exe!

加入 unTest.exe 之后,使用者安装后,安装程序并不会在【开始】【程序集】中该系统所产生的群组【Test】中加入这个自动解除安装程序 unTest.exe 的快捷方式,安装程序只会将 unTest.exe 连同 Test.exe 一起复制到应用程序的目录中而已!所以如果您想产生 unTest.exe 的快捷方式,您可能需要稍微修改一下 VB 提供的应用程序安装精灵程序!

以下我们就实际来看看 unTest.exe 程序如何写:

在 VB 中建立一个新工程,取名为 unTest.vbp,表单为 unTest.frm,不需要任何控制项,在表单中加入以下程序码:

Private Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Sub Form_Load()
On Error Goto BaddUn
Dim X&
Dim buffer As String * 128
Dim UnStr As String
Dim size As Integer
Dim retval As Integer
buffer = Space$(128)
size = 128
retval = GetWindowsDirectory(ByVal buffer, ByVal size)
Me.Caption = buffer
'以下的程序码必须写在同一行中 (如果在浏览器中有换行的话)
''''''''''''''''''''''''''''''''''''''''
UnStr = Me.Caption & "\ST5UNST.EXE -n " & Chr(34) & App.Path & "\ST5UNST.LOG" & Chr(34)
''''''''''''''''''''''''''''''''''''''''
'MsgBox UnStr '可显示可不显示, 只是测试用
'X& = Shell("C:\WINDOWS\ST5UNST.EXE -n "
' "C:\Program Files\App Name\ST5UNST.LOG""
' ", vbNormalFocus)
X& = Shell(UnStr, vbNormalFocus)
Unload Me
Exit Sub
BaddUn:
MsgBox "for some reason UnInstall can not run."
Exit Sub
End Sub

由以上的程序码中,您是否发现, unTest.exe 必须和 St5unst.log 放在同一个目录中,不过这只要和上面的程序一样使用 App.Path 就可以解决了!

注:这个范例是使用 VB5 来做测试的,如果是其他版本的 VB,ST5UNST.LOG 文件名可能必须改变!

302、如何叫用系统的【查找】、【替换】的问话框?

在一般的文书编辑软件中,例如 Windows 本身提供的记事本及小作家中,我们都可以在【编辑】下拉选单中,找到【查找】、【替换】二项功能,我想很多人自己在撰写编辑程序时,也都会自己写程序去模拟这二个相当基本的功能。其实根本不用您自己花时间去写这样的程序码!

还记得 Microsoft Common Dialog Control (16 位元文件是 Comdlg16.ocx,32 位元文件是 Comdlg32.ocx) 吗?我们都知道,这个控制项可以帮助我们做到以下几件事情:

1、ShowOpen:打开文件
2、ShowSave:存文件
3、ShowPrinter:设定打印机
4、ShowFont:设定字型
5、ShowColor:设定颜色
6、ShowHelp:开启说明文件

当然,您若还想要 Microsoft Common Dialog Control 多做一些别的事也没办法的!但是,Microsoft 在提供 .ocx 文件的同时,还提供了另外一个文件,也就是 comdlg32.dll,它的功能就多了,除了上面提到的几种问话框之外,还有好几个不同功能的问话框,其中就包含【查找】、【替换】二项功能!这二个 API 分别是 FindText 及 ReplaceText 二个。

在程序中,要声明这二个 API 之前,由於它们都会引用到一个名为 FINDREPLACE 的 Type,所以我们在声明 Function 之前,必须先声明 Type FINDREPLACE,程序码如下:

在表单的声明区中加入以下声明:

'Find/Replace Type Structure
Private Type FINDREPLACE
lStructSize As Long ' size of this struct 0x20
hwndOwner As Long ' handle to owner's window
hInstance As Long ' instance handle of.EXE that contains cust. dlg. template
flags As Long ' one or more of the FR_??
lpstrFindWhat As String ' ptr. to search string
lpstrReplaceWith As String ' ptr. to replace string
wFindWhatLen As Integer ' size of find buffer
wReplaceWithLen As Integer ' size of replace buffer
lCustData As Long ' data passed to hook fn.
lpfnHook As Long ' ptr. to hook fn. or NULL
lpTemplateName As String ' custom template name
End Type

'Common Dialog DLL Calls
Private Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA" (pFindreplace As FINDREPLACE) As Long
Private Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" (pFindreplace As FINDREPLACE) As Long

'Delcaration of the type structure
Dim frText As FINDREPLACE

在表单中加入二个 Command Button,并命名为 cmdFind, cmdReplace,加入以下程序码:

Private Sub cmdFind_Click()
'Call the find text function
FindText frText
End Sub

Private Sub cmdReplace_Click()
'Call the replace text function
ReplaceText frText
End Sub

Private Sub Form_Load()
'Set the Find/Replace Type properties
With frText
.lpstrReplaceWith = "Replace Text"
.lpstrFindWhat = "Find Text"
.wFindWhatLen = 9
.wReplaceWithLen = 12
.hInstance = App.hInstance
.hwndOwner = Me.hWnd
.lStructSize = LenB(frText)
End With
End Sub

好了,您现在可以按 F5 试试了!

注:在 Type FINDREPLACE 中有一个 flag,您可以代入的 flag 是 FR_??,您可以在 API 检视员中找找!

303、如何隐藏及显示桌面上的图标?

当桌面上的图标太多时,看起来就会有一点点乱,而且,当您的桌面底图很漂亮时,这些图标还会遮住您漂亮的底图,有些软件有提供隐藏及显示桌面上的图标的功能,这个我们也可以做到!

在模组中加入以下声明:

Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd As Long, ByVal hWndChild As Long, ByVal lpszClassName As String, ByVal lpszWindow As String) As Long
Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

'-- Constants for ShowWindow()
Public Const SW_HIDE = 0
Public Const SW_NORMAL = 1
Public Const SW_SHOWMINIMIZED = 2
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWNOACTIVATE = 4
Public Const SW_SHOW = 5
Public Const SW_MINIMIZE = 6
Public Const SW_SHOWMINNOACTIVE = 7
Public Const SW_SHOWNA = 8
Public Const SW_RESTORE = 9
Public Const SW_SHOWDEFAULT = 10

'-- Names of the shell window we'll be looking for
Public Const g_cstrShellViewWnd As String = "Progman"

在表单中加入二个 Command Button,并命名为 cmdHideDesktop, cmdShowDesktop,加入以下程式码:

Private Function FindShellWindow() As Long
Dim hWnd As Long
On Error Resume Next

hWnd = FindWindowEx(0&, 0&, g_cstrShellViewWnd, vbNullString)
If hWnd <> 0 Then
FindShellWindow = hWnd
End If
End Function

Private Sub HideShowWindow(ByVal hWnd As Long, Optional ByVal Hide As Boolean = False)
Dim lngShowCmd As Long
On Error Resume Next

If Hide = True Then
lngShowCmd = SW_HIDE
Else
lngShowCmd = SW_SHOW
End If
Call ShowWindow(hWnd, lngShowCmd)
End Sub

Private Sub cmdShowDesktop_Click()
Dim hWnd As Long
On Error Resume Next

'-- Find the window we're looking for and then hide it
hWnd = FindShellWindow()
If hWnd <> 0 Then
Call HideShowWindow(hWnd)
End If
End Sub

Private Sub cmdHideDesktop_Click()
Dim hWnd As Long
On Error Resume Next

hWnd = FindShellWindow()
If hWnd <> 0 Then
Call HideShowWindow(hWnd, True)
End If
End Sub

好了,您现在可以按 F5 试试了!

304、如何让数字正确的在 ListBox 及 ComboBox 中排序?

不知道各位有没有发现,ListBox 及 ComboBox 的 Sorted 属性在遇到数字后有点怪怪的,是有排序没错,但是它似乎将数字当作文字排序了!所以排出来的效果和我们真正想要的并不完全相同。其实这情形不只发生在 ListBox 及 ComboBox 而已,文件总管的文件排也有同样的情形,让我们来看看:

[FrontPage 保存结果 组件]
ListBox 及 ComboBox 的 Sorted 属性设为 True 我们真正想要的结果
1 11 123 2 32 1 2 11 32 123

'以下这个模组就是用来排序数字用的,得到的结果,就如同上方右边的结果!

Sub ReSort(L As Control)
Dim P%, PP%, C%, Pre$, S$, V&, NewPos%, CheckIt%
Dim TempL$, TempItemData&, S1$
For P = 0 To L.ListCount - 1
S = L.List(P)
For C = 1 To Len(S)
V = Val(Mid$(S, C))
If V > 0 Then Exit For
Next
If V > 0 Then
If C > 1 Then Pre = Left$(S, C - 1)
NewPos = -1
For PP = P + 1 To L.ListCount - 1
CheckIt = False
S1 = L.List(PP)
If Pre <> "" Then
If InStr(S1, Pre) = 1 Then CheckIt = True
Else
If Val(S1) > 0 Then CheckIt = True
End If
If CheckIt Then
If Val(Mid$(S1, C)) < V Then NewPos = PP
Else
Exit For
End If
Next
If NewPos > -1 Then
TempL = L.List(P)
TempItemData = L.ItemData(P)
L.RemoveItem (P)
L.AddItem TempL, NewPos
L.ItemData(L.NewIndex) = TempItemData
P = P - 1
End If
End If
Next
End Sub

'实际使用时,需导入控制项的名称,例如:

Private Sub Command1_Click()
Call ReSort(List1)
End Sub

305、如何从 Internet 上抓回某一个网页的内容?

常在讨论区中发现有人问这个问题,我搞不懂,这有什么特别的目的或意义?直接使用浏览器不就好了吗?

不过,要用 VB 来做也不难,只要使用 Internet Transfer Control 就可以了!

开启一个新工程,加入一个 Internet Transfer Control、一个 CommandButton 及二个 TextBox!

Text1 用来输入要抓取的网页位址,例如:http://www.microsoft.com/taiwan/support/products/vb.htm
Text2 用来输入要存文件的完整文件名,例如:c:\temp\temp.htm

Private Sub Command1_Click()
Dim b() As Byte
'取消所有动作
Inet1.Cancel
'设定通讯协定为 HTTP
Inet1.Protocol = icHTTP
'设定 URL 属性
Inet1.URL = Text1.Text
'将读取的 HTML 资料放进一个 byte array.
b() = Inet1.OpenURL(, icByteArray)
'建立一个暂存文件来存放抓回来的 html 文件
Open Text2.text For Binary Access Write As #1
Put #1, , b()
Close #1
End Sub

好了,就是这么简单,试看看吧!

上一页61下一页