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

VB问题全功略(36)

上一页(36)下一页

176、模拟 VB 程序执行时产生的错误讯息
177、如何取得文件大小?
178、如何一次读取整个文件的内容?
179、如何使用文本文件来存取 ListBox 内的资料?
180、字串取代之【全部取代】

176、模拟 VB 程序执行时产生的错误讯息

VB 程序执行时若有错误产生,而程序中又没有错误控制的话,便会出现 VB 内定的错误编号及错误讯息,但是这个错误讯息通常都很简短,所以使用者和写程序的人反应时,有时候也不知道是什么意思及该如何处理。而且这种错误有时候在开发人员的机器上不会发生,只有在使用者的机器上才会发生,所以开发人员也模拟不出来!

虽然 VB 的错误编号及讯息都很简短,但是在 VB 的线上说明中都有比较详细的错误分析及解决方法,只是有些人找不到,所以常常有人在问 VB 产生的错误讯息是什么意思及该如何处理。

VB 的 Err 物件其实就可以让我们模拟错误,以下的 Sample 是从 VB 的 HELP 中节录出来的:

' If an error occurs, construct an error message
On Error Resume Next ' Defer error handling.
Err.Clear
Err.Raise 6 ' Generate an "Overflow" error.
' Check for error, then show message.
If Err.Number <> 0 Then
Msg = "Error # " & Str(Err.Number) & " was generated by " & Err.Source & Chr(13) & Err.Description
MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
End If

以上的程序加了 On Error Resume Next,所以并不会中断跳出来,而出现的讯息框内容如下,有错误编号及错误讯息,而且错误讯息很简短,而且它只有一个【确定】按钮,对我们帮助不大:

Error # 6 was generated by Project1
OverFlow

今天如果在 Design Time 时将 On Error Resume Next 拿掉,出现的讯息框如下:

Run-time error '6'
OverFlow

除了以上的讯息外,它有四个按钮,分别是【Continue】、【End】、【Debug】、【Help】,而最后一个按钮【Help】就可以让我们直接进到 Help 看到以下的详细说明:

Overflow (Error 6)

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: 

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.
Assign the value to a variable of a type that can hold a larger range of values.
An assignment to a property exceeds the maximum value the property can accept.
Make sure your assignment fits the range for the property to which it is made.
For additional information, select the item in question and press F1. 

所以,下一次您就可以使用这个方法来方便找到详细的错误说明!

177、如何取得文件大小?

VB6 提供了一个新的物件模型,叫做 FSO (File System Object) 物件模型,运用它,我们可以很方便的处理磁盘、资料夹和文件的一些动作。

FSO 物件模型含有好几个物件,其中有一个 File 物件是用来求得文件的相关资讯,在目前这个主题,我们就可以使用 File 物件!它有一个属性是 Size,对文件来说就是指文件的大小 (单位为位元组)。 (注一)

虽然使用 File 物件的 Size 属性就可以求得文件的大小,但是它有以下二个缺点:
1、只能用于 VB6 以后的版本。
2、它不是 VB6 内定的功能,必须另外引用 Scrrun.dll (Microsoft Scripting Runtime) 才可以!

以下的二个方法就可以使用在所有的 VB 版本中 (含 VB6),而且是 VB 内定的功能:

1、FileLen 函数:返回一个 Long,代表一个文件的长度,单位是位元组。

语法:FileLen(pathname) ' pathname 是全路径之文件名称
适用:取得一个尚未开启的文件的长度大小 (注二)

2、LOF 函数:返回一个 Long ,单位为位元组,用来代表由 Open 陈述式所开启的文件之大小。

语法:LOF(filenumber) ' filenumber 是一个文件代码
适用:取得一个已开启的文件的长度大小

注一:File 物件的 Size 属性除了可以求得一个文件的大小,也可以用来取得整个目录的所有文件大小!

注二:使用 FileLen 函数时,如果所指定的文件正在开启中,则所返回的值是这个文件在开启前的大小。

178、如何一次读取整个文件的内容?

通常我们要读取整个文件的内容时,都是一行一行读进来,再使用变数来累加。除了这种方法之外,您还可以使用 GET Function,只要呼叫一次就可以读入一整个文件了!而且速度更快!

以下这个模组就是使用 GET 来读入整个文件,参数只有一个,就是含路径的文件名:

