PowerBuilder:当函数的参数是点表示法并且值为null时,不会收到null



我正在调用一个用户定义的函数,并传递一个点表示法的参数。例如,

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件事是真的时,问题就会出现:

  1. 我没有通过Powerbuilder IDE运行程序
  2. 我的参数是用点表示法(不在变量内)
  3. 控件中的值为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") )

相关内容

  • 没有找到相关文章

最新更新