<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 des colonnes d'expression JMP 12.Plus de messages JMP 12 .
Il y a un fichier .JMP attaché à ce post qui ressemble à ceci :

Ce tableau contient un Machine à états finis , FSM en abrégé.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 est l'état dans lequel se trouve le FSM.Il y a six pièces, six états et six rangées dans le tableau.
Les colonnes nom de la salle et message sont de simples anciennes colonnes de caractères.Contenu est une colonne Expression contenant des listes JSL entre accolades.Après avoir créé une colonne, la boîte de dialogue de la colonne peut définir le type sur expression :

Les colonnes d'expression ne se soucient généralement pas du type d'expression dans les cellules et ne se soucient pas de savoir si chaque cellule a le même type d'expression.Le Porte colonne est une colonne d'expression de matrices, indiquée par des crochets.Le onEnter colonne 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 pour la première image ressemble à ceci (sauf que le ... contient beaucoup de caractères):
Nouvelle image(Car vers 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 ] indice sélectionne la ligne du tableau.Le but de cette routine est de construire 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 prendre l'article de la pièce et le mettre dans inventaire , une autre variable de table.Le code Eval/EvalExpr/Expr "intègre" la valeur actuelle de "truc " donc prendre obtiendra la valeur intégrée, plus tard, lorsque le bouton est 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 saisit la variable de table inventaire chaîne et l'analyse dans une liste.Ensuite ça fait un position variable avec l'objet à emporter ; chose est le nom qui a été intégré ci-dessus.Les quelques lignes suivantes manipulent le contenu de la chambre et le inventaire .La table peut être enregistrée à tout moment avec l'état actuel du FSM car cette 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, doors, 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 boîte 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 illustrée ici, est contrôlée par le script dans les colonnes onEnter et onExit.Vous pouvez voir, bien au-dessus, le script onEnter pour le salon ouvre une table de données des films que vous pourriez regarder dans le salon.La table invisible fournit alors une NewDataBox à mettre dans le napperon boîte de bordure .onExit le supprime lorsque vous quittez la pièce, de sorte que l'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.
La table jointe 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 !