如何在powerbuilder中将对象作为参数传递给函数

时间:2010-11-05 09:15:48

标签: powerbuilder

我正在使用powerbuilder 9 .0.1 Build 7171我想写一个广义的 用于处理字体名称等对象属性的函数。我想改变字体 对象按钮,列表框的想法是我会传递的 窗口名称或窗口句柄和函数将获取控件列表和if control.type是列表框或按钮或图片按钮,它将更改其字体。

我不想为每个窗口编写windows函数 我可以操纵窗口属性的方式

FOR n = 1到UpperBound(Control [])   IF Control [n] .TypeOf()= CommandButton!或者控制[n] .TypeOf()= PictureButton!那么    set_button_name(this.Control [N])   万一 NEXT

在这种情况下,我必须在每个窗口的打开事件中对此代码进行硬编码 通过使用function()

来调用它

1 个答案:

答案 0 :(得分:5)

所以,你真的有两个问题:

  1. 如何获取控件列表(您没有问,但基于代码片段,您可以这样做)
  2. 如何从WindowObject开始并更改与后代相关联的属性
  3. 控件列表

    你有一个隐含的引用窗口的Control数组,这是一个很好的第一步,但可能忽略了像tabs和userobjects这样的对象中的嵌入式控件数组。如下所示的函数(警告:未经测试,仅供说明)将递归所有控件,并处理选项卡中的选项卡等案例。

    function of_getcontrols (windowobject awo_input[], ref windowobject awo_output[]) returns integer
    
    long ll_Input, ll_InputCount, ll_OutputCount, ll_Sub, ll_SubCount
    window lw_Control
    userobject luo_UserObject
    tab ltb_Tab
    windowobject lwo_Empty[], lwo_Sub[]
    
    awo_Output = lwo_Empty
    
    ll_InputCount = UpperBound (awo_Input)
    FOR ll_Input = 1 TO ll_InputCount
        ll_OutputCount ++
        awo_Output[ll_OutputCount] = awo_Input[ll_Input]
    
        // look for nested control arrays
        CHOOSE CASE awo_Input[ll_Input].TypeOf()
            CASE UserObject!
                luo_UserObject = awo_Input[ll_Input]
                ll_SubCount = of_GetControls (luo_UserObject.Control, lwo_Sub)
                FOR ll_Sub = 1 TO ll_SubCount
                    ll_OutputCount ++
                    awo_Output[ll_OutputCount] = lwo_Sub[ll_Sub]
                NEXT
    
            CASE Tab!
                ltb_Tab = awo_Input[ll_Input]
                ll_SubCount = of_GetControls (ltb_Tab.Control, lwo_Sub)
                FOR ll_Sub = 1 TO ll_SubCount
                    ll_OutputCount ++
                    awo_Output[ll_OutputCount] = lwo_Sub[ll_Sub]
                NEXT
        END CHOOSE
    NEXT
    
    RETURN ll_OutputCount
    

    <强>铸造

    下一个问题是如何访问或操作对象的属性,其中编译器不会将该属性的所有权识别为该对象的类型。解决方案是转换为编译器将识别属性关联的类型。您在上面的示例中看到了投射:

    userobject luo_UserObject
    ...
    luo_UserObject = awo_Input[ll_Input]
    ...luo_UserObject.Control...
    

    编译器不会识别WindowObject和我试图引用的Control数组之间的关联,所以我通过将WindowObject分配给UserObject类型的变量来将WindowObject转换为UserObject。之后,我可以通过该变量引用Control数组。

    你会做类似于我的事情,可能在一个循环中做一个CHOOSE CASE TypeOf(),然后在每个CASE内部转换为一个匹配类型并在那里操纵属性的特定变量。

    我猜你希望有一个单行分配选项,但是在PowerScript中没有。 (如果它是你在每个上面调用的函数,你可以使用DYNAMIC关键字调用WindowObject上的函数,但是在你调用函数之前确保函数存在是你的责任。)我相信有一种方法可以直接用PBNI做到这一点,但我无法帮助你,我强烈怀疑它的努力远远超过它的价值。

    祝你好运,

    特里。