Master.DropMany 方法 (Visio)
在母版中创建一个或多个新的 Shape 对象。 该方法返回它生成的 Shape 对象的 ID 的数组。
语法
expression.
DropMany
( _ObjectsToInstance()_
, _xyArray()_
, _IDArray()_
)
表达 一个代表 Master 对象的变量。
参数
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
ObjectsToInstance () | 必需 | Variant | 标识从中创建形状的主控形状或其他对象的数组。 |
xyArray () | 必需 | Double | 一个交替出现 x 和 y 值的数组,该数组指定新建形状的位置。 |
IDArray () | 必需 | Integer | out 参数。 一个返回所创建形状的 ID 的数组。 |
返回值
整数
备注
使用 DropMany 方法与使用 Page、Master 或 Shape 对象的 Drop 方法类似,不同之处在于您可以使用 DropMany 方法一次创建许多新 Shape 对象,而不是每调用一次方法只创建一个对象。 DropMany 方法在页面上、主控形状中或应用它的组合形状(在下面的讨论中称该形状为“目标对象”)中创建新 Shape 对象。
通过将 Master 对象、主控形状的索引或主控形状的名称传递给 DropMany 方法,可以标识要放置哪个主控形状。 传递对象时,DropMany 并不仅仅放置目标文档的文档模具中的主控形状,目标文档指将在其中放置主控形状的文档。 该对象可以是另一个文档中的主控形状,也可以是其他类型的对象。
将整数(主控形状索引)或字符串(主控形状名称)传递给 DropMany 比传递对象速度更快,但整数或字符串仅可以在用来放置主控形状的文档的文档模具中标识这些主控形状。 因此,如果文档模具中还没有主控形状,您的程序必须首先设法将所涉及的主控形状放置到文档模具中。
ObjectsToInstance () 应是 n>= 1 个变体的一维数组。 其条目标识要从中生成新 Shape 对象的对象。 条目通常引用Microsoft Visio 应用程序 Master 对象。 它还可能引用 Visio 应用程序 Shape 对象、 Selection 对象,甚至是其他应用程序中的对象。 应用程序不关心 ObjectsToInstance () 条目的下限和上限数组边界。 分别调用这些 vlb 和 vub 。
如果 ObjectsToInstance(i) 是对提供 IDataObject 接口的 OLE 对象的引用(在 Microsoft Visual Basic for Applications 中,是对选定内容、形状、主控形状、参考线或 OLE 对象的引用),则它正引用的对象将被实例化。 这实质上等效于调用 Drop (ObjectsToInstance (i) ,x,y) 。
如果 ObjectsToInstance (i) 为整数 j ,则创建目标对象文档的文档模具中 Master 对象的实例,其从 1 开始的索引为 j 。 不触发新建形状的“Events”内容中的 EventDrop 单元格。 如果要触发 EventDrop 单元格,请改用 Drop 方法。
如果 ObjectsToInstance (i) 是字符串 s (或对字符串 s ) 的引用,则会创建一个在目标对象文档的文档模具中名为 的Master 对象的实例;可以等于 Master 对象的 UniqueID 或 Name 属性。 不触发新建形状的“Events”内容中的 EventDrop 单元格。 如果要触发 EventDrop 单元格,请改用 Drop 方法。
对于 vlb<i<= vub ,如果 ObjectsToInstance (i) 为空, (Visual Basic) Microsoft中 为 Nothing 或未初始化,则条目 i 将导致 ObjectsToInstance (j) 再次实例化,其中 j 为最大值 <i ,因此 ObjectsToInstance (j) 不为空。 如果要生成同一对象的 n 个实例,只需提供 ObjectsToInstance(vlb)。
xyArray () 参数应该是一维数组,其中包含 2 m 双精度值,下限 xylb 和上限 xyub ,其中 m>= n。 数组中的值指示 DropMany 方法将它生成的 Shape 对象放置在何处。 ObjectsToInstance ( vlb + ( i - 1) ) 在 ( xy [ ( i - 1) 2 + xylb ]、 xy [ (i - 1) 2 + xylb + 1]) 1 <= i<= n 时删除。
请注意,允许 使用 m>n 。 对于 n<i<= m ,实例的 i 与实例的 n 事物相同。 因此,若要使同一事物的 m>= 1 个实例,可以传递一个具有一个条目 的 ObjectsToInstance () 数组,并将一个 m 条目 xyArray () 数组传递。
如果被实例化的实体是一个主控形状,则将新的 Shape 对象的旋转中心点放置在给定的 xy 位置。 否则,将 Shape 对象的中心放置在给定的 xy 位置。
DropMany 方法返回的值是 xyArray() 中 DropMany 方法已成功处理的 xy 项的数目。 如果所有项都已成功处理,则返回 m。 如果在发生错误之前成功处理了某些条目,则不会删除生成的 Shape 对象,这会引发异常,但仍返回正值。
假定正确处理了所有的 m 个 xy 项,则由 DropMany 方法生成的新 Shape 对象的数量通常等于 m。 在极少数情况下(例如,如果 Selection 对象得到实例化),将生成 m 个以上的 Shape 对象。 通过比较执行 DropMany 方法前后目标对象中的形状数量,调用方可以确定生成的 Shape 对象的数量。 调用方可以认为新的 Shape 对象是目标对象的 Shapes 集合中索引最高的对象。
如果 DropMany 方法返回零 (0) , 则 IDArray () 返回 null (Nothing) 。 否则,它将返回从 0 到 m - 1 索引的 m 整数的一维数组。 IDArray () 是由 DropMany 方法分配的 out 参数,并且所有权将传递给调用 DropMany 方法的程序。 最后,调用方应对返回的数组执行 SafeArrayDestroy 过程。 (Microsoft Visual Basic 和 Visual Basic for Applications 自动执行此操作。
如果 IDArray () 返回非 null (不是 Nothing) ,则 IDArray ( i - 1) ,1 <= i<= intReturned ,则返回由 i 'th xyArray () 条目生成的 Shape 对象的 ID,前提是 i'thxyArray () 项生成正好一个 Shape 对象。 如果 i 'th xyArray () 项生成了多个 Shape 对象,则会在条目中返回 -1。 所有条目 i , intReturned<= i<m ,返回 -1。
注意
从 Microsoft Visio 2000 开始,您可以使用本地名称和通用名称来引用 Visio 形状、主控形状、文档、页面、行、加载项、单元格、超链接、样式、字体、主控形状快捷方式、UI 对象和图层。 例如,当用户命名形状时,用户将指定一个本地名称。 从 Microsoft Office Visio 2003 开始,ShapeSheet 电子表格在单元格公式和值中只显示通用名称。 (在以前的版本中,通用名称在用户界面中不可见。
) 作为开发人员,如果您不希望每次本地化解决方案时都更改名称,可以在程序中使用通用名称。 当使用本地名称标识形状时,使用 DropMany 方法来放置多个形状。 当使用通用名称标识形状时,使用 DropManyU 方法来放置多个形状。
示例
以下示例显示如何使用 DropMany 方法。 该示例在宏的 Document 对象的第一页上,放置宏的 Document 对象的文档模具中每个主控形状的实例。 运行此宏之前,请确保文档模具中至少有一个主控形状。
Public Sub DropMany_Example()
On Error GoTo HandleError
Dim vsoMasters As Visio.Masters
Dim intMasterCount As Integer
Set vsoMasters = ThisDocument.Masters
intMasterCount = vsoMasters.Count
ReDim varObjectsToInstance(1 To intMasterCount) As Variant
ReDim adblXYArray(1 To intMasterCount * 2) As Double
Dim intCounter As Integer
For intCounter = 1 To intMasterCount
'Pass name of object to drop to DropMany.
varObjectsToInstance(intCounter) = vsoMasters.Item(intCounter).Name
'Set x components of where to drop to 2,4,6,2,4,6,2,4,6,...
adblXYArray (intCounter * 2 - 1) = (((intCounter - 1) Mod 3) + 1) * 2
'Set y components to 2,2,2,4,4,4,6,6,6,...
adblXYArray (intCounter * 2) = Int((intCounter + 2) / 3) * 2
Next intCounter
Dim aintIDArray() As Integer
Dim intProcessed As Integer
intProcessed = ThisDocument.Pages(1).DropMany(varObjectsToInstance, _
adblXYArray, aintIDArray)
Debug.Print intProcessed
For intCounter = LBound(aintIDArray) To UBound(aintIDArray)
Debug.Print intCounter; aintIDArray(intCounter)
Next intCounter
Exit Sub
HandleError:
MsgBox "Error"
Exit Sub
End Sub
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。