<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />이 게시물은 JMP 12 표현식 열을 사용하여 JSL로 작성할 수 있는 예제 애플리케이션입니다.더 많은 JMP 12 게시물 .
이 게시물에는 다음과 같은 .JMP 파일이 첨부되어 있습니다.

이 테이블은 유한 상태 머신 , 줄여서 FSM.Run Me 스크립트를 실행하면 JMP에서 다음과 같은 창이 열립니다.

상태 사이를 탐색할 수 있는 오른쪽에 버튼이 있습니다.이 애플리케이션에서 당신이 있는 방은 FSM이 있는 상태입니다.테이블에는 6개의 방, 6개의 상태 및 6개의 행이 있습니다.
열 방 이름 그리고 메시지 평범한 오래된 문자 열입니다.내용물 중괄호로 묶인 JSL 목록을 포함하는 표현식 열입니다.열을 만든 후 열 대화 상자에서 유형을 식으로 설정할 수 있습니다.

표현식 열은 대부분 셀에 어떤 종류의 표현식이 있는지 상관하지 않으며 모든 셀이 동일한 종류의 표현식을 갖는지 상관하지 않습니다.그만큼 출입구 열은 대괄호로 표시된 행렬의 표현식 열입니다.그만큼 엔터 column은 방(상태)에 들어갈 때 스크립트가 실행할 JSL의 표현식 열입니다.
그것은 떠나는 그림 표현식 열이기도 한 열입니다.JMP는 사진에 예외를 두어 식의 텍스트가 아닌 기본적으로 사진을 표시합니다.첫 번째 그림에 대한 표현의 텍스트는 다음과 같습니다(...는 문자가 많다는 점을 제외하고).
새 이미지(Char to Blob( "58016...j1EF", "base64compressed" ), "png")
JSL은 표현식 열과 함께 작동하여 이 FSM의 사용자 인터페이스가 상태 변경으로 변경되도록 합니다.이 FSM의 경우 버튼을 누르면 상태 변경이 발생합니다.
room = Num( dtx << gettablevariable( "roomRow" ) );
테이블 변수 roomRow(첫 번째 그림의 왼쪽 위 모서리)는 FSM의 상태를 기억합니다.스크립트는 이를 사용하여 현재 방의 콘텐츠를 찾습니다.
getcontents = Function( {}, {stuff = dtx:contents[room], rc = H List Box(), i}, For( i = 1, i <= N Items( stuff ), i++, rc << append( Eval( Eval Expr( Button Box( stuff, take( Expr( stuff ) ) ) ) ) ) ); rc;); dtx FSM 데이터 테이블이므로 dtx:내용 목록의 열입니다.[ 방 ] 아래 첨자는 테이블에서 행을 선택합니다.이 루틴의 목표는 버튼 상자의 가로 목록을 작성하는 것입니다.각 버튼에는 방에 있는 항목이 표시되어 있습니다.버튼 스크립트는 가져가다 방에서 아이템을 꺼내어 넣는 기능 목록 , 다른 테이블 변수.Eval/EvalExpr/Expr 코드는 "stuff"의 현재 값을 "베이킹"합니다. " 그래서 가져가다 나중에 버튼을 눌렀을 때 베이크인 값을 가져오고 물건 그리고 나 더 이상 사용할 수 없습니다.
take = Function( {thing}, {stuff = Parse( dtx << gettablevariable( "inventory" ) ), pos = Contains( dtx:contents[room], thing)}, // move from room's content to inventory //Open( "$TEMP/take.mp3" ); tableholder << Bring Window To Front; dtx:contents[room] = Remove( dtx:contents[room], pos ); Insert Into( stuff, thing); dtx << settablevariable( "inventory", Char( stuff ) ); rebuild();); 그만큼 가져가다 함수는 테이블 변수를 가져옵니다. 목록 문자열을 목록으로 구문 분석합니다.그런 다음 위치 취할 항목이 있는 변수; 물건 위에서 구운 이름입니다.다음 몇 줄은 방의 내용물 그리고 목록 .이 JSL은 항상 테이블 변수 및 표현식 열의 값을 사용하므로 테이블은 FSM의 현재 상태로 언제든지 저장할 수 있습니다.
마지막 것 가져가다 전화하다 재구축() .
rebuild = Function( {}, (inv << child) << delete; inv << append( getinventory() ); (content << child) << delete; content << append( getcontents() ); (doors << child) << delete; doors << append( getdoors() ); txt << settext( dtx:message[room] ); (pic << child) << delete; pic << append( dtx:picture[room] );); 재구축 작업은 FSM의 사용자 인터페이스를 내부 상태와 일치하도록 만드는 것입니다.인벤토리, 콘텐츠 및 도어 버튼의 이전 목록이 삭제되고 새로운 목록으로 대체되며 그림이 업데이트됩니다.모든 이름(inv, content, doors, txt, pic)은 창을 만드는 스크립트에 의해 설정됩니다.
New Window( "FSM", H List Box( V List Box( Text Box( "inventory:\!n click\!n to drop" ), inv = Border Box( getinventory() ) ), V List Box( txt = Text Box( dtx:message[room], < pic = Border Box( dtx:picture[room] ), H List Box( Text Box( "click to pick up:" ), content = Border Box( getcontents() ) ) ), V List Box( Text Box( "click to\!ngo through\!ndoor to..." ), doors = Border Box( getdoors() ) ), tableholder = Border Box() ));
각 변수는 테두리 상자를 식별합니다.테두리 상자는 삭제되지 않지만 해당 내용은 삭제된 다음 교체됩니다.
마지막으로 여기에 표시되지 않은 창의 맨 오른쪽은 onEnter 및 onExit 열의 스크립트에 의해 제어됩니다.위의 방법을 보면 거실용 onEnter 스크립트가 거실에서 볼 수 있는 영화의 데이터 테이블을 여는 것을 볼 수 있습니다.보이지 않는 테이블은 다음에 넣을 NewDataBox를 제공합니다. 테이블 홀더 테두리 상자 .onExit는 당신이 방을 나갈 때 제거하므로 다음 방의 onEnter는 다른 것을 제공할 수 있습니다.대부분의 객실은 적절한 데이터 테이블을 선택합니다.욕실에서 테이블의 스크립트를 실행하려면 JMP PRO가 필요합니다.
연결된 테이블은 이전 버전의 JMP에서 열리지만 표현식 열은 문자 열이 되고 스크립트는 올바르게 실행되지 않습니다.JMP12가 곧 출시됩니다. 준비하세요!