<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Cet article est un exemple d'application qui peut être écrite en JSL avec les colonnes d'expression JMP 12.Plus d'articles sur JMP 12 .
Il y a un fichier .JMP joint à ce message qui ressemble à ceci :

Ce tableau contient un Machine à états finis , FSM pour faire court.Si vous exécutez le script Run Me, JMP ouvre une fenêtre comme celle-ci :

qui a des boutons sur la droite pour naviguer entre les états.Dans cette application, la pièce dans laquelle vous vous trouvez correspond à l'état dans lequel se trouve le FSM.Il y a six pièces, six états et six lignes dans le tableau.
Les colonnes nom de la salle et message sont de simples colonnes de caractères anciens.Contenu est une colonne Expression contenant des listes JSL entre accolades.Après avoir créé une colonne, la boîte de dialogue de colonne peut définir le type sur expression :

Les colonnes d'expression ne se soucient généralement pas du type d'expression présent dans les cellules, ni de savoir si chaque cellule a le même type d'expression.Le Porte column est une colonne d'expression de matrices, indiquée par des crochets.Le surEntrée column est une colonne d'expression de JSL que le script exécutera lorsqu'une pièce (état) est entrée.
Cela laisse le image colonne, qui est également une colonne d’expression.JMP fait une exception pour les images, affichant l'image par défaut plutôt que le texte de l'expression.Le texte de l'expression de la première image ressemble à ceci (sauf que le ... contient beaucoup de caractères) :
Nouvelle image (Char To Blob ("58016...j1EF", "base64compressed" ), "png")
Le JSL fonctionne avec les colonnes d'expression pour faire changer l'interface utilisateur de ce FSM avec les changements d'état.Pour ce FSM, les changements d'état se produisent lorsque les boutons sont enfoncés.
room = Num( dtx << gettablevariable( "roomRow" ) );
la variable de table roomRow (coin supérieur gauche de la première image) se souvient de l'état dans lequel se trouve le FSM.Le script l'utilise pour trouver le contenu de la pièce actuelle :
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 est la table de données FSM, donc dtx:contenu est la colonne des listes.le [ chambre ] L'indice sélectionne la ligne du tableau.Le but de cette routine est de créer une liste horizontale de boîtes à boutons.Chaque bouton est étiqueté avec un élément dans la pièce.Le script du bouton appelle un prendre fonction pour sortir l'objet de la pièce et le mettre dedans inventaire , une autre variable de table.Le code Eval/EvalExpr/Expr « intègre » la valeur actuelle de « stuff " donc prendre obtiendra la valeur intégrée, plus tard, lorsque le bouton sera enfoncé et les valeurs dans truc et je ne sera plus 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();); Le prendre la fonction récupère la variable de la table inventaire chaîne et l'analyse dans une liste.Ensuite, cela fait un position variable avec l'objet à emporter ; chose est le nom qui a été intégré ci-dessus.Les lignes suivantes manipulent le le contenu de la chambre et le inventaire .La table peut être enregistrée à tout moment avec l'état actuel du FSM car ce JSL utilise toujours les valeurs de la variable de table et de la colonne d'expression.
La dernière chose prendre est-ce que c'est appeler reconstruire() .
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 tâche de reconstruction consiste à rendre l'interface utilisateur du FSM cohérente avec l'état interne.Les anciennes listes d'inventaire, de contenu et de boutons de porte sont supprimées et remplacées par de nouvelles listes, et l'image est mise à jour.Tous les noms (inv, content, portes, txt, pic) sont définis par le script qui crée la fenêtre :
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() ));
chacune des variables identifie une zone de bordure.La zone de bordure n'est pas supprimée, mais son contenu est supprimé, puis remplacé.
Enfin, l'extrême droite de la fenêtre, non représentée ici, est contrôlée par le script des colonnes onEnter et onExit.Vous pouvez voir, bien au-dessus, le script onEnter pour le salon ouvre une table de données de films que vous pourriez regarder dans le salon.La table invisible fournit alors une NewDataBox à mettre dans le porte-table cadre de bordure .onExit le supprime lorsque vous quittez la pièce, de sorte que le onEnter de la pièce suivante peut fournir quelque chose de différent.La plupart des salles choisissent un tableau de données approprié.La salle de bain nécessite JMP PRO pour exécuter les scripts du tableau.
Le tableau ci-joint s'ouvrira dans les versions antérieures de JMP, mais les colonnes d'expression seront des colonnes de caractères et le script ne s'exécutera pas correctement.JMP12 sortira bientôt, préparez-vous !