Function FileContent(FileName As String) As String
Dim FileNo As Integer
Dim FileString As String
FileNo = FreeFile
Open FileName For Binary As #FileNo
FileString = Space(FileLen(FileName))
Get #FileNo, , FileString
Close #FileNo

FileContent = FileString
End Function

使用实例如下:

Private Sub Command1_Click()
RichTextBox1 = FileContent("C:\Test.txt") (注)
End Sub

注:

当文件大小小于 64K 时可使用 TextBox
当文件大小大于 64K 时请使用 RichTextBox

若是 VB6 您还可以使用 FSO 物件模型中的 TextStream 物件的 ReadAll 方法来读一个完整的 TextStream 文件并返回得到的字串。

对于太大的文件,使用以上的方法浪费记忆体资源。应使用其它的技术去输入一个文件,比如一列一列地读取文件。

179、如何使用文本文件来存取 ListBox 内的资料?

当我第一次在网路上的讨论区中看到有人提到以下的二个问题时:

1、请问如何将 TextBox 或 ListBox 的资料存到文本文件中?
2、请问如何将文本文件中的资料一行一行读出放到 ListBox 中?

我真的有一点惊讶,因为我一直都是待在民营企业的 MIS 部门,所有的系统都要使用到资料库,像这样的问题,我们在系统设计时,都会在资料库中用一个片语文件来存放,不管系统大小,都可以将这一类的资料存在片语文件中,再依类别来区分,还可以依使用者 要来加以编号排序,除此之外,也方便统一管理。

不过,不管是国内或国外的讨论区中,这样的问题却一直不断的有人在问,而且频率不低,这让我体会到,基于各种理由,并不是所有人都一定要使用资料库来存放这些资料!

若要使用文本文件来存放这些资料,其实最需要了解的,就是文本文件的存取方法!

在以下的范例中,我使用到二个 ListBox 及二个 CommandButton,不需更改任何属性!按下 Command1 时,会将 List1 中的资料放到暂存文件中,按下 Command2 时,再将暂存文件中的资料放到 List2 中。

Private Sub Command1_Click()
'将 ListBox 资料放到文本文件中
Dim i As Integer
Open "c:\temp.txt" For Output As #1
For i = 0 To List1.ListCount - 1
Print #1, List1.List(i)
Next
Close #1
End Sub

Private Sub Command2_Click()
'将文本文件中资料读出放到 ListBox 中
Dim wstr As String
Open "c:\temp.txt" For Input As #1
Do While Not EOF(1) '执行回圈直到文件尾为止。
Input #1, wstr
List2.AddItem wstr
Loop
Close #1
End Sub

不过如果您的系统有使用到资料库,而您之前没有想到要使用资料库的片语文件来存放这些资料的话,我建议您试试看,您会发现片语文件真的很方便,不管什么杂七杂八的资料,只要一个文件就解决了!

180、字串取代之【全部取代】

在一般的应用软体中,例如 Word、小作家、Excel....等,都会提供字串取代【全部取代】的功能,这个功能很简单,就是将整篇文章从头到尾找一遍,碰到您要找的字串,就将它转换成您要取代的字串。

当然,或许您会说 VB6 不是己经有提供这个功能了吗?没错!VB6 己经有提供这个功能了,但是据我所知,目前企业界实际在使用 VB6 的比例并不高!大部份还是使用 VB5 / VB4-32,这个模组就是专为 VB6 以前的版本写的。

以下这个模组 myReplaceString ,它共有三个参数,说明如下:
1、hString:您要搜寻的一篇文章。
2、hSource:要搜寻到的子字串。
3、hTarget:用来取代的子字串。

整个模组的程序码很短,如下:

Public Function myReplaceString(ByVal hString As String, ByVal hSource As String, ByVal hTarget As String) As String
  tLen = Len(hSource)
  tChk = (Len(hTarget) = Len(hSource))
  tLoc = 1
  Do
    tLoc = InStr(tLoc, hString, hSource)
    If tLoc <> 0 Then
      If tChk Then
        Mid(hString, tLoc, tLen) = hTarget
      Else
        hString = Left(hString, tLoc - 1) + hTarget + _
        Mid(hString, tLoc + tLen)
      End If
      tLoc = tLoc + Len(hTarget)
    Else
      Exit Do
    End If
  Loop
  myReplaceString = hString
End Function

而返回值就是已经经过转换后的新文章!

上一页(36)下一页