奇怪的问题:类成员间互相倾轧?

Leaveye 2005-01-18 05:37:18
.
类中定义了一个类型:
Private Type StrTblItem
KeyID As Long
Caption As String
Position(1 To 3) As String
End Type

已有许多类成员,其中的两个分别是:
Private mvarA As Boolean '第一个非 Const 成员
...
Private mvarItem() As StrTblItem
...

Class_Initialize 中将 mvarA 置为 False。

在另一个方法中,有这样一行语句:
ReDim mvarItem(1 To 1) As StrTblItem

跟踪程序执行的过程中发现:
在 ReDim 执行之前,本为 False 的成员 mvarA ,执行了 ReDim 语句,就变成了 True 。

难道成员变量不可以是这种定长数组?必须用对象容器吗?

另外,若将 StrTblItem 类型推出为对象类型,那么,不是额外增加了消耗吗?而且,与其相对应的对象如何定义呢?
...全文
147 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leaveye 2005-03-13
  • 打赏
  • 举报
回复
忘记揭帖了。抱歉。

to homezj(小吉):
没那样用。这种现象很奇怪吧。我还遇到个很奇怪的问题来着。
http://community.csdn.net/Expert/topic/3843/3843924.xml
homezj 2005-01-21
  • 打赏
  • 举报
回复
与监视有关?
你的监视是怎么写的?Bool值很容易弄反的。
比如:监视表达式:mvarA=False
那么当mvarA为True时,显示值为False
当mvarA为False时,显示值为True
Leaveye 2005-01-20
  • 打赏
  • 举报
回复
经过再三测试,发现是 VB 的 Watch 窗口相关的问题。举一个例子,对于问题出现的代码:
没有开 Watch 窗口的时候,怎么都不出这个问题。
开了 Watch 窗口,监视对象时,能列出一些本为私有的对象和变量,其相应公有属性并无显示。并且,在监视 mvarA 之前,值均为正确(在立即窗口查看),一监视 mvarA 变量,值马上就出错,也许这是 VB6 + SP6 的 BUG 吧。
linkinwork 2005-01-19
  • 打赏
  • 举报
回复
照你说的试了一下,mvarA的值并没有改变呀!应该和redim无关。
Leaveye 2005-01-19
  • 打赏
  • 举报
回复
没人能帮忙分析一下吗?。。
qiqi5521 2005-01-19
  • 打赏
  • 举报
回复
Public Sub MethodA()
ReDim mvarItem(1 To 1) As StrTblItem

Debug.Print mvarA
End Sub

我测试过,在我的机器上没有问题。

因为我现在正因为一个和你这个问题类似的东西搞得晕头转向,所以对你这个帖子比较感兴趣。
我碰到的也是一个神出鬼没的Bug,至今我也没能找出真正原因,初步判断是和浮点数和对象嵌套有关系,但是神奇的是在98、XP下根本没问题,一到2000下就出现这个bug。在其他电脑上运行的时候,有极个别的电脑会出现这个问题。

我的观点是这样:

在各种系统各种机器上测试,如果是大部分正常运行,极个别出现问题,可以判定不是代码的问题,而是系统兼容性问题,那就是微软的问题了。

如果在各种系统各种机器上都出现这个问题,那么肯定是代码写的有问题。
Leaveye 2005-01-19
  • 打赏
  • 举报
回复
对于不同的实例会有不同的效果,但产生这种效果的直接原因确定无疑地是 ReDim 语句。我还是搞不清楚这到底是什么原因。
Leaveye 2005-01-18
  • 打赏
  • 举报
回复
跟踪 + 监视了许多遍,确定是 ReDim 改变的。相信我陈述得够清楚了。
问题就在他俩本身没任何关系,ReDim 却改变了 mvarA 。
这个对象是运行时该类的第一个实例。

另外,对于 UDT ,我了解得不多,特地搜索了一下,找到的却不是 SQL 的就是 .NET 的,没有关于 VB 的。

多谢指点。仍然需要继续分析。
ryuginka 2005-01-18
  • 打赏
  • 举报
回复
up
homezj 2005-01-18
  • 打赏
  • 举报
回复
“难道成员变量不可以是这种定长数组?必须用对象容器吗?”
1、StrTblItem不是定长的用户自定义类型,2、类成员可以用UDT。

“在 ReDim 执行之前,本为 False 的成员 mvarA ,执行了 ReDim 语句,就变成了 True 。”
1、看不出mvarA会与ReDim有什么关系;
2、在redim前后各加一句Debug.print mvarA,看看是不是真的是在Redim时发生变化的;
3、怀疑Class没有正常Terminate,就又被引用,而mvarA在上次加载后被修改过。
注:可在VB IDE中添加监视,看看mvarA是在何时被修改的。
Leaveye 2005-01-18
  • 打赏
  • 举报
回复
跟踪程序确实出现了这样的问题了啊
myhgyp 2005-01-18
  • 打赏
  • 举报
回复
怎么可能,肯定是代码上的问题

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