我正在使用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()
来调用它答案 0 :(得分:5)
所以,你真的有两个问题:
控件列表
你有一个隐含的引用窗口的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做到这一点,但我无法帮助你,我强烈怀疑它的努力远远超过它的价值。
祝你好运,特里。