• PB语言实现反射机制


    PowerReflect

    PowerReflect是一个实现PB语言反射功能的PBNI项目。使用这个项目便能够在运行时获取PB中类的信息、类的属性和方法,动态修改对象的属性,动态调用对象的方法。

    1、项目构成

    本项目包含的类及相应功能说明如下:

    类名功能
    PBReflector反射器,用于访问项目的库、类、函数、对象等信息
    PBLibrary库对象,用于访问PBL或PBD内部的类和方法
    PBClass类对象,用于访问类的信息、类的属性和方法
    PBField属性对象,用于访问类的属性或全局变量、共享变量
    PBMethod方法对象,用于访问类的方法或全局函数、系统函数
    PBEnum枚举对象,用于访问内置的枚举类型信息

    2、项目依赖

    本项目无依赖,只需在PB10及以上项目中导入PowerReflect.dll即可使用。

    3、功能概要

    3.1 PBReflector

    PBReflector为反射器,主要实现以下功能:

    1. 获取项目的PBL或指定的PBL
    2. 获取类、函数、全局变量、枚举类型
    3. 获取对象的类、内嵌对象、属性、方法、事件

    PBReflector的方法列表及说明如下:

    方法名参数列表说明
    get_librariesref PBLibrary[]获取当前项目的所有库
    get_librarystring按名称获取库
    get_classstring按名称获取类
    get_functionstring按名称获取全局函数
    get_system_functionstring按名称获取系统函数
    get_system_functionstring, string按名称和签名获取系统函数
    get_global_varsref PBField[]获取当前项目所有全局变量
    get_global_varstring按名称获取全局变量
    get_enumstring按名称获取枚举对象
    get_classPowerObject获取对象的类
    is_instancePowerObject, PBClass判断是对象是否是类的实例
    get_nested_objectsPowerObject, ref PowerObject[]获取对象的所有内嵌对象
    get_nested_objectPowerObject, string按名称获取对象的内嵌对象
    get_fieldsref PowerObject, ref PBField[]获取对象的所有属性
    get_fieldref PowerObject, string按名称获取对象的属性
    get_methodsPowerObject, ref PBMethod[]获取对象的所有方法
    get_methodsPowerObject, string, PBMethod[]按名称获取对象的方法
    get_methodPowerObject, string按名称获取对象的一个方法
    get_methodPowerObject, string, string按名称和签名获取对象的方法
    get_methodPowerObject, string, string[]按名称和参数列表获取对象的方法
    get_eventsPowerObject, PBMethod[]获取对象的所有事件
    get_eventPowerObject, string按名称获取对象的事件

    3.2 PBLibrary

    PBLibrary为描述PBL或PBD的类,主要实现以下功能:

    1. 获取该PBL或PBD下所有的UserObject、Structure、Window、Menu类
    2. 获取该PBL或PBD下所有的全局函数

    PBLibrary的方法列表及说明如下:

    方法名参数列表说明
    get_name获取库的名称
    get_userobjectsref PBClass[]获取当前库内的所有UserObjects
    get_structuresref PBClass[]获取当前库内的所有结构体
    get_functionsref PBMethod[]获取当前库内的所有全局函数
    get_windowsref PBClass[]获取当前库内的所有窗口
    get_menusref PBClass[]获取当前库内的所有菜单

    3.3 PBClass

    PBClass为描述PB中类的类,主要实现以下功能:

    1. 获取该类的基本信息
    2. 获取该类的超类、内嵌类、属性、方法、事件、共享变量

    PBClass的方法列表及说明如下:

    方法名参数列表说明
    get_name获取类的名称
    equals判定类是否相等
    get_superclass获取超类
    is_superclass_ofPBClass判定是否为超类
    is_subclass_ofPBClass判定是否为子类
    is_structure判定是否为结构体
    is_visual_type判定是否为可视类
    is_nested_class判定是否为内嵌类
    create_object创建对象
    get_nested_class_count获取内嵌类数量
    get_nested_classesref PBClass[]获取所有内嵌类
    get_nested_classesstring, ref PBClass[]按名称获取内嵌类列表
    get_nested_classstring按名称获取内嵌类
    get_parent_class获取容器类
    get_field_count获取属性数量
    get_fieldsref PBField[]获取所有属性
    get_fieldstring按名称获取属性
    get_method_count获取方法数量
    get_methodsref PBMethod[]获取所有方法
    get_methodsstring, ref PBMethod[]按名称获取方法列表
    get_methodstring按名称获取方法
    get_methodstring, string按名称和签名获取方法
    get_methodstring, string[]按名称和参数列表获取方法
    get_event_count获取事件数量
    get_eventsref PBMethod[]获取所有事件
    get_eventstring按名称获取事件
    get_shared_var_count获取共享变量数量
    get_shared_varsref PBField[]获取所有共享变量
    get_shared_varstring按名称获取共享变量

    3.4 PBField

    PBField为描述PB中属性(包括全局变量、实例变量、共享变量)的类,主要实现以下功能:

    1. 获取该属性的基本信息
    2. 获取和修改属性的值

    PBField的方法列表及说明如下:

    方法名参数列表说明
    get_name获取属性名称
    get_read_access获取读权限
    get_write_access获取写权限
    get_kind获取属性类型
    is_null判定属性是否为空值
    is_array判定属性是否为数组
    get_category获取属性类型分类
    get_class获取属性类型
    get_type获取属性系统类型名称
    set_objectPowerObject为类属性设置对象
    get_value获取属性的值
    set_valueany设置属性的值
    set_null设置属性为空值
    update_valueany更新可视属性的值

    3.5 PBMethod

    PBMethod为描述PB中方法(包括全局函数、系统函数、类的方法和事件)的类,主要实现以下功能:

    1. 获取该方法的基本信息
    2. 获取该方法的参数和返回值信息
    3. 调用该方法

    PBMethod的方法列表及说明如下:

    方法名参数列表说明
    get_name获取方法名称
    get_access获取调用权限
    get_kind获取方法分类
    get_arg_count获取参数数量
    has_list_arg判定是否有列表参数
    get_arg_nameint获取参数名
    get_arg_idstring获取参数位置
    is_arg_nullint判定参数是否为控制
    is_arg_arrayint判定参数是否为数组
    get_arg_categoryint获取参数类型分类
    get_arg_conventionint获取参数传递方式
    get_arg_classint获取参数类型
    get_arg_typeint获取参数系统类型名称
    has_return_value判定是否有返回值
    get_return_category获取返回值类型分类
    get_return_class获取返回值类型
    get_return_type获取返回值系统类型名称
    set_objectPowerObject为方法或事件设置对象
    get_arg_valueint获取参数值
    invoke无参调用方法
    invokeany, …传参调用方法
    invoke_with_args_arrayref any[]使用数组参数调用方法
    invoke_with_args_objectref PowerObject使用对象参数调用方法

    3.6 PBEnum

    PBEnum为描述PB内置枚举类型的类,主要实现以下功能:

    1. 获取该枚举类型的基本信息
    2. 获取枚举项的值或名称

    PBEnum的方法列表及说明如下:

    方法名参数列表说明
    get_name获取枚举名称
    get_item_count获取可枚举数量
    get_item_namelong获取枚举项目名称
    get_item_valuestring获取枚举项目值

    4、快速入门

    4.1 获取PBL中所有UserObject的名称

    下面的例子在运行时读取 demo1.pbl 中所有UserObject的名称

    pbreflector reflector
    pblibrary pbl
    pbclass uo[]
    string uo_name[]
    long ll_count, i
    
    reflector = create pbreflector
    pbl = reflector.get_library('demo1.pbl')
    ll_count = pbl.get_userobjects(uo)
    for i = 1 to ll_count
    	uo_name[i] = uo[i].get_name()
    next
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.2 动态获取和修改全局变量的值

    gs_test 为string类型的全局变量,程序通过变量名动态到获取这个全局变量的值,并修改它的值

    pbreflector reflector
    pbfield gvar
    string ls_test
    
    gs_test = 'abcd'
    
    reflector = create pbreflector
    gvar = reflector.get_global_var('gs_test')
    ls_test = gvar.get_value()
    gvar.set_value('1234')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.3 动态调用全局函数

    f_sum为自定义全局函数,传入两个int值,返回两数之和,程序动态获取到这个函数并传参调用

    pbreflector reflector
    pbmethod gfun
    int li_result
    
    reflector = create pbreflector
    gfun = reflector.get_function('f_sum')
    li_result = gfun.invoke(3, 5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.4 根据类名获取这个类所有属性和方法的名称

    n_demo01为自定义类,下面的例子获取到这个类的所有属性和方法,并获取这些属性和方法的名称

    pbreflector reflector
    pbclass cls
    pbfield fields[]
    pbmethod methods[]
    long ll_field_count, ll_method_count, i
    string ls_field_names[], ls_method_names[]
    
    reflector = create pbreflector
    cls = reflector.get_class('n_demo01')
    
    ll_field_count = cls.get_fields(fields)
    for i = 1 to ll_field_count
    	ls_field_names[i] = fields[i].get_name()
    next
    
    ll_method_count = cls.get_methods(methods)
    for i = 1 to ll_method_count
    	ls_method_names[i] = methods[i].get_name()
    next
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4.5 动态获取并修改对象的属性值

    下面的例子获取到 demo01 这个对象的属性 var1,并获取和修改属性的值

    pbreflector reflector
    pbfield field
    n_demo01 demo01
    string ls
    
    demo01 = create n_demo01
    demo01.var1 = 'abcdefg'
    reflector = create pbreflector
    field = reflector.get_field(demo01, 'var1')
    ls = field.get_value()
    field.set_value('hijklmn')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.6 动态获取并调用对象的方法

    n_demo01 的 test_sum 方法接收两个int入参,返回两数之和。下面的例子动态获取到这个方法并传参调用。

    pbreflector reflector
    pbmethod method
    n_demo01 demo01
    int li_result
    
    demo01 = create n_demo01
    reflector = create pbreflector
    method = reflector.get_method(demo01, 'test_sum')
    li_result = method.invoke(3, 5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5、详细使用说明

    后文中所有代码,均省略以下内容:

    pbreflector reflector
    reflector = create pbreflector
    
    • 1
    • 2

    5.1 PBReflector

    5.1.1 get_libraries

    获取当前运行项目的所有库对象(PBL或PBD)。

    long get_libraries(ref PBLibrary libraries[])
    
    • 1
    参数与返回值类型描述
    librariesref PBLibrary[]当前项目的库对象数组
    返回值long获取到的库对象数量

    下面的例子获取当前运行项目的所有PBL对象:

    pblibrary pbls[]
    reflector.get_libraries(pbls)
    
    • 1
    • 2

    5.1.2 get_library

    按文件名获取指定的库对象。

    PBLibrary get_library(string library_name)
    
    • 1
    参数与返回值类型描述
    library_namestring指定PBL或PBD的文件名
    返回值PBLibrary获取到的库对象

    下面的例子获取到名称为 demo01.pbl 的PBL对象:

    pblibrary pbl_demo01
    pbl_demo01 = reflector.get_library('demo01.pbl')
    
    • 1
    • 2

    5.1.3 get_class

    按类名获取类对象。

    PBClass get_class(string class_name)
    
    • 1
    参数与返回值类型描述
    class_namestring要获取的类的名称
    返回值PBClass获取到的类对象,
    如果类不存在,返回null

    下面的例子获取到名称为 n_demo01 的类对象:

    pbclass cls_demo01
    cls_demo01 = reflector.get_class('n_demo01')
    
    • 1
    • 2

    5.1.4 get_function

    按函数名获取全局函数对象。

    PBMethod get_function(string function_name)
    
    • 1
    参数与返回值类型描述
    function_namestring要获取的全局函数的名称
    返回值PBMethod获取到的全局函数对象,
    如果全局函数不存在,返回null

    下面的例子获取到名称为 f_demo01 的全局函数对象:

    pbmethod m_f_demo01
    m_f_demo01 = reflector.get_function('f_demo01')
    
    • 1
    • 2

    5.1.5 get_system_function

    按函数名获取系统函数对象。

    PBMethod get_system_function(string function_name, {string signature})
    
    • 1
    参数与返回值类型描述
    function_namestring要获取的系统函数的名称
    signature(可选)string要获取的系统函数的参数描述
    返回值PBMethod获取到的系统函数对象,
    如果系统函数不存在,返回null

    下面的例子获取到名称为 messagebox,且参数为 (string, string) 的系统函数对象:

    pbmethod m_messagebox
    m_messagebox = reflector.get_system_function('messagebox', 'string, string')
    
    • 1
    • 2

    5.1.6 get_global_vars

    获取当前项目的所有全局变量对象。

    long get_global_vars(ref PBField vars[])
    
    • 1
    参数与返回值类型描述
    varsref PBField[]获取到的所有全局变量对象数组
    返回值long获取到的全局变量数量

    下面的例子获取到项目所有的全局变量对象:

    pbfield gvars[]
    reflector.get_global_vars(gvars)
    
    • 1
    • 2

    5.1.7 get_global_var

    按变量名获取全局变量对象。

    PBField get_global_var(string var_name)
    
    • 1
    参数与返回值类型描述
    var_namestring全局变量名
    返回值PBField获取到的全局变量对象,
    如果全局变量不存在,返回null

    下面的例子获取到名称为 gs_demo01 的全局变量对象:

    pbfield gvar_s_demo01
    gvar_s_demo01 = reflector.get_global_var('gs_demo01')
    
    • 1
    • 2

    5.1.8 get_enum

    按名称获取PB内置的枚举类型对象。

    PBEnum get_enum(string enum_name)
    
    • 1
    参数与返回值类型描述
    enum_namestring枚举类型名称
    返回值PBEnum获取到的枚举类型对象,
    如果枚举类型不存在,返回null

    下面的例子获取到名称为 icon 的枚举类型对象:

    pbenum enum_icon
    enum_icon = reflector.get_enum('icon')
    
    • 1
    • 2

    5.1.9 get_class

    获取传入对象的类对象。

    PBClass get_class(PowerObject po)
    
    • 1
    参数与返回值类型描述
    poPowerObject任意对象
    返回值PBClass传入对象的类对象

    下面的例子获取当前按钮对象的类对象:

    pbclass cls_cb
    cls_cb = reflector.get_class(this)
    
    • 1
    • 2

    5.1.10 is_instance

    判定对象是否是类的实例。

    boolean is_instance(powerobject po, PBClass c)
    
    • 1
    参数与返回值类型描述
    poPowerObject任意对象
    cPBClass类对象
    返回值boolean传入对象是否为类的实例

    下面的例子判定当前按钮是否是 commandbutton 的实例:

    boolean b
    pbclass cls_cb
    cls_cb = reflector.get_class('commandbutton')
    b = reflector.is_instance(this, cls_cb)
    
    • 1
    • 2
    • 3
    • 4

    5.1.11 get_nested_objects

    获取对象的所有内嵌对象。

    long get_nested_objects(powerobject po, ref powerobject objects[])
    
    • 1
    参数与返回值类型描述
    poPowerObject任意对象
    objectsref PowerObject[]内嵌对象数组
    返回值long内嵌对象的数量

    下面的例子获取当前窗口的所有内嵌对象:

    powerobject nested_objects[]
    reflector.get_nested_objects(parent, nested_objects)
    
    • 1
    • 2

    5.1.12 get_nested_object

    按名称获取对象指定的内嵌对象。

    powerobject get_nested_object(powerobject po, string object_name)
    
    • 1
    参数与返回值类型描述
    poPowerObject任意对象
    object_namestring内嵌对象的名称
    返回值PowerObject获取到的内嵌对象,
    若内嵌对象不存在,返回null

    下面的例子获取当前窗口中名称为 cb_demo 的内嵌对象:

    powerobject nested_object
    nested_object = reflector.get_nested_object(parent, 'cb_demo')
    
    • 1
    • 2

    5.1.13 get_fields

    获取对象的所有实例属性对象。

    long get_fields(ref powerobject po, ref PBField fields[])
    
    • 1
    参数与返回值类型描述
    poref PowerObject任意对象
    fieldsref PBField[]获取到的属性对象
    返回值long获取到属性对象的数量

    下面的例子创建了 n_demo 类的实例,并获取这个实例的所有属性对象:

    pbfield fields[]
    n_demo d
    d = create n_demo
    reflector.get_fields(d, fields)
    
    • 1
    • 2
    • 3
    • 4

    5.1.14 get_field

    按名称获取对象的实例属性对象。

    PBField get_field(ref powerobject po, string field_name)
    
    • 1
    参数与返回值类型描述
    poref PowerObject任意对象
    field_namestring实例属性名称
    返回值PBField获取到的实例属性,
    若属性不存在,返回null

    下面的例子创建了 n_demo 类的实例,并获取这个实例中名称为 is_demo 的属性对象:

    pbfield field_demo
    n_demo d
    d = create n_demo
    field_demo = reflector.get_field(d, 'is_demo')
    
    • 1
    • 2
    • 3
    • 4

    5.1.15 get_methods

    获取对象的所有方法对象。

    long get_methods(powerobject po, {string method_name}, ref PBMethod methods[])
    
    • 1
    参数与返回值类型描述
    poref PowerObject任意对象
    method_name(可选)string方法名称
    methodsref PBMethod[]获取到的方法对象数组
    返回值long获取到的方法对象数量

    下面的例子获取当前窗口的所有方法对象:

    pbmethod methods[]
    reflector.get_methods(parent, methods)
    
    • 1
    • 2

    5.1.16 get_method

    获取对象中指定的方法对象。

    PBMethod get_method(powerobject po, string method_name, {string signature})
    PBMethod get_method(powerobject po, string method_name, {string argument_list[]})
    
    • 1
    • 2
    参数与返回值类型描述
    poref PowerObject任意对象
    method_namestring方法名称
    signature(可选)string方法参数描述
    argument_list(可选)string[]方法参数描述数组
    返回值PBMethod获取到的符合条件的方法,
    若无符合条件的方法,返回null

    下面的例子获取当前窗口名称为 wf_demo ,参数列表为 (string, int) 的方法:

    pbmethod method_demo
    method_demo = reflector.get_method(parent, 'wf_demo', 'string, int')
    
    • 1
    • 2

    5.1.17 get_events

    获取对象的所有事件对象。

    long get_events(powerobject po, ref PBMethod events[])
    
    • 1
    参数与返回值类型描述
    poref PowerObject任意对象
    eventsref PBMethod[]获取到的事件对象数组
    返回值long获取到的事件对象数量

    下面的例子获取当前窗口的所有事件对象:

    pbmethod events[]
    reflector.get_events(parent, events)
    
    • 1
    • 2

    5.1.18 get_event

    按事件名称获取对象的事件对象。

    PBMethod get_event(powerobject po, string event_name)
    
    • 1
    参数与返回值类型描述
    poref PowerObject任意对象
    event_namestring事件名称
    返回值PBMethod获取到的事件对象,
    若事件不存在,返回null

    下面的例子获取当前窗口的 open 事件对象:

    pbmethod event_open
    event_open = reflector.get_event(parent, 'open')
    
    • 1
    • 2

    5.2 PBLibrary

    本节中所有代码,均省略以下获取 demo.pbl 库对象的内容:

    pblibrary pbl_demo
    pbl_demo = reflector.get_library('demo.pbl')
    
    • 1
    • 2

    5.2.1 get_name

    获取当前库对象的名称。

    string get_name()
    
    • 1
    参数与返回值类型描述
    返回值string当前库对象的名称

    下面的例子获取当前库对象的名称:

    string name
    name = pbl_demo.get_name()
    
    • 1
    • 2

    5.2.2 get_userobjects

    获取当前库对象中所有UserObject的类对象。

    long get_userobjects(ref PBClass classes[])
    
    • 1
    参数与返回值类型描述
    classesref PBClass[]获取到的UserObject类对象数组
    返回值long获取到的UserObject数量

    下面的例子获取 demo.pbl 中所有的UserObject类对象:

    pbclass cls_uo[]
    pbl_demo.get_userobjects(cls_uo)
    
    • 1
    • 2

    5.2.3 get_structures

    获取当前库对象中所有Structure的类对象。

    long get_structures(ref PBClass structures[])
    
    • 1
    参数与返回值类型描述
    structuresref PBClass[]获取到的Structure类对象数组
    返回值long获取到的Structure数量

    下面的例子获取 demo.pbl 中所有的Structure类对象:

    pbclass cls_st[]
    pbl_demo.get_structures(cls_st)
    
    • 1
    • 2

    5.2.4 get_functions

    获取当前库对象中所有全局函数对象。

    long get_functions(ref PBMethod methods[])
    
    • 1
    参数与返回值类型描述
    methodsref PBMethod[]获取到的全局函数对象数组
    返回值long获取到的全局函数数量

    下面的例子获取 demo.pbl 中所有的全局函数对象:

    PBMethod m_gf[]
    pbl_demo.get_functions(m_gf)
    
    • 1
    • 2

    5.2.5 get_windows

    获取当前库对象中所有Window的类对象。

    long get_windows(ref PBClass windows[])
    
    • 1
    参数与返回值类型描述
    windowsref PBClass[]获取到的Window类对象数组
    返回值long获取到的Window数量

    下面的例子获取 demo.pbl 中所有的Window类对象:

    PBClass cls_window[]
    pbl_demo.get_windows(cls_window)
    
    • 1
    • 2

    5.2.6 get_menus

    获取当前库对象中所有Menu的类对象。

    long get_menus(ref PBClass menus[])
    
    • 1
    参数与返回值类型描述
    menusref PBClass[]获取到的Menu类对象数组
    返回值long获取到的Menu数量

    下面的例子获取 demo.pbl 中所有的Menu类对象:

    PBClass cls_menu[]
    pbl_demo.get_menus(cls_menu)
    
    • 1
    • 2

    5.3 PBClass

    本节中所有代码,均省略以下获取 n_demo 类对象的内容:

    pbclass cls_demo
    cls_demo = reflector.get_class('n_demo')
    
    • 1
    • 2

    5.3.1 get_name

    获取当前类的名称。

    string get_name()
    
    • 1
    参数与返回值类型描述
    返回值string当前类的名称

    下面的例子获取当前类的名称:

    string name
    name = cls_demo.get_name()
    
    • 1
    • 2

    5.3.2 equals

    判定类是否一致。

    boolean equals(PBClass cls)
    
    • 1
    参数与返回值类型描述
    clsPBClass需要比较的类
    返回值string当前类与传入的类是否一致

    下面的例子判断当前类是否是 n_demo :

    boolean b
    b = cls_demo.equals(reflector.get_class('n_demo'))
    
    • 1
    • 2

    5.3.3 get_superclass

    获取当前类的超类。

    PBClass get_superclass()
    
    • 1
    参数与返回值类型描述
    返回值PBClass当前类的超类,
    若超类不存在,返回null

    下面的例子获取当前类的超类:

    PBClass cls_super
    cls_super = cls_demo.get_superclass()
    
    • 1
    • 2

    5.3.4 is_superclass_of

    判断当前类是否为传入类的超类。

    boolean is_superclass_of(PBClass cls)
    
    • 1
    参数与返回值类型描述
    clsPBClass任意类对象
    返回值boolean当前类是否为传入类的超类

    下面的例子判断当前类是否为 n_demo01 的超类:

    boolean b
    b = cls_demo.is_superclass_of(reflector.get_class('n_demo01'))
    
    • 1
    • 2

    5.3.5 is_subclass_of

    判断当前类是否为传入类的子类。

    boolean is_subclass_of(PBClass cls)
    
    • 1
    参数与返回值类型描述
    clsPBClass任意类对象
    返回值boolean当前类是否为传入类的子类

    下面的例子判断当前类是否为 n_demo01 的子类:

    boolean b
    b = cls_demo.is_subclass_of(reflector.get_class('n_demo01'))
    
    • 1
    • 2

    5.3.6 is_structure

    判断当前类是否为Structure。

    boolean is_structure()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前类是否为Structure

    下面的例子判断当前类是否为Structure:

    boolean b
    b = cls_demo.is_structure()
    
    • 1
    • 2

    5.3.7 is_visual_type

    判断当前类是否为可视类型。

    boolean is_visual_type()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前类是否为可视类型

    下面的例子判断当前类是否为可视类型:

    boolean b
    b = cls_demo.is_visual_type()
    
    • 1
    • 2

    5.3.8 is_nested_class

    判断当前类是否为内嵌类型。

    boolean is_nested_class()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前类是否为内嵌类型

    下面的例子判断当前类是否为内嵌类型:

    boolean b
    b = cls_demo.is_nested_class()
    
    • 1
    • 2

    5.3.9 create_object

    创建一个当前类型的实例。

    注:内嵌类型或可视类型无法通过这种方式创建实例

    powerobject create_object()
    
    • 1
    参数与返回值类型描述
    返回值PowerObject创建的实例

    下面的例子为当前类型创造一个实例:

    powerobject obj
    obj = cls_demo.create_object()
    
    • 1
    • 2

    5.3.10 get_nested_class_count

    获取当前类型的内嵌类数量。

    long get_nested_class_count()
    
    • 1
    参数与返回值类型描述
    返回值long内嵌类数量

    下面的例子获取当前类型内嵌类的数量:

    long count
    count = cls_demo.get_nested_class_count()
    
    • 1
    • 2

    5.3.11 get_nested_classes

    获取当前类型的所有内嵌类。

    long get_nested_classes({string class_name}, ref PBClass classes[])
    
    • 1
    参数与返回值类型描述
    class_namestring内嵌类名称
    classesref PBClass[]获取到的内嵌类数组
    返回值long获取到的内嵌类数量

    下面的例子获取当前类型的所有内嵌类:

    pbclass nested_cls[]
    cls_demo.get_nested_classes(nested_cls)
    
    • 1
    • 2

    5.3.12 get_nested_class

    按名称获取当前类型的内嵌类。

    PBClass get_nested_class(string class_name)
    
    • 1
    参数与返回值类型描述
    class_namestring内嵌类的名称
    返回值PBClass获取到的内嵌类,
    若内嵌类不存在,返回null

    下面的例子获取当前类型中名称为 n_demo_inner 的内嵌类:

    pbclass cls_inner
    cls_inner = cls_demo.get_nested_class('n_demo_inner')
    
    • 1
    • 2

    5.3.13 get_parent_class

    获取当前内嵌类外部的容器类。

    PBClass get_parent_class()
    
    • 1
    参数与返回值类型描述
    返回值PBClass获取到的外部容器类,
    若当前类不是内嵌类,返回null

    下面的例子获取当前内嵌类外部的容器类:

    pbclass cls_parent
    cls_parent = cls_demo.get_parent_class()
    
    • 1
    • 2

    5.3.14 get_field_count

    获取当前类型实例属性的数量。

    long get_field_count()
    
    • 1
    参数与返回值类型描述
    返回值long当前类型实例属性的数量

    下面的例子获取当前类型实例属性的数量:

    long count
    count = cls_demo.get_field_count()
    
    • 1
    • 2

    5.3.15 get_fields

    获取当前类型的所有实例属性。

    long get_fields(ref PBField fields[])
    
    • 1
    参数与返回值类型描述
    fieldsref PBField[]当前类型的所有实例属性
    返回值long当前类型实例属性的数量

    下面的例子获取当前类型的所有实例属性:

    pbfield fields[]
    cls_demo.get_fields(fields)
    
    • 1
    • 2

    5.3.16 get_field

    按属性名称获取当前类型的实例属性。

    PBField get_field(string field_name)
    
    • 1
    参数与返回值类型描述
    field_namestring属性名称
    返回值PBField获取到的实例属性对象,
    若属性不存在,返回null

    下面的例子获取当前类型中名称为 is_demo 的实例属性:

    pbfield field_demo
    field_demo = cls_demo.get_field('is_demo')
    
    • 1
    • 2

    5.3.17 get_method_count

    获取当前类型的方法数量。

    long get_method_count()
    
    • 1
    参数与返回值类型描述
    返回值long当前类型的方法数量

    下面的例子获取当前类型的方法数量:

    long count
    count = cls_demo.get_method_count()
    
    • 1
    • 2

    5.3.18 get_methods

    获取当前类型的所有方法。

    long get_methods({string method_name}, ref PBMethod methods[])
    
    • 1
    参数与返回值类型描述
    method_name(可选)string方法名称
    methodsref PBMethod[]获取到的当前类型的所有方法
    返回值long获取到的方法数量

    下面的例子获取当前类型的所有名称为 of_demo 的方法:

    pbmethod methods_demo[]
    cls_demo.get_methods('of_demo', methods_demo)
    
    • 1
    • 2

    5.3.19 get_method

    获取当前类符合条件的方法。

    PBMethod get_method(string method_name, {string signature})
    PBMethod get_method(string method_name, {string argument_list[]})
    
    • 1
    • 2
    参数与返回值类型描述
    method_namestring方法名称
    signature(可选)string参数列表
    argument_list(可选)string[]参数列表数组
    返回值PBMethod获取到的方法对象,
    若方法不存在,返回null

    下面的例子获取当前类型中名称为 of_demo ,并且参数列表为 (long, string) 的方法:

    pbmethod method_demo
    method_demo = cls_demo.get_method('of_demo', 'long, string')
    
    • 1
    • 2

    5.3.20 get_event_count

    获取当前类型的事件数量。

    long get_event_count()
    
    • 1
    参数与返回值类型描述
    返回值long当前类型的事件数量

    下面的例子获取当前类型的事件数量:

    long count
    count = cls_demo.get_event_count()
    
    • 1
    • 2

    5.3.21 get_events

    获取当前类型的所有事件。

    long get_events(ref PBMethod events[])
    
    • 1
    参数与返回值类型描述
    eventsref PBMethod[]当前类型的所有事件
    返回值long当前类型事件的数量

    下面的例子获取当前类型的所有事件:

    PBMethod events[]
    cls_demo.get_events(events)
    
    • 1
    • 2

    5.3.22 get_event

    按事件名称获取当前类型的事件。

    PBMethod get_event(string event_name)
    
    • 1
    参数与返回值类型描述
    event_namestring事件名称
    返回值PBMethod获取到的事件对象,
    若事件不存在,返回null

    下面的例子获取当前类型中名称为 eve_demo 的事件:

    pbmethod method_demo
    method_demo = cls_demo.get_event('eve_demo')
    
    • 1
    • 2

    5.3.23 get_shared_var_count

    获取当前类型的共享属性数量。

    long get_shared_var_count()
    
    • 1
    参数与返回值类型描述
    返回值long当前类型的共享属性数量

    下面的例子获取当前类型的共享属性数量:

    long count
    count = cls_demo.get_shared_var_count()
    
    • 1
    • 2

    5.3.24 get_shared_vars

    获取当前类型的所有共享属性。

    long get_shared_vars(ref PBField vars[])
    
    • 1
    参数与返回值类型描述
    varsref PBField[]当前类型的所有共享属性
    返回值long当前类型共享属性的数量

    下面的例子获取当前类型的所有共享属性:

    PBField shared_vars[]
    cls_demo.get_shared_vars(shared_vars)
    
    • 1
    • 2

    5.3.25 get_shared_var

    按属性名称获取当前类型的共享属性。

    PBField get_shared_var(string var_name)
    
    • 1
    参数与返回值类型描述
    var_namestring共享属性名称
    返回值PBField获取到的共享属性对象,
    若共享属性不存在,返回null

    下面的例子获取当前类型中名称为 ss_demo 的共享属性:

    pbfield shared_var
    shared_var = cls_demo.get_shared_var('ss_demo')
    
    • 1
    • 2

    5.4 PBField

    本节中所有代码,均省略以下获取 n_demo 类中 is_demo 实例属性对象的内容:

    pbclass cls_demo
    pbfield field
    cls_demo = reflector.get_class('n_demo')
    field = cls_demo.get_field('is_demo')
    
    • 1
    • 2
    • 3
    • 4

    5.4.1 get_name

    获取当前属性的名称。

    string get_name()
    
    • 1
    参数与返回值类型描述
    返回值string当前属性的名称

    下面的例子获取当前属性的名称:

    string name
    name = field.get_name()
    
    • 1
    • 2

    5.4.2 get_read_access、get_write_access

    获取当前属性的读、写权限。

    VarAccess get_read_access()
    VarAccess get_write_access()
    
    • 1
    • 2
    参数与返回值类型描述
    返回值VarAccess当前属性的读或写权限

    下面的例子获取当前属性的读和写的权限:

    varaccess read_access, write_access
    read_access = field.get_read_access()
    write_access = field.get_write_access()
    
    • 1
    • 2
    • 3

    5.4.3 get_kind

    获取当前属性的类型(全局变量、实例变量或共享变量)。

    VariableKind get_kind()
    
    • 1
    参数与返回值类型描述
    返回值VariableKind当前属性的类型

    下面的例子获取当前属性的类型:

    variablekind kind
    kind = field.get_kind()
    
    • 1
    • 2

    5.4.4 is_null

    判断当前属性值是否为null。

    注:属性为实例变量时,需要设置具体对象后才能调用该方法

    boolean is_null()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前属性值是否为null

    下面的例子为当前属性设置对象后,判断对象的该属性是否为null:

    n_demo d
    boolean b
    d = create demo
    field.set_object(d)
    b = field.is_null()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.4.5 is_array

    判定当前属性是否定义为数组。

    boolean is_array()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前属性是否定义为数组

    下面的例子判定当前属性是否定义为数组:

    boolean b
    b = field.is_array()
    
    • 1
    • 2

    5.4.6 get_category

    获取当前属性定义类型的分类。

    TypeCategory get_category()
    
    • 1
    参数与返回值类型描述
    返回值TypeCategory当前属性定义类型的分类

    下面的例子获取当前属性定义类型的分类:

    TypeCategory category
    category = field.get_category()
    
    • 1
    • 2

    5.4.7 get_class

    获取当前属性定义的类型。

    PBClass get_class()
    
    • 1
    参数与返回值类型描述
    返回值PBClass当前属性定义的类型,
    若属性定义为基本类型或枚举类型,返回null

    下面的例子获取当前属性定义的类型:

    PBClass cls
    cls = field.get_class()
    
    • 1
    • 2

    5.4.8 get_type

    获取当前属性定义的类型名称。

    string get_type()
    
    • 1
    参数与返回值类型描述
    返回值string当前属性定义的类型名称,
    属性为基本类型或枚举类型时,返回对应的类型名称

    下面的例子获取当前属性定义的类型名称:

    string type_name
    type_name = field.get_type()
    
    • 1
    • 2

    5.4.9 set_object

    为当前属性设置具体实例对象。

    注:只有实例属性能调用该方法设置对象,全局变量和共享变量不能调用该方法

    set_object(ref powerobject po)
    
    • 1
    参数与返回值类型描述
    poref PowerObject实例对象,
    若设置的对象不是属性所属类的实例,将抛出异常

    下面的例子为当前属性设置对象:

    n_demo d
    d = create demo
    field.set_object(d)
    
    • 1
    • 2
    • 3

    5.4.10 get_value

    获取当前属性的值。

    注:实例属性必须先设置对象后才能调用该方法

    any get_value()
    
    • 1
    参数与返回值类型描述
    返回值any当前属性的值

    下面的例子获取当前属性的值并转为string类型:

    string s_value
    s_value = field.get_value()
    
    • 1
    • 2

    5.4.11 set_value

    设置当前属性的值。

    注:实例属性必须先设置对象后才能调用该方法

    set_value(any value)
    
    • 1
    参数与返回值类型描述
    valueany要设置的属性的值,
    若类型不匹配,将抛出异常

    下面的例子将当前属性的值设置为 ‘abcd’ :

    field.set_value('abcd')
    
    • 1

    5.4.12 set_null

    设置当前属性的值为null。

    注:实例属性必须先设置对象后才能调用该方法

    set_null()
    
    • 1

    下面的例子将当前属性的值设置为null:

    field.set_null()
    
    • 1

    5.4.13 update_value

    设置当前属性的值,并刷新显示:

    注:只有可视对象能够影响显示的属性值,才能使用此方法

    update_value(any value)
    
    • 1
    参数与返回值类型描述
    valueany要设置的属性的值,
    若类型不匹配,将抛出异常

    下面的例子将当前窗口上 cb_demo 按钮上的文本改为 ‘abcd’ :

    pbfield field_text
    field_text = reflector.get_field(cb_1, 'text')
    field_text.update_value('abcd')
    
    • 1
    • 2
    • 3

    5.5 PBMethod

    本节中所有代码,均省略以下获取 n_demo 类中 of_demo 方法的内容:

    pbclass cls_demo
    pbmethod method
    cls_demo = reflector.get_class('n_demo')
    method = cls_demo.get_method('of_demo')
    
    • 1
    • 2
    • 3
    • 4

    5.5.1 get_name

    获取当前方法的名称。

    string get_name()
    
    • 1
    参数与返回值类型描述
    返回值string当前方法的名称

    下面的例子获取当前方法的名称:

    string name
    name = method.get_name()
    
    • 1
    • 2

    5.5.2 get_access

    获取当前方法的访问权限。

    VarAccess get_access()
    
    • 1
    参数与返回值类型描述
    返回值VarAccess当前方法的访问权限

    下面的例子获取当前方法的访问权限:

    varaccess access
    access = method.get_access()
    
    • 1
    • 2

    5.5.3 get_kind

    获取当前方法的类型(方法、事件)。

    ScriptKind get_kind()
    
    • 1
    参数与返回值类型描述
    返回值ScriptKind当前方法的类型

    下面的例子获取当前方法的类型:

    scriptkind kind
    kind = method.get_kind()
    
    • 1
    • 2

    5.5.4 get_arg_count

    获取当前方法的参数个数。

    int get_arg_count()
    
    • 1
    参数与返回值类型描述
    返回值int当前方法的参数个数

    下面的例子获取当前方法的参数个数:

    int arg_count
    arg_count = method.get_arg_count()
    
    • 1
    • 2

    5.5.5 has_list_arg

    判定当前方法是否具有列表参数。

    boolean has_list_arg()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前方法是否具有列表参数

    下面的例子判定当前方法是否具有列表参数:

    boolean b
    b = method.has_list_arg()
    
    • 1
    • 2

    5.5.6 get_arg_name

    获取第i个参数名称。

    string get_arg_name(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值string参数名称

    下面的例子获取当前方法第2个参数的名称:

    string name
    name = method.get_arg_name(2)
    
    • 1
    • 2

    5.5.7 get_arg_id

    获取参数的位置。

    int get_arg_id(string name)
    
    • 1
    参数与返回值类型描述
    namestring参数名称
    返回值int参数位置

    下面的例子获取当前方法中参数 ‘as_name’ 的位置:

    int id
    id = method.get_arg_id('as_name')
    
    • 1
    • 2

    5.5.8 is_arg_null

    判定第i个参数是否为null。

    boolean is_arg_null(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值boolean对应参数否为null

    下面的例子判定当前方法第2个参数是否为null:

    boolean b
    b = method.is_arg_null(2)
    
    • 1
    • 2

    5.5.9 is_arg_array

    判定第i个参数是否定义为数组。

    boolean is_arg_array(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值boolean对应参数否定义为数组

    下面的例子判定当前方法第2个参数是否定义为数组:

    boolean b
    b = method.is_arg_array(2)
    
    • 1
    • 2

    5.5.10 get_arg_category

    获取第i个参数定义类型的分类。

    TypeCategory get_arg_category(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值TypeCategory对应参数定义类型的分类

    下面的例子获取当前方法第2个参数定义类型的分类:

    typecategory category
    category = method.get_arg_category(2)
    
    • 1
    • 2

    5.5.11 get_arg_convention

    获取第i个参数的传递方式(value、readonly、reference)。

    ArgCallingConvention get_arg_convention(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值ArgCallingConvention对应参数的传递方式

    下面的例子获取当前方法第2个参数的传递方式:

    argcallingconvention convention
    convention = method.get_arg_convention(2)
    
    • 1
    • 2

    5.5.12 get_arg_class

    获取第i个参数定义的类型。

    PBClass get_arg_class(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值PBClass对应参数定义的类型,
    若为基本类型或枚举类型,返回null

    下面的例子获取当前方法第2个参数定义的类型:

    pbclass cls
    cls = method.get_arg_class(2)
    
    • 1
    • 2

    5.5.13 get_arg_type

    获取第i个参数类型名称。

    string get_arg_type(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值string对应参数类型名称

    下面的例子获取当前方法第2个参数类型名称:

    string type_name
    type_name = method.get_arg_type(2)
    
    • 1
    • 2

    5.5.14 has_return_value

    判定当前方法是否有返回值。

    boolean has_return_value()
    
    • 1
    参数与返回值类型描述
    返回值boolean当前方法是否有返回值

    下面的例子判定当前方法是否有返回值:

    boolean b
    b = method.has_return_value()
    
    • 1
    • 2

    5.5.15 get_return_category

    获取当前方法返回值的分类。

    TypeCategory get_return_category()
    
    • 1
    参数与返回值类型描述
    返回值TypeCategory返回值的分类,
    若无返回值,返回null

    下面的例子获取当前方法返回值的分类:

    typecategory category
    category = method.get_return_category()
    
    • 1
    • 2

    5.5.16 get_return_class

    获取当前方法返回值定义的类型。

    PBClass get_return_class()
    
    • 1
    参数与返回值类型描述
    返回值PBClass返回值定义的类型,
    若无返回值,返回null
    若为基本类型或枚举类型,返回null

    下面的例子获取当前方法返回值定义的类型:

    pbclass cls
    cls = method.get_return_class()
    
    • 1
    • 2

    5.5.17 get_return_type

    获取返回值类型名称。

    string get_return_type()
    
    • 1
    参数与返回值类型描述
    返回值string返回值类型名称,
    若无返回值,返回null

    下面的例子获取当前方法返回值类型名称:

    string type_name
    type_name = method.get_return_type()
    
    • 1
    • 2

    5.5.18 set_object

    为当前方法或事件设置对象。

    注:对象方法和事件可调用该方法,全局函数和系统函数不能调用该方法

    set_object(ref powerobject po)
    
    • 1
    参数与返回值类型描述
    poref PowerObject要设置的对象,
    若对象不是方法所属类的实例,将抛出异常

    下面的例子为当前方法设置了一个对象:

    n_demo d
    d = create n_demo
    method.set_object(d)
    
    • 1
    • 2
    • 3

    5.5.19 get_arg_value

    获取第i个参数的值。

    注:包含ref参数的方法调用后,可使用该方法取参数值

    any get_arg_value(int i)
    
    • 1
    参数与返回值类型描述
    iint参数位置,从1开始计算
    返回值any参数的值

    下面的例子获取第2个参数的值并转为string类型:

    string s_value
    s_value = method.get_arg_value(2)
    
    • 1
    • 2

    5.5.20 invoke

    调用方法。

    any invoke()
    any invoke(any v, ...)
    
    • 1
    • 2
    参数与返回值类型描述
    v(可选,列表参数any调用方法的参数值
    返回值any调用方法的返回值

    下面的例子传参调用当前方法,并将返回值转为string类型:

    string result
    result = method.invoke('Nova', 42)
    
    • 1
    • 2

    5.5.21 invoke_with_args_array

    传入数组参数调用方法。

    注:若方法中包含ref参数,调用完成后参数值将更新到入参数组

    any invoke_with_args_array(ref any value[])
    
    • 1
    参数与返回值类型描述
    valueref any[]调用方法的参数数组
    返回值any调用方法的返回值

    下面的例子传入数组参数调用当前方法,并将返回值转为string类型:

    any args[]
    string result
    args[1] = 'Nova'
    args[2] = 42
    result = method.invoke_with_args_array(args)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.5.22 invoke_with_args_object

    传入对象参数调用方法。

    注:若方法中包含ref参数,调用完成后参数值将更新到入参对象

    any invoke_with_args_object(ref powerobject po)
    
    • 1
    参数与返回值类型描述
    poref PowerObject调用方法的参数对象
    返回值any调用方法的返回值

    下面的例子中,person为Structure类型,传入person对象参数调用当前方法,并将返回值转为string类型:

    person p
    string result
    p.name = 'Nova'
    p.age = 42
    result = method.invoke_with_args_object(p)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.6 PBEnum

    本节中所有代码,均省略以下获取枚举类型 icon 的内容:

    pbenum enum_icon
    enum_icon = reflector.get_enum('icon')
    
    • 1
    • 2

    5.6.1 get_name

    获取当前枚举类型的名称。

    string get_name()
    
    • 1
    参数与返回值类型描述
    返回值string当前枚举类型的名称

    下面的例子获取当前枚举类型的名称:

    string name
    name = enum_icon.get_name()
    
    • 1
    • 2

    5.6.2 get_item_count

    获取当前枚举类型的枚举项数量。

    long get_item_count()
    
    • 1
    参数与返回值类型描述
    返回值long当前枚举类型的枚举项数量

    下面的例子获取当前枚举类型的枚举项数量:

    long count
    count = enum_icon.get_item_count()
    
    • 1
    • 2

    5.6.3 get_item_name

    获取对应枚举项的名称。

    string get_item_name(long item_value)
    
    • 1
    参数与返回值类型描述
    item_valuelong枚举项的值
    返回值string对应枚举项的名称,
    若枚举项不存在,返回null

    下面的例子获取当前枚举类型中值为1的枚举项的名称:

    string item_name
    item_name = enum_icon.get_item_name(1)
    
    • 1
    • 2

    5.6.4 get_item_value

    获取对应枚举项的值。

    long get_item_value(string item_name)
    
    • 1
    参数与返回值类型描述
    item_namestring枚举项的名称
    返回值long对应枚举项的值,
    若枚举项不存在,返回-1

    下面的例子获取当前枚举类型中名称为 stopsign 的枚举项的值:

    long item_value
    item_value = enum_icon.get_item_value('stopsign')
    
    • 1
    • 2

    6、关于作者

    WX、TEL:18649713925
    QQ:768310524

  • 相关阅读:
    ESP32_esp-adf环境搭建
    【AI视野·今日Robot 机器人论文速览 第六十二期】Wed, 25 Oct 2023
    线性表(顺序表和链表)
    ardupilot开发 --- Custom Attitude Controller 篇
    数据增强:Simple Questions Generate Named Entity Recognition Datasets
    全球科学家给孩子的stem课【001-046】mp3合集
    Java面试题1
    Mysql基础知识篇(二)
    非范型ArrayList和泛型List<T>
    001——体验鸿蒙(基于I.MAX6ULL)
  • 原文地址:https://blog.csdn.net/JasonFriday/article/details/125529321