<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Esta publicación es una aplicación de ejemplo que se puede escribir en JSL con columnas de expresión JMP 12.Más publicaciones de JMP 12 .
Hay un archivo .JMP adjunto a esta publicación que se parece a esto:

Esta mesa tiene una Máquina de estados finitos , FSM para abreviar.Si ejecuta el script Run Me, JMP abre una ventana como esta:

que tiene botones a la derecha para navegar entre estados.En esta aplicación, la habitación en la que se encuentra es el estado en el que se encuentra el FSM.Hay seis habitaciones, seis estados y seis filas en la tabla.
Las columnas nombre de la habitación y mensaje son simples columnas de caracteres antiguos.Contenido es una columna de expresión que contiene listas JSL entre llaves.Después de crear una columna, el cuadro de diálogo de la columna puede establecer el tipo en expresión:

A las columnas de expresión en su mayoría no les importa qué tipo de expresión hay en las celdas, y no les importa si cada celda tiene el mismo tipo de expresión.El Puerta columna es una columna de expresión de matrices, indicada por corchetes.El en Entrar column es una columna de expresión de JSL que el script ejecutará cuando se ingrese una habitación (estado).
Eso deja el imagen columna, que también es una columna de expresión.JMP hace una excepción con las imágenes, mostrando la imagen de forma predeterminada, en lugar del texto de la expresión.El texto de la expresión de la primera imagen se ve así (excepto que ... son muchos caracteres):
Nueva imagen (Char To Blob ("58016...j1EF", "base64compressed"), "png")
El JSL trabaja con las columnas de expresión para hacer que la interfaz de usuario de este FSM cambie con los cambios de estado.Para este FSM, los cambios de estado ocurren cuando se presionan los botones.
room = Num( dtx << gettablevariable( "roomRow" ) );
la variable de tabla roomRow (esquina superior izquierda de la primera imagen) recuerda en qué estado se encuentra el FSM.El script usa eso para encontrar el contenido de la sala actual:
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 es la tabla de datos FSM, entonces dtx: contenido es la columna de listas.el [ habitación ] subíndice elige la fila de la tabla.El objetivo de esta rutina es construir una lista horizontal de cajas de botones.Cada botón está etiquetado con un elemento en la habitación.El script del botón llama a un llevar función para tomar el artículo de la habitación y ponerlo en inventario , otra variable de tabla.El código Eval/EvalExpr/Expr está "cocinando" el valor actual de "stuff " entonces llevar obtendrá el valor horneado, más tarde, cuando se presione el botón y los valores en cosa y i ya no estará disponible.
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();); El llevar la función toma la variable de la tabla inventario cadena y la analiza en una lista.Entonces hace un posición variable con el ítem a tomar; cosa es el nombre que se horneó arriba.Las siguientes líneas manipulan el contenido de la habitación y el inventario .La tabla se puede guardar en cualquier momento con el estado actual de la FSM porque este JSL siempre usa los valores de la variable de tabla y la columna de expresión.
Lo último llevar lo que hace es llamar reconstruir() .
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] );); la tarea de reconstrucción es hacer que la interfaz de usuario del FSM sea coherente con el estado interno.Las listas antiguas de inventario, contenido y botones de puerta se eliminan y reemplazan con listas nuevas, y la imagen se actualiza.Todos los nombres (inv, contenido, puertas, txt, foto) los establece el script que crea la ventana:
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() ));
cada una de las variables identifica un cuadro de borde.El cuadro de borde no se elimina, pero su contenido se elimina y luego se reemplaza.
Finalmente, el extremo derecho de la ventana, que no se muestra aquí, está siendo controlado por el script en la columna onEnter y onExit.Puede ver, muy arriba, el script onEnter para la sala de estar abre una tabla de datos de películas que puede ver en la sala de estar.La tabla invisible luego proporciona un NewDataBox para poner en el sostenedor de mesa cuadro de borde .onExit lo elimina cuando sale de la habitación, por lo que onEnter de la siguiente habitación puede proporcionar algo diferente.La mayoría de las salas eligen una tabla de datos adecuada.El baño requiere JMP PRO para ejecutar los scripts en la tabla.
La tabla adjunta se abrirá en versiones anteriores de JMP, pero las columnas de expresión serán columnas de caracteres y el script no se ejecutará correctamente.JMP12 saldrá pronto, ¡prepárate!