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

这个班有什么问题???

我正在编写一个应用程序来从块中收集属性。 我有一个名为AttInf的简单类(见下文)。 在表单模块中,我有一个过程来查找插入,并将每个属性添加到另一个类实例中,该类实例只不过是AttInf实例的集合(请参阅下面的类属性)。
我遇到的问题是属性类中的 Add 方法。 循环遍历属性的例程工作正常,每次都使用正确的参数调用 Attributes 类的 Add 方法。 但是,当我单步执行 Add 方法时,atts 集合中的每个 attinf 都采用作为 add 方法的参数发送的 attinf 的属性。 我不明白这是怎么发生的,也不明白该怎么做才能解决问题。
非常感谢您的建议。
Mike Weaver
Class AttInf
Option Explicit
Public TagString As String
Public Value As String
Public Handle As String
'Simple enough?

Calling Procedure
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
Class Attributes
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

**** Hidden Message *****

Arizona 发表于 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

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