今天又莫名其妙调过一处。
话说我声明了一个annatree的动态数组。annatree类里有个treeview类的成员变量。我想给这个动态数组中的其中一棵树下加个节点,然后给这个节点的tag赋值。
- Dim objOhterSameATree() As AnnaTree
- Set objOhterNode = objOhterSameATree(i).tree.Nodes.Add(Relative:=m_tree.SelectedItem.Key, Relationship:=tvwChild, Text:=objNewNode.Text, Image:=2)
- objOtherNode.Tag = “”
像上面这样写,F8到最后一行的时候,就会报错,“对象或with块变量未设置”。而其实监视窗口显示objOtherNode是正常的,它的tag也能看到。可是一旦直接监视objOtherNode.Tag,就是,“对象或with块变量未设置”。后来我改成这样却对了:
- Dim objOhterSameATree() As AnnaTree
- Dim treOtherSame As MSComctlLib.TreeView
- Set treOtherSame = objOhterSameATree(i).tree
- Set objOtherNode = treOtherSame.Nodes.Add(Relative:=m_tree.SelectedItem.Key, Relationship:=tvwChild, Text:=objNewNode.Text, Image:=2)
- objOtherNode.Tag = “”
只是,把数组里的树请出来,然后倒一下手就没错了。我在想,估计VB也有它的BUG,像我这种符合逻辑却不符合常情的别扭的超级用法,估计他们的测试员也想不到去测试,SO,我就只好自己吞下这苦果了……类似的,我还遇到一次。看下面:
- strParentKey = m_tree.Nodes.Item(objNode.Key).Parent.Key
运行到上面这行,会说对象或with块变量未赋值;最后改成
- Set objRelatedNode = m_tree.Nodes.Item(objNode.Key)
- strParentKey = objRelatedNode.Parent.Key
就通过了。感觉也许是太长的引用引起了编译的歧义。
小结:太长的引用最后借助一个中间变量周转一下,要不VBA可能会无法正常理解……