1

このようなクラスでこのようなデフォルトの配置を使用しようとすると$once{property}、次のエラーが発生します。

Exception in thread "main" org.openlaszlo.sc.parser.TokenMgrError: Lexical error at line 25, column 249.  Encountered: "@" (64), after : ""
     [exec]     at org.openlaszlo.sc.parser.ParserTokenManager.getNextToken(ParserTokenManager.java:2565)
     [exec]     at org.openlaszlo.sc.parser.Parser.jj_scan_token(Parser.java:10271)
     [exec]     at org.openlaszlo.sc.parser.Parser.jj_3_5(Parser.java:8325)
     [exec]     at org.openlaszlo.sc.parser.Parser.jj_2_5(Parser.java:7224)
     [exec]     at org.openlaszlo.sc.parser.Parser.CallExpression(Parser.java:1312)
     [exec]     at org.openlaszlo.sc.parser.Parser.PostfixExpression(Parser.java:1521)

このURLにサンプルコードを配置しました。コードはOL3.3では正常に機能しますが、4.9および5.0では機能しません。なぜそれが機能しないのかについてのアイデアは役に立ちます。

http://forum.openlaszlo.org/showthread.php?p=48740#post48740
4

1 に答える 1

1

コードには2つの問題があります。まず、defaultplacement属性の二重引用符の構文:

<attribute name="defaultplacement" value="'insideview'"/>

これは古い構文であり、最近のバージョンのOpenLaszloでは必要ありません。もう1つの問題は、$ 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ピクセルのはめ込みがある、緑色の子ビューを備えた単なるブラックボックスです。

レッドボックスは、20ピクセルの挿入で、子としてブラックボックスクラス/タグを使用します。レッドボックスのdefaultplacementは、ブラックボックスインスタンスを参照し、ブラックボックスのdefaultplacementは、「blackinner」という名前のブラックボックスの緑色の子ビューを参照します。

次に、コードは、コンテンツとして青いビュー(40x40ピクセル)を使用して、redboxのインスタンスを作成します。このアプリケーションのスクリーンショットでわかるように、青いビューはブラックボックスの緑のビュー内に自動的に正しく配置されます。

defaultplacementが機能しているサンプルアプリケーションのスクリーンショット

アプリケーションの元のコード(簡略化のためにすべてのクラスをキャンバスファイルに入れました)は、説明されている変更が行われると、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コンパイラーは、そのような場合を除いて絶対に終了するべきではありませんが、残念ながら、コンパイラーは過去2年間それほどうまく維持されていません。

于 2012-08-16T14:28:52.823 に答える