You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LibreOffice中区分内置对象与用户自定义对象?

区分LibreOffice内置对象与用户自定义类对象的方法

要区分LibreOffice中的内置对象与用户类模块定义的对象,可以结合类型名称匹配、通用属性/方法检查以及错误捕获来实现。以下是完善后的IsIntrinsicObject函数及相关说明:

核心思路

  1. 先排除已识别的UNO对象(通过IsUNOObject函数)
  2. 检查对象的类型名称是否属于LibreOffice内置对象的已知列表
  3. 尝试调用内置对象普遍支持的属性(如Name、Parent),若调用成功则判定为内置对象
  4. 结合多重检查降低误判概率

完善后的代码

Function IsIntrinsicObject(ByRef rvarObject As Variant) As Boolean
    Dim objTypeName As String
    Dim blnIsIntrinsic As Boolean
    
    ' 先获取对象的类型名称
    objTypeName = TypeName(rvarObject)
    
    ' 第一步:匹配已知的内置对象类型名称
    Select Case objTypeName
        Case "GlobalScope", "ScriptRuntime", "Dialog", "Control", _
             "Form", "Frame", "Desktop", "Dispatcher"
            blnIsIntrinsic = True
        Case Else
            blnIsIntrinsic = False
    End Select
    
    ' 第二步:如果第一步未匹配,检查通用内置属性
    If Not blnIsIntrinsic Then
        On Error Resume Next
        ' 尝试访问内置对象常见的属性,无错误则判定为内置对象
        Dim dummy As Variant
        dummy = rvarObject.Name
        If Err.Number = 0 Then
            blnIsIntrinsic = True
        Else
            ' 再尝试Parent属性
            Err.Clear
            dummy = rvarObject.Parent
            If Err.Number = 0 Then
                blnIsIntrinsic = True
            End If
        End If
        On Error GoTo 0
    End If
    
    IsIntrinsicObject = blnIsIntrinsic
End Function 'IsIntrinsicObject


' 以下是原代码中其他函数(保持不变,仅作为完整示例)
Function IsUNOObject(ByRef rvarObject As Variant) As Boolean
  Dim varDummy As Variant

  On Error Goto ErrorHandler
    varDummy= rvarObject.Dbg_Properties
    varDummy = rvarObject.Dbg_Methods
    varDummy = rvarObject.queryInterface(0)
    IsUNOObject = True
  On Error Goto 0

Exit Function

ErrorHandler:
  Select Case Err
    Case 423, 438
      Resume Next
    Case 91, Else
      IsUNOObject = False
  End Select
  On Error Goto 0  
End Function


Function ObjectType(ByRef rvarObject As Variant) As String
  Dim strRet As String
  
  If IsUNOObject(rvarObject) Then
    strRet = "Object-UNO"
  Else
    On Error Goto ErrorHandler
      strRet = "Object-" & rvarObject.MyClass
    On Error Goto 0
  End If
  
  ObjectType = strRet

Exit Function

ErrorHandler:
  On Error Goto 0
  If IsIntrinsicObject(rvarObject) Then
    ObjectType = "Object-Intrinsic"
  Else
    ObjectType = "Object-UnknownUserClass"
  End If
End Function


Function TypeNameEx(ByRef rvarVariable As Variant) As String
  Dim lngType As Long
  Dim strRet As String
  
  lngType = VarType(rvarVariable)
  Select Case lngType
    Case 0: strRet = "Empty"
    Case 1: strRet = "Null"
    Case 2: strRet = "Integer"
    Case 3: strRet = "Long"
    Case 4: strRet = "Single"
    Case 5: strRet = "Double"
    Case 6: strRet = "Currency"
    Case 7: strRet = "Date"
    Case 8: strRet = "String"
    Case 9: strRet = ObjectType(rvarVariable)
    Case Else: strRet = "Unknown"
  End Select
  
  TypeNameEx = strRet
End Function

说明

  • 内置对象类型名称列表可以根据LibreOffice的实际对象类型进行扩展,比如添加Spreadsheet、TextDocument等(若需覆盖更多UNO对象,可调整IsUNOObject与本函数的分工)
  • 通用属性检查通过错误捕获实现,多重检查可降低用户类同名属性导致的误判概率
  • 对于无法识别的用户类对象,会返回Object-UnknownUserClass,符合需求场景

内容的提问来源于stack exchange,提问作者SVCooper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:44:51