2012-08-16 4 views
1

$once{property}과 같은 클래스에서 다음과 같은 기본 배치를 사용하려고하면 다음과 같은 오류가 나타납니다.Open Laszlo 5.0.x에서 기본 배치가 올바르게 작동하지 않습니다.

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에 샘플 코드를 넣었습니다. 이 코드는 OL 3.3에서는 제대로 작동하지만 4.9와 5.0에서는 제대로 작동하지 않습니다. 왜 작동하지 않는지에 대한 아이디어는 도움이 될 것입니다.

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

OpenLaszlo 포럼과 Stackoverflow에서 질문 할 때 OpenLaszlo 포럼에 업로드 된 ZIP 파일 대신 Gist https://gist.github.com/의 형태로 코드를 추가하는 것이 좋습니다. 등록 된 포럼 사용자 만 ZIP 파일을 다운로드 할 수 있습니다. –

+0

@ r.bitter : 그렇게하겠습니다. 고맙습니다.. – karthick

답변

1

코드에 두 가지 문제점이 있습니다. 첫째, defaultplacement 속성의 doublequote 구문 : 오픈 라즐로의 최신 버전으로 필요하지 않은 오래된 구문입니다

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

. 다른 문제는 $ 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는 20 픽셀의 인세 트가있는 blackbox 클래스/태그를 자식으로 사용합니다. redbox의 defaultplacement는 blackbox 인스턴스를 나타내며 blackbox의 defaultplacement는 'blackinner'라는 이름의 blackbox의 녹색 하위보기를 참조합니다.

그러면 코드가 파란색보기 (40x40 픽셀)를 내용으로하는 redbox의 인스턴스를 만듭니다. 이 응용 프로그램의 스크린 샷에서 볼 수 있듯이 파란보기는 블랙 박스의 그린뷰 내에 자동으로 정확하게 배치됩니다. 논의 된 변경 한 경우

Screenshot of example application with defaultplacement working

응용 프로그램의 원래 코드는 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 년 동안 잘 유지되지 않았습니다.