📄 pr36.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>VB问题全功略(36)</title>
<style type="text/css">font { font-size: 9pt; line-height: 13pt }
p { font-size: 9pt; line-height: 13pt }
td { font-size: 9pt; line-height: 13pt }
select { font-family: 宋体; font-size: 9pt }
input { font-family: 宋体; font-size: 9pt }
textarea { font-family: 宋体; font-size: 9pt }
a { color: blue; font-size: 9pt; text-decoration: none }
a:hover { color: red; text-decoration: underline }
a:active { color: red; text-decoration: underline }
BODY { FONT-SIZE: 12px; SCROLLBAR-HIGHLIGHT-COLOR: #99ccff; SCROLLBAR-SHADOW-COLOR: #99ccff; COLOR: #000000; SCROLLBAR-3DLIGHT-COLOR: #99ccff; SCROLLBAR-TRACK-COLOR: #ffffff; FONT-FAMILY: "宋体"; SCROLLBAR-DARKSHADOW-COLOR: #99ccff; SCROLLBAR-BASE-COLOR: #99ccff}
</style>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<center>
<table border="0" width="100%">
<tr>
<td width="100%">
<p align="center"></td>
</tr>
<tr>
<td align="left" bgcolor="#99CCFF" width="924"><font color="#FF0000">VB问题全功略(36)
</font><font color="#000080">[<font face="宋体">查找本页请按Ctrl+F]</font></font></td>
</tr>
<tr>
<td width="100%" align="center"></td>
</tr>
</center>
<tr>
<td>
<p align="right">[<a href="pr35.htm"><u>上一页</u></a>]<font color="#FF0000"><b>(36)</b></font>[<a href="pr37.htm"><u>下一页</u></a>]</td>
</tr>
<center>
<tr>
<td><a href="#176">176、模拟 VB 程序执行时产生的错误讯息</a><br>
<a href="#177">177、如何取得文件大小?</a><br>
<a href="#178">178、如何一次读取整个文件的内容?</a><br>
<a href="#179">179、如何使用文本文件来存取 ListBox 内的资料?</a><br>
<a href="#180">180、字串取代之【全部取代】</a><br>
<br>
<font color="#FF0000">176、模拟 VB 程序执行时产生的错误讯息</font><a name="176"></a><br>
<br>
VB
程序执行时若有错误产生,而程序中又没有错误控制的话,便会出现
VB
内定的错误编号及错误讯息,但是这个错误讯息通常都很简短,所以使用者和写程序的人反应时,有时候也不知道是什么意思及该如何处理。而且这种错误有时候在开发人员的机器上不会发生,只有在使用者的机器上才会发生,所以开发人员也模拟不出来!<br>
<br>
虽然 VB 的错误编号及讯息都很简短,但是在 VB
的线上说明中都有比较详细的错误分析及解决方法,只是有些人找不到,所以常常有人在问
VB 产生的错误讯息是什么意思及该如何处理。<br>
<br>
VB 的 Err 物件其实就可以让我们模拟错误,以下的 Sample 是从
VB 的 HELP 中节录出来的:<br>
<br>
' If an error occurs, construct an error message<br>
On Error Resume Next ' Defer error handling.<br>
Err.Clear<br>
Err.Raise 6 ' Generate an "Overflow" error.<br>
' Check for error, then show message.<br>
If Err.Number <> 0 Then<br>
Msg = "Error # " & Str(Err.Number) & " was generated by
" & Err.Source & Chr(13) & Err.Description<br>
MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext<br>
End If<br>
<br>
以上的程序加了 On Error Resume Next,所以并不会中断跳出来,而出现的讯息框内容如下,有错误编号及错误讯息,而且错误讯息很简短,而且它只有一个【确定】按钮,对我们帮助不大:<br>
<br>
Error # 6 was generated by Project1<br>
OverFlow<br>
<br>
今天如果在 Design Time 时将 On Error Resume Next
拿掉,出现的讯息框如下:<br>
<br>
Run-time error '6'<br>
OverFlow<br>
<br>
除了以上的讯息外,它有四个按钮,分别是【Continue】、【End】、【Debug】、【Help】,而最后一个按钮【Help】就可以让我们直接进到
Help 看到以下的详细说明:<br>
<br>
Overflow (Error 6)<br>
<br>
An overflow results when you try to make an assignment that exceeds the
limitations of the target of the assignment. This error has the following causes
and solutions: <br>
<br>
The result of an assignment, calculation, or data type conversion is too large
to be represented within the range of values allowed for that type of variable.<br>
Assign the value to a variable of a type that can hold a larger range of values.<br>
An assignment to a property exceeds the maximum value the property can accept.<br>
Make sure your assignment fits the range for the property to which it is made.<br>
For additional information, select the item in question and press F1. <br>
<br>
所以,下一次您就可以使用这个方法来方便找到详细的错误说明!<br>
<br>
<font color="#FF0000">177、如何取得文件大小?</font><a name="177"></a><br>
<br>
VB6 提供了一个新的物件模型,叫做 FSO (File System Object)
物件模型,运用它,我们可以很方便的处理磁盘、资料夹和文件的一些动作。<br>
<br>
FSO 物件模型含有好几个物件,其中有一个 File
物件是用来求得文件的相关资讯,在目前这个主题,我们就可以使用
File 物件!它有一个属性是 Size,对文件来说就是指文件的大小
(单位为位元组)。 (注一)<br>
<br>
虽然使用 File 物件的 Size
属性就可以求得文件的大小,但是它有以下二个缺点:<br>
1、只能用于 VB6 以后的版本。<br>
2、它不是 VB6 内定的功能,必须另外引用 Scrrun.dll (Microsoft
Scripting Runtime) 才可以!<br>
<br>
以下的二个方法就可以使用在所有的 VB 版本中 (含 VB6),而且是
VB 内定的功能:<br>
<br>
1、FileLen 函数:返回一个 Long,代表一个文件的长度,单位是位元组。<br>
<br>
语法:FileLen(pathname) ' pathname 是全路径之文件名称<br>
适用:取得一个尚未开启的文件的长度大小 (注二)<br>
<br>
2、LOF 函数:返回一个 Long ,单位为位元组,用来代表由 Open
陈述式所开启的文件之大小。<br>
<br>
语法:LOF(filenumber) ' filenumber 是一个文件代码<br>
适用:取得一个已开启的文件的长度大小<br>
<br>
注一:File 物件的 Size
属性除了可以求得一个文件的大小,也可以用来取得整个目录的所有文件大小!<br>
<br>
注二:使用 FileLen
函数时,如果所指定的文件正在开启中,则所返回的值是这个文件在开启前的大小。<br>
<br>
<font color="#FF0000">178、如何一次读取整个文件的内容?</font><a name="178"></a><br>
<br>
通常我们要读取整个文件的内容时,都是一行一行读进来,再使用变数来累加。除了这种方法之外,您还可以使用
GET Function,只要呼叫一次就可以读入一整个文件了!而且速度更快!<br>
<br>
以下这个模组就是使用 GET
来读入整个文件,参数只有一个,就是含路径的文件名:<br>
<br>
Function FileContent(FileName As String) As String<br>
Dim FileNo As Integer<br>
Dim FileString As String<br>
FileNo = FreeFile<br>
Open FileName For Binary As #FileNo<br>
FileString = Space(FileLen(FileName))<br>
Get #FileNo, , FileString<br>
Close #FileNo<br>
<br>
FileContent = FileString<br>
End Function<br>
<br>
使用实例如下:<br>
<br>
Private Sub Command1_Click()<br>
RichTextBox1 = FileContent("C:\Test.txt") (注)<br>
End Sub<br>
<br>
注:<br>
<br>
当文件大小小于 64K 时可使用 TextBox<br>
当文件大小大于 64K 时请使用 RichTextBox<br>
<br>
若是 VB6 您还可以使用 FSO 物件模型中的 TextStream 物件的
ReadAll 方法来读一个完整的 TextStream 文件并返回得到的字串。<br>
<br>
对于太大的文件,使用以上的方法浪费记忆体资源。应使用其它的技术去输入一个文件,比如一列一列地读取文件。<br>
<br>
<font color="#FF0000">179、如何使用文本文件来存取 ListBox
内的资料?</font><a name="179"></a><br>
<br>
当我第一次在网路上的讨论区中看到有人提到以下的二个问题时:<br>
<br>
1、请问如何将 TextBox 或 ListBox 的资料存到文本文件中?<br>
2、请问如何将文本文件中的资料一行一行读出放到 ListBox
中?<br>
<br>
我真的有一点惊讶,因为我一直都是待在民营企业的 MIS
部门,所有的系统都要使用到资料库,像这样的问题,我们在系统设计时,都会在资料库中用一个片语文件来存放,不管系统大小,都可以将这一类的资料存在片语文件中,再依类别来区分,还可以依使用者 要来加以编号排序,除此之外,也方便统一管理。<br>
<br>
不过,不管是国内或国外的讨论区中,这样的问题却一直不断的有人在问,而且频率不低,这让我体会到,基于各种理由,并不是所有人都一定要使用资料库来存放这些资料!<br>
<br>
若要使用文本文件来存放这些资料,其实最需要了解的,就是文本文件的存取方法!<br>
<br>
在以下的范例中,我使用到二个 ListBox 及二个 CommandButton,不需更改任何属性!按下
Command1 时,会将 List1 中的资料放到暂存文件中,按下 Command2
时,再将暂存文件中的资料放到 List2 中。<br>
<br>
Private Sub Command1_Click()<br>
'将 ListBox 资料放到文本文件中<br>
Dim i As Integer<br>
Open "c:\temp.txt" For Output As #1<br>
For i = 0 To List1.ListCount - 1<br>
Print #1, List1.List(i)<br>
Next<br>
Close #1<br>
End Sub<br>
<br>
Private Sub Command2_Click()<br>
'将文本文件中资料读出放到 ListBox 中<br>
Dim wstr As String<br>
Open "c:\temp.txt" For Input As #1<br>
Do While Not EOF(1) '执行回圈直到文件尾为止。<br>
Input #1, wstr<br>
List2.AddItem wstr<br>
Loop<br>
Close #1<br>
End Sub<br>
<br>
不过如果您的系统有使用到资料库,而您之前没有想到要使用资料库的片语文件来存放这些资料的话,我建议您试试看,您会发现片语文件真的很方便,不管什么杂七杂八的资料,只要一个文件就解决了!
<p><font color="#FF0000">180、字串取代之【全部取代】</font><a name="180"></a></p>
<p>在一般的应用软体中,例如 Word、小作家、Excel....等,都会提供字串取代【全部取代】的功能,这个功能很简单,就是将整篇文章从头到尾找一遍,碰到您要找的字串,就将它转换成您要取代的字串。<br>
<br>
当然,或许您会说 VB6 不是己经有提供这个功能了吗?没错!VB6
己经有提供这个功能了,但是据我所知,目前企业界实际在使用
VB6 的比例并不高!大部份还是使用 VB5 / VB4-32,这个模组就是专为
VB6 以前的版本写的。<br>
<br>
以下这个模组 myReplaceString ,它共有三个参数,说明如下:<br>
1、hString:您要搜寻的一篇文章。<br>
2、hSource:要搜寻到的子字串。<br>
3、hTarget:用来取代的子字串。<br>
<br>
整个模组的程序码很短,如下:<br>
<br>
Public Function myReplaceString(ByVal hString As String, ByVal hSource As
String, ByVal hTarget As String) As String<br>
tLen = Len(hSource)<br>
tChk = (Len(hTarget) = Len(hSource))<br>
tLoc = 1<br>
Do<br>
tLoc = InStr(tLoc, hString, hSource)<br>
If tLoc <> 0 Then<br>
If tChk Then<br>
Mid(hString, tLoc, tLen) = hTarget<br>
Else<br>
hString = Left(hString, tLoc - 1) + hTarget + _<br>
Mid(hString, tLoc + tLen)<br>
End If<br>
tLoc = tLoc + Len(hTarget)<br>
Else<br>
Exit Do<br>
End If<br>
Loop<br>
myReplaceString = hString<br>
End Function<br>
<br>
而返回值就是已经经过转换后的新文章!</td>
</tr>
</table>
</center>
</div>
<div align="center">
<center>
<table border="0" width="100%" cellspacing="1">
<tr>
<td width="100%" bgcolor="#99CCFF">
<p align="center"><font color="#ff0000"><a href="../../index.html" target="_blank">[木瓜软件工作室]</a>
整理</font></td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -