您的代码中有两个问题。一、defaultplacement属性的双引号语法:
<attribute name="defaultplacement" value="'insideview'"/>
这是一种旧语法,最新版本的 OpenLaszlo 不需要这种语法。另一个问题是 $once{} 约束的使用,它甚至不需要 - 并且导致编译器异常。
<attribute name="defaultplacement" value="$once{test.defaultplacement}"/>
但是让我用一个简单的代码示例来澄清我的意思:
<canvas>
<class name="blackbox" extends="view">
<attribute name="bgcolor" value="black"/>
<attribute name="defaultplacement" value="blackinner"/>
<view name="blackinner" bgcolor="green"
x="10" y="10" width="${parent.width-20}" height="${parent.height-20}">
</view>
</class>
<class name="redbox" extends="view">
<attribute name="bgcolor" value="red"/>
<attribute name="defaultplacement" value="content"/>
<blackbox name="content"
x="10" y="10" width="${parent.width-20}" height="${parent.height-20}">
</blackbox>
</class>
<redbox x="10" y="10" width="200" height="200">
<view width="40" height="40" bgcolor="blue" />
</redbox>
</canvas>
这个示例应用程序定义了一个黑盒类和一个红盒类。黑盒只是一个带有绿色子视图的黑盒,它有一个 10 像素的插图。
redbox 使用 blackbox 类/标签作为子级,插入 20 像素。redbox 的 defaultplacement 是指 blackbox 实例,而 blackbox 的 defaultplacement 是指名为“blackinner”的 blackbox 的绿色子视图。
然后代码创建一个 redbox 的实例,以蓝色视图(40x40 像素)作为内容。正如您在此应用程序的屏幕截图中所见,蓝色视图自动正确放置在黑盒的绿色视图内。
当进行讨论的更改时,您的应用程序的原始代码(我已将所有类放入画布文件以进行简化)在 5.0(主干)中编译没有任何问题:
<canvas>
<class name="myframe" extends="view">
<attribute name="bgcolor" value="red"/>
<attribute name="defaultplacement" value="insideview"/>
<view x="5" y="5" width="${parent.width-10}" name='insideview'
height="${parent.height-10}"
bgcolor="#FFFFCC"/>
</class>
<class name="answerMain" extends="view">
<attribute name="defaultplacement" value="test"/>
<myframe name="test" width="220" height="20" />
</class>
<answerMain>
<text> HI </text>
</answerMain>
</canvas>
在这种情况下,OpenLaszlo 编译器绝对不应该以异常退出,但不幸的是,过去两年中编译器的维护并不好。