我正在调用一个用户定义的函数,并传递一个点表示法的参数。例如,
of_testingnullarg( tab_2.tabpage_comp_info.dw_webcomp_info.object.dormant[i] )
上述函数纯粹是为了证明这个问题。它接受一个长参数,并使用isNull()和messagebox()告诉用户该参数是否为null。以下是它的列表:
// of_testingnullarg( al_arg1 )
// strictly an experiment
if isNull(al_arg1) then
messageBox("al_arg1", "is null inside of_testingNullArg")
else
messageBox("al_arg1", "is NOT null inside of_testingNullArg, it is "+string(al_arg1))
end if
当休眠[i](指第一个函数调用)控件包含一个数字时,没有问题——_testingnullarg内部的参数将包含与预期相同的数字。但是当休眠[i]控件从数据库中读取null时,我发现_testingnullarg中的参数不为null。它包含一个数字,例如16。传入了Null(根据isNull()),但_testingnullarg中的参数包含一个数字。它不是一个随机数,它是一致的,但似乎取决于函数接受的参数数量。
当我在Powerbuilder IDE中运行程序时,这个问题不会显露出来。(我正在运行Powerbuilder 12.5)只有当我构建程序并运行可执行文件时,它才会出现。
我发现,如果我第一次这样做,问题就会消失:
long ll_dormant
ll_dormant = tab_2.tabpage_comp_info.dw_webcomp_info.object.dormant[i]
of_testingnullarg( ll_dormant )
总之,当3件事是真的时,问题就会出现:
- 我没有通过Powerbuilder IDE运行程序
- 我的参数是用点表示法(不在变量内)
- 控件中的值为null
我认为这一定与调用堆栈上的指针有关。它必须关闭2个字节或其他什么。总是先将值放入变量中,这是常识吗?
我发现点表示法返回类型"ANY"。当值为NULL(无类型)时,这是一个问题。PowerBuilder正试图将NULL Any值隐式转换为NULL Long,结果弄糊涂了。解决方案是帮助PowerBuilder在函数调用中使用BEFORE类型(这就是为什么首先将其放入变量中有效的原因)。这些也起作用:
of_testingnullarg( LONG(tab_2.tabpage_comp_info.dw_webcomp_info.object.dormant[i]) )
或
of_testingnullarg( tab_2.tabpage_comp_info.dw_webcomp_info.GetItemNumber(i, "dormant") )