Re : Comportement des variables dans les fonctions JSLgzmorgan, Merci pour la perspicacité. La solution window() actuelle semblait être la solution la plus simple, mais cela n'a pas fonctionné pour moi... du moins, pas la façon dont j'ai essayé de la coder. J'ai essayé d'utiliser principalement la commande eval sub() pour la plupart des variables, ce qui fonctionne, mais ne fonctionne pas pour le nw (ma nouvelle variable de fenêtre) ou _cw pour la fenêtre actuelle. J'ai probablement raté quelque chose, mais ça va.
J'ai fini par revenir à votre autre suggestion, que Vince avait suggérée plus tôt, l'espace de noms de fenêtre. Je n'ai eu aucun problème avec jusqu'à présent.
En ce qui concerne le constructeur d'applications, je le connais mais je ne l'ai pas utilisé. En général, je code simplement ma propre interface graphique et mes propres fonctions, et je crée le complément manuellement. J'ai eu du mal à comprendre la fonction set et ceci (ou self) et ce qui appelait quoi, mais je pense que je vois maintenant... Je vais regarder de plus près.
Merci à tous pour les contributions. J'apprécie vraiment les différentes approches / suggestions. Mon script prend un ensemble de paramètres associés et les trace de différentes manières, mais il faut quelques minutes pour le configurer et cliquer manuellement sur les paramètres, puis l'exporter. Avec ces mises à jour et en boucle à partir d'un fichier maître, je peux appeler le script à partir d'un script d'appel séparé au lieu de l'interface graphique, et le faire générer non pas un ensemble de tracés mais N tracés. Avant, ça me prenait quelques heures... maintenant, c'est dix secondes.bien sûr, il m'a fallu beaucoup de temps pour arriver ici, mais je peux le réutiliser pendant des années.
Re : Comportement des variables dans les fonctions JSLOops!J'ai oublié de mentionner qu'au lieu de "ceci" et des espaces de noms de fenêtre, vous pouvez également simplement vous référer à la fenêtre actuelle.J'ai joint le script alternatif,
Re : Comportement des variables dans les fonctions JSLJ'allais suggérer d'utiliser l'espace de noms de fenêtre, ce qui est une bonne suggestion.Je n'utilise généralement pas de fonctions pour les fenêtres d'interface utilisateur.Une autre méthode pour faire référence à des objets locaux consiste à utiliser la fonction Set et à maîtriser cela. Le script est ci-dessous.J'ai utilisé des déclarations d'impression plus simples.Vous voudrez peut-être explorer l'utilisation de l'Application Builder, il faut un peu d'investissement pour apprendre comment cela fonctionne, mais cela peut être pratique.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>Re : Comportement des variables dans les fonctions JSLMerci Vince. Je ne connaissais pas l'espace de noms de fenêtre. Cela pourrait bien fonctionner, je vais essayer.
En ce moment, j'ai ma partie GUI dans un seul fichier, et j'ai l'intention de passer les variables à ce que j'appellerai la fonction principale. J'appellerais soit l'interface graphique à partir d'une barre d'outils complémentaire, soit j'exécuterais un petit script personnalisé qui bouclerait N fois, appelant le script principal pour N ensembles de paramètres d'entrée. La possibilité de réutilisation pourrait être un problème ici, mais l'écrasement des variables peut ne pas avoir d'importance... Je vais voir comment ça se passe. Merci pour votre aide.
Re : Comportement des variables dans les fonctions JSLLe problème si vous le faites avec des globals ou un espace de noms global est la réutilisabilité (dont vous ne vous souciez peut-être pas).
si vous exécutez myFun deux fois avec deux boutons différents (disons que vous voulez pouvoir mettre votre fenêtre en bac à sable et en exécuter deux instances).Vous aurez une collision et le deuxième appel remplacera les premiers.
Voir ci-dessous.
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
si vous utilisez un espace de noms, je vous recommande d'utiliser l'espace de noms de fenêtre. Il supprime automatiquement lorsque la fenêtre est partie et vous n'aurez pas de collision entre deux fenêtres identiques.
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");Re : Comportement des variables dans les fonctions JSLMerci Vince. Je n'avais pas pensé à eval(substitute(expr())). Pour certains de mes scripts plus complexes, je pense qu'il pourrait être trop difficile de garder une trace de ce qui a été remplacé et où. Mon code n'est pas exactement bien organisé et le débogage serait difficile.Re : Comportement des variables dans les fonctions JSLMerci, votre idée globale m'a donné une autre idée.Le fait que les variables soient globales ne me dérange pas tellement, mais si elles doivent être globales, je préfère les étendre dans un espace de noms contenu.
Je ne pense pas que la commande clear globals() me mordrait ici, mais elle m'a eu avec mes fonctions de rappel (mes variables de rappel globales ont été effacées par un autre script utilisant clear globals()).J'avais envoyé un e-mail à JMP et ils ont suggéré deux alternatives : protéger les variables globales en les verrouillant ou en les plaçant dans leur propre espace de noms. L'espace de noms était en fait plus simple en termes de robustesse.
Quoi qu'il en soit, le code mis à jour ci-dessous semble fonctionner correctement. L'inconvénient est la saisie supplémentaire de "test :" à chaque fois que je fais référence à une variable. Je me rends compte que je n'en ai peut-être pas besoin pour chaque utilisation de variable dans le script, mais d'un autre côté, c'est probablement une bonne pratique et parce que cette utilisation particulière est un espace de noms global, je peux voir le contenu de la variable en passant mon curseur sur les noms de variable.
Notez l'utilisation de A1 et Z1. Cela ne m'a pas laissé attribuer à test:A et test:Z.
Erreur : l'argument doit être list dans l'accès ou l'évaluation de 'Function' , Function/*###*/({test:A, test:Z}, .....
Je vais voir si je peux faire fonctionner cela avec plusieurs fichiers.
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);Re : Comportement des variables dans les fonctions JSLJ'ai dû recourir à la définition de variables globales pour que cela fonctionne.Il semble que le code de la boîte de dialogue ne puisse pas voir correctement les variables.Ce n'est pas une bonne solution car cela va à l'encontre de l'objectif d'avoir des variables locales dans une fonction.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);Re : Comportement des variables dans les fonctions JSLB n'a même pas fonctionné pour moi.
C'est normalement comme ça que je fais des trucs d'interface graphique.C'est trop compliqué pour l'exemple que vous avez donné, mais je pense qu'il montre quelques méthodes différentes.
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>Comportement variable dans les fonctions JSL
Mes scripts ont généralement deux composants principaux : une fonction principale suivie du code de l'interface graphique, le tout dans le même fichier. J'utilise généralement des variables contenues dans l'espace de noms Here, j'obtiens les variables à partir de l'entrée de l'utilisateur et j'appelle la fonction principale à partir d'une boîte à boutons "OK". Je ne transmets aucune variable à la fonction principale et j'utilise simplement les variables qui ont été affectées au script de la boîte à boutons 'OK'. J'envisage de modifier au moins un de mes scripts afin qu'il y ait un fichier avec l'interface graphique et un second fichier avec la fonction principale. Avant de faire cela, je vérifie comment cela fonctionne dans un fichier JSL. Vous trouverez ci-dessous un exemple simplifié, contournant l'interface graphique et définissant simplement les variables après la définition de la fonction mais avant son appel.
Une chose que j'ai remarquée est qu'il est plus difficile de déboguer après l'exécution d'un script, car lorsque je survole les x et y, je peux voir le contenu dans la barre d'état en bas de la fenêtre. Mais ce n'est pas le cas pour les variables locales A, B, Z et nw. Je me demande si quelqu'un a des conseils à ce sujet.
Je ne sais pas non plus comment accéder au contenu de la variable à partir du script de la boîte à boutons. Si vous exécutez le code ci-dessous, vous pouvez voir que A, B, Z apparaissent dans le journal comme prévu (juste avant la création de la nouvelle fenêtre), et B et Z apparaissent également dans les nouvelles zones de texte de la fenêtre, mais le bouton Le script de boîte ne peut pas accéder directement à ces variables. J'ai pu utiliser eval(parse(eval insert())) pour obtenir le tableau B mais je n'ai pas pu obtenir la chaîne Z.Existe-t-il des méthodes plus directes pour que cela fonctionne?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
Merci,
Mike
Automatisation et scriptIngénierie de la qualité et des procédés