这个班有什么问题???
我正在编写一个应用程序来从块中收集属性。 我有一个名为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 ***** 这可能有助于…
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
这从旧标题栏中获取属性值,替换块,然后替换属性值。。 在一位同事的帮助下,我发现了以下几点。调用Attributes类的add方法的例程在循环外部实例化,然后每次通过循环进行修改,为其提供当前属性的值。我的add方法是将这个AttInf实例添加到我的集合中。问题在于,它每次都向同一个AttInf添加一个引用,该引用在循环中每次都会更改。因此,我的集合只是对同一个AttInf的引用的集合。嗯<我现在可以解决我的问题了<迈克·韦弗
页:
[1]