Shape.DropManyU 方法 (Visio)

在页面、主控形状或组中创建一个或多个新的 Shape 对象。 该方法返回它生成的 Shape 对象的 ID 的数组。

语法

expression. DropManyU( _ObjectsToInstance()_ , _xyArray()_ , _IDArray()_ )

表达 一个代表 Shape 对象的变量。

参数

名称 必需/可选 数据类型 说明
ObjectsToInstance () 必需 Variant 标识根据其通用名称从中创建形状的主控形状或其他对象。
xyArray () 必需 Double 交替 的 xy 值的数组,指定新形状的位置。
IDArray () 必需 Integer out 参数。 一个返回所创建形状的 ID 的数组。

返回值

整数

备注

使用 DropManyU 方法与使用 PageMasterShape 对象的 Drop 方法类似,不同之处在于您可以使用 DropManyU 方法同时创建许多新的 Shape 对象,而不是每次方法调用时只创建一个对象。 DropManyU 方法在页面、主控形状或应用它的组合形状(在下面的讨论中将此形状称为“目标对象”)中创建新的 Shape 对象。

通过将 Master 对象、主控形状索引或主控形状名称传递给 DropManyU 方法,可以标识要放置的主控形状。 传递对象时,DropManyU 并不仅仅放置目标文档的文档模具中的主控形状,目标文档指将在其中放置主控形状的文档。 该对象可以是另一个文档中的主控形状,也可以是其他类型的对象。

将整数(主控形状索引)或字符串(主控形状名称)传递给 DropManyU 比传递对象的速度快,但整数或字符串仅可以在用来放置主控形状的文档的文档模具中标识这些主控形状。 因此,如果文档模具中还没有主控形状,您的程序必须首先设法将所涉及的主控形状放置到文档模具中。

ObjectsToInstance () 应是 n>= 1 个变体的一维数组。 其条目标识要从中生成新 Shape 对象的对象。 条目通常引用 Microsoft Visio 应用程序 Master 对象。 它还可能引用 Visio 应用程序 Shape 对象、 Selection 对象,甚至是其他应用程序中的对象。 应用程序不关心 ObjectsToInstance () 条目的下限和上限数组边界。 分别调用这些 vlbvub

  • 如果 ObjectsToInstance (i) 为整数 j ,则创建目标对象文档的文档模具中 Master 对象的实例,其从 1 开始的索引为 j 。 不触发新建形状的“Events”内容中的 EventDrop 单元格。 如果要触发 EventDrop 单元格,请改用 Drop 方法。

  • 如果 ObjectsToInstance (i) 是字符串 s (或对字符串 s ) 的引用,则会创建一个在目标对象文档的文档模具中名为 Master 对象的实例;可以等于 Master 对象的 UniqueIDNameU 属性。 不触发新建形状的“Events”内容中的 EventDrop 单元格。 如果要触发 EventDrop 单元格,请改用 Drop 方法。

  • 对于 vlb<i<= vub ,如果 ObjectsToInstance (i) 为空 (Nothing 或未在 Microsoft Visual Basic) 中初始化,则条目 i 将导致 ObjectsToInstance (j) 再次实例化,其中 j 是最大值 <i ,因此 ObjectsToInstance (j) 不为空。 如果要生成同一对象的 n 个实例,只需提供 ObjectsToInstance(vlb)

xyArray () 参数应是一个一维数组,其中包含 2 m 双精度值,具有下限 xylb 和上限 xyub ,其中 m>= n。 数组中的值指示 DropManyU 方法将它生成的 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 个实例,可以传递一个具有一个条目和一个 m 条目 xyArray () 数组的 ObjectsToInstance () 数组。

如果被实例化的实体是一个主控形状,则将新的 Shape 对象的旋转中心点放置在给定的 xy 位置。 否则,将 Shape 对象的中心放置在给定的 xy 位置。

DropManyU 方法返回的 Integer 值是 DropManyU 方法成功处理的 xyArray() 中的 xy 项的数目。 如果所有项都已成功处理,则返回 m。 如果在发生错误之前成功处理了某些条目,则不会删除生成的 Shape 对象,这会引发异常,但仍返回一个正整数。

假设所有的 mxy 项都经过了正确处理,则由 DropManyU 方法生成的新的 Shape 对象数通常等于 m。 在极少数情况下(例如,如果 Selection 对象得到实例化),将生成 m 个以上的 Shape 对象。 通过比较执行 DropManyU 方法前后目标对象中的形状数,调用方可以确定生成的 Shape 对象数。 调用方可以认为新的 Shape 对象是目标对象的 Shapes 集合中索引最高的对象。

如果 DropManyU 方法返回零 (0) , 则 IDArray () 返回 null (Nothing) 。 否则,它将返回索引为 0 到 m - 1 的 m 整数的一维数组。 IDArray () 是由 DropManyU 方法分配的 out 参数,并且所有权将传递给调用 DropManyU 方法的程序。 最后,调用方应对返回的数组执行 SafeArrayDestroy 过程。 (Microsoft Visual Basic 和 Microsoft Visual Basic for Applications 自动执行此操作。

如果 IDArray () 返回非 null (不是 Nothing) ,则 IDArray ( i - 1) ,1 <= i<= intReturned ,则返回由 i 'th xyArray () 条目生成的 Shape 对象的 ID,前提是 i 'th xyArray () 条目只生成了一个 Shape 对象。 如果 i 'th xyArray () 条目生成了多个 Shape 对象,则会在条目中返回 -1。 所有条目 iintReturned<= i<m ,返回 -1。

注意

从 Microsoft Visio 2000 开始,您可以使用本地名称和通用名称来引用 Visio 形状、主控形状、文档、页面、行、加载项、单元格、超链接、样式、字体、主控形状快捷方式、UI 对象和图层。 例如,当用户命名形状时,用户将指定一个本地名称。 从 Microsoft Office Visio 2003 开始,ShapeSheet 电子表格在单元格公式和值中只显示通用名称。 (在以前的版本中,通用名称在用户界面中不可见。

) 作为开发人员,如果您不希望每次本地化解决方案时都更改名称,可以在程序中使用通用名称。 当使用本地名称标识形状时,使用 DropMany 方法来放置多个形状。 当使用通用名称标识形状时,使用 DropManyU 方法来放置多个形状。

示例

以下示例显示如何使用 DropManyU 方法。 该示例在宏的 Document 对象的第一页上,放置宏的 Document 对象的文档模具中每个主控形状的实例。 运行此宏之前,请确保文档模具中至少有一个主控形状。

 
Public Sub DropManyU_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 universal name of object to drop to DropManyU. 
 varObjectsToInstance(intCounter) = vsoMasters.ItemU(intCounter).NameU 
 
 '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).DropManyU(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 支持和反馈,获取有关如何接收支持和提供反馈的指南。