Any

From Apache OpenOffice Wiki
Jump to: navigation, search



OpenOffice.org API 经常使用 any 类型,此类型是与其他环境能够识别的 Variant 类型相对应的类型。any 类型具有任意一个 UNO 类型的属性。any 类型尤其常用于一般 UNO 接口。


在以下一些常用方法的方法参数和返回值中就会用到 any:

接口 返回 any 类型 接受 any 类型
XPropertySet any getPropertyValue(string propertyName) void setPropertyValue(any value)
XNameContainer any getByName(string name) void replaceByName(string name, any element) void insertByName(string name, any element)
XIndexContainer any getByIndex(long index) void replaceByIndex(long index, any element) void insertByIndex(long index, any element)
XEnumeration any nextElement() -


而且,any 类型还出现在 com.sun.star.beans.PropertyValue 结构中。

PropertyValue


struct 有两个成员变量(NameValue),并且在 PropertyValue 结构集中普遍存在。在这些结构集中每个 PropertyValue 都是一个按名称和值来说明属性的“名称-值”对。如果需要设置此 PropertyValue 结构的值,则必须指定一个 any 类型,而且如果是从 PropertyValue 中读取,必 须能够解释所含有的 any。如何实现取决于使用的语言。


在 Java 中,any 类型映射到 java.lang.Object,但还存在一个特殊的 Java 类 com.sun.star.uno.Any ,它主要在普可 Object 不太明确时使用。有两个简单的经验规则需要遵守:


传入 any 值时,请始终传入 java.lang.Object 或 Java UNO 对象。


例如,如果使用 setPropertyValue() 设置在目标对象中具有无接口类型的属性,则必须传入新值的 java.lang.Object。如果新值是 Java 中的原始类型,则使用此原始类型相应的 Object 类型:

  xCellProps.setPropertyValue("CharWeight", new Double(200.0));


另一个示例是要用于 loadComponentFromURLPropertyValue 结构:

  com.sun.star.beans.PropertyValue aProperty = new com.sun.star.beans.PropertyValue();
  aProperty.Name = "ReadOnly";
  aProperty.Value = Boolean.TRUE;


收到一个 any 实例时,始终要使用 com.sun.star.uno.AnyConverter 来获取它的值。


需要注意一下 AnyConverter。例如,如果要获得含有原始 Java 类型的属性,必须注意 getPropertyValue() 返回的是含有原始类型(包在 any 值中)的 java.lang.Objectcom.sun.star.uno.AnyConverter 是此类对象的转换器。实际上它所能做的不仅仅是转换,您可以在 Java UNO 引用中找到它的规范。以下列表汇总了 AnyConverter 中的转换函数:

  static java.lang.Object toArray(java.lang.Object object)
  static boolean toBoolean(java.lang.Object object) 
  static byte toByte(java.lang.Object object) 
  static char toChar(java.lang.Object object) 
  static double toDouble(java.lang.Object object) 
  static float toFloat(java.lang.Object object) 
  static int toInt(java.lang.Object object) 
  static long toLong(java.lang.Object object) 
  static java.lang.Object toObject(Class clazz, java.lang.Object object) 
  static java.lang.Object toObject(Type type, java.lang.Object object) 
  static short toShort(java.lang.Object object) 
  static java.lang.String toString(java.lang.Object object) 
  static Type toType(java.lang.Object object)
  static int toUnsignedInt(java.lang.Object object)
  static long toUnsignedLong(java.lang.Object object)
  static short toUnsignedShort(java.lang.Object object)

其用法非常简单:

  import com.sun.star.uno.AnyConverter;
  long cellColor = AnyConverter.toLong(xCellProps.getPropertyValue("CharColor"));


为了方便起见,对于接口类型,您可以直接使用 UnoRuntime.queryInterface(),而无需先调用 AnyConverter.getObject()


  import com.sun.star.uno.AnyConverter;import com.sun.star.uno.UnoRuntime;
  Object ranges = xSpreadsheet.getPropertyValue("NamedRanges");
  XNamedRanges ranges1 = (XNamedRanges) UnoRuntime.queryInterface(
      XNamedRanges.class, AnyConverter.toObject(XNamedRanges.class, r));
  XNamedRanges ranges2 = (XNamedRanges) UnoRuntime.queryInterface(   XNamedRanges.class, r);


在 OpenOffice.org Basic 中,any 类型变为 Variant:

  '{OpenOffice.org Basic
  Dim cellColor as Variant
  cellColor = oCellProps.CharColor


In C++, there are special operators for the any type: 在 C++ 中,有一些特定的运算符用于 any 类型:

  //C++ has >>= and <<= for Any (the pointed brackets are always left)
  sal_Int32 cellColor;
  Any any;
  any = rCellProps->getPropertyValue(OUString::createFromAscii( "CharColor" ));
  // extract the value from any
  any >>= cellColor;
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages