mkweaver 发表于 2007-5-24 10:35:55

这门课怎么了???

我正在编写一个应用程序来收集块的属性 我有一个名为AttInf的简单类(见下文) 在一个表单模块中,我有一个过程来查找插入,并将每个属性添加到另一个类实例中,该实例只不过是AttInf实例的集合(请参阅下面的类属性)
I期'm在Attributes类中使用Add方法 循环遍历属性的例程工作正常,每次都用正确的参数调用attributes类的Add方法 然而,当我进入Add方法时,atts集合中的每个attinf都具有作为Add方法的参数发送的attinf的属性 我不知道'我不知道这是怎么发生的,也不知道该怎么解决这个问题
非常感谢您的建议
迈克·韦弗Option Explicit
Public TagString As String
Public Value As String
Public Handle As String
'Simple enough?
调用过程For Each objTarget In objPSpace
    If objTarget.ObjectName = "AcDbBlockReference" Then
    If (objTarget.Name = InsertName) And (objTarget.HasAttributes = True) Then
      
      Dim Atts As Variant
      Atts = objTarget.GetAttributes
      Dim i As Integer
      For i = LBound(Atts) To UBound(Atts)
          Set ThisAtt = Atts(i)
          attThis.TagString = ThisAtt.TagString
          attThis.Value = ThisAtt.TextString
          attThis.Handle = ThisAtt.Handle
          Attribs.Add attThis '<<<<<<<<<<<<<<<---------------------<<<This is where I'm having the problem
      Next i
      GetAttributeInfo.PathName = PathName
      GetAttributeInfo.Attribs = Attribs
      Exit Function
      End If
    End If
Next objTarget 类属性Option Explicit
Private Atts As collection
Private Sub Class_Initialize()
Set Atts = New collection
End Sub
Private Sub Class_Terminate()
Set Atts = Nothing
End Sub
...
Public Sub Add(AttNew As AttInf)
Dim i As Integer
For i = 1 To Atts.Count
    If Atts.Item(i).TagString = AttNew.TagString And Atts.Item(i).Handle = AttNew.Handle Then
    Atts.Item(i).Value = AttNew.Value
    Else
    Atts.Add AttNew
    Exit Sub
    End If
Next i
Atts.Add AttNew
End Sub

mkweaver 发表于 2007-5-24 11:25:41

这可能会有帮助……    If objOldBlk.HasAttributes Then
            varOldAtt = objOldBlk.GetAttributes   'get old block attributes
            End If
            For intOldCnt = LBound(varOldAtt) To UBound(varOldAtt)
            Set objOldAttRef = varOldAtt(intOldCnt)
            Next intOldCnt
…...................................
   Set objNewBlk = ThisDrawing.ModelSpace.InsertBlock(InsertPt, NewBlkName, xScale, yScale, zScale, Rot) 'insert new tblock
      
   varNewAtt = objNewBlk.GetAttributes 'get attributes
   For intOldCnt = LBound(varOldAtt) To UBound(varOldAtt)
       For intNewCnt = LBound(varNewAtt) To UBound(varNewAtt)
            If varNewAtt(intNewCnt).TagString = varOldAtt(intOldCnt).TagString Then
                varNewAtt(intNewCnt).TextString = varOldAtt(intOldCnt).TextString
            End If
      Next
   Next
这从旧标题栏中获取属性值,替换块,然后替换属性值。。

mkweaver 发表于 2007-5-24 16:35:56

在一位同事的帮助下,我发现了以下几点&nbsp;调用Attributes类的add方法的例程在循环外实例化,然后每次通过循环进行修改,为其提供当前属性的值&nbsp;我的add方法是获取这个AttInf实例并将其添加到我的集合中&nbsp;问题是,它每次都会向相同的AttInf添加一个引用,该引用在循环中每次都会更改&nbsp;因此,我的收藏只是对同一观点的引用的集合&nbsp;嗯
我现在可以解决我的问题了
迈克·韦弗
页: [1]
查看完整版本: 这门课怎么了???