一个关于VB编程的问题!!!
大家好,我在编程时遇到了一个问题,问题就出在下面这段程序。这段程序我在调试和编译时都不报错,可是我编译完成后一运行就提示“数组下标越界”,可我怎么看都看不来为什么越界,请...
大家好,我在编程时遇到了一个问题,问题就出在下面这段程序。这段程序我在调试和编译时都不报错,可是我编译完成后一运行就提示“数组下标越界”,可我怎么看都看不来为什么越界,请各位高手帮我看看,小弟不胜感激!!!
Public Function ReadFile(strFilePath As String) As String()
Dim fso As New FileSystemObject
Dim file
Dim IsFileExist As Boolean
Dim ts As TextStream
Dim strData() As String
ReDim strData(0)
IsFileExist = fso.FileExists(strFilePath)
If IsFileExist = True Then
Set file = fso.GetFile(strFilePath)
Set ts = file.OpenAsTextStream(ForReading)
While Not ts.AtEndOfStream
ReDim Preserve strData(UBound(strData) + 1)
strData(UBound(strData)) = ts.ReadLine
Wend
ts.Close
End If
ReadFile = strData
End Function
我编译和调试也不报错,就是生成EXE文件后一运行就提示“数组下标越界”。因为这段程序在我的FORM LOAD中,所以我肯定问题就出在这里。。。 展开
Public Function ReadFile(strFilePath As String) As String()
Dim fso As New FileSystemObject
Dim file
Dim IsFileExist As Boolean
Dim ts As TextStream
Dim strData() As String
ReDim strData(0)
IsFileExist = fso.FileExists(strFilePath)
If IsFileExist = True Then
Set file = fso.GetFile(strFilePath)
Set ts = file.OpenAsTextStream(ForReading)
While Not ts.AtEndOfStream
ReDim Preserve strData(UBound(strData) + 1)
strData(UBound(strData)) = ts.ReadLine
Wend
ts.Close
End If
ReadFile = strData
End Function
我编译和调试也不报错,就是生成EXE文件后一运行就提示“数组下标越界”。因为这段程序在我的FORM LOAD中,所以我肯定问题就出在这里。。。 展开
展开全部
使用redim关键字设置动态数组大小
动态数组的用法:
组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。
动态数组就可以在任何时候改变大小。在 Visual Basic 中,动态数组最灵活、最方便,有助于有效管理内存。例如,可短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。
如果不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。
要创建动态数组,请按照以下步骤执行:
(如果希望数组为公用数组,则)用 Public 语句声明数组,或者,(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。
Dim DynArray ()
用 ReDim 语句分配实际的元素个数。
ReDim DynArray (X + 1)
ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。
ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。
ReDim DynArray (4 to 12)
例如,用第一次声明在模块级所建立的动态数组 Matrix1:
Dim Matrix1 () As Integer
然后,在过程中给数组分配空间:
Sub CalcValuesNow ()
.
.
.
ReDim Matrix1 (19, 29)
End Sub
这里的 ReDim 语句给 Matrix 分配一个 20 × 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:
ReDim Matrix1 (X, Y)
注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。
保留动态数组的内容
每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。
在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:
ReDim Preserve DynArray (UBound (DynArray) + 1)
在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:
ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)
而不可这样编程:
ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)
参考资料:http://www.programfan.com/club/showbbs.asp?id=165998
动态数组的用法:
组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。
动态数组就可以在任何时候改变大小。在 Visual Basic 中,动态数组最灵活、最方便,有助于有效管理内存。例如,可短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。
如果不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。
要创建动态数组,请按照以下步骤执行:
(如果希望数组为公用数组,则)用 Public 语句声明数组,或者,(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。
Dim DynArray ()
用 ReDim 语句分配实际的元素个数。
ReDim DynArray (X + 1)
ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。
ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。
ReDim DynArray (4 to 12)
例如,用第一次声明在模块级所建立的动态数组 Matrix1:
Dim Matrix1 () As Integer
然后,在过程中给数组分配空间:
Sub CalcValuesNow ()
.
.
.
ReDim Matrix1 (19, 29)
End Sub
这里的 ReDim 语句给 Matrix 分配一个 20 × 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:
ReDim Matrix1 (X, Y)
注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。
保留动态数组的内容
每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。
在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:
ReDim Preserve DynArray (UBound (DynArray) + 1)
在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:
ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)
而不可这样编程:
ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)
参考资料:http://www.programfan.com/club/showbbs.asp?id=165998
展开全部
要建立某窗体级的变量,只需在此窗体顶端dim变量即可,如果需要建立工程级别的全局变量,需要建一个标准模块,然后在模块里public变量。
别外:
用窗口或者控件来记录值。
比如建了Global窗口,在上面添加控件。变量往里加。可以一个变量一个控件,或者用listbox
别外:
用窗口或者控件来记录值。
比如建了Global窗口,在上面添加控件。变量往里加。可以一个变量一个控件,或者用listbox
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
能再说的具体点么,从我现在的理解来看你应该从“工程”——》“添加模块”然后在模块中定义,如果我的解答不对,那么请你说的具体点~比如你要实现的功能,或者部分代码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
此函数应该没有错误,在WinXP sp2 + VB6 sp6下测试通过
Private Sub Command1_Click()
Dim pp() As String
Dim i As Integer
pp = ReadFile("d:\a.txt")
For i = 1 To UBound(pp)
MsgBox pp(i)
Next
End Sub
怪事儿了,我已经把以上代码放在Load里面用生成的EXE文件试过了,没有问题,你可以用我的代码试一下,如果仍有问题的话,可能是你的VB或是系统有问题了,把sp6的补丁打上,另外最好检查一下有没有在LOAD里面操作数组或是Grid之类的。从前也遇到过VB这类的错误,在调试时期看不到问题,只有运行的时候才可以出现,当时无法解决,你可以重装系统或VB试下。
Private Sub Command1_Click()
Dim pp() As String
Dim i As Integer
pp = ReadFile("d:\a.txt")
For i = 1 To UBound(pp)
MsgBox pp(i)
Next
End Sub
怪事儿了,我已经把以上代码放在Load里面用生成的EXE文件试过了,没有问题,你可以用我的代码试一下,如果仍有问题的话,可能是你的VB或是系统有问题了,把sp6的补丁打上,另外最好检查一下有没有在LOAD里面操作数组或是Grid之类的。从前也遇到过VB这类的错误,在调试时期看不到问题,只有运行的时候才可以出现,当时无法解决,你可以重装系统或VB试下。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询