Comment fermer les tables correctes avec « On close » lors de l'exécution plusieurs fois du même script ?Bonjour,
J'ai un complément qui génère un graphique avec plusieurs tableaux cachés en arrière-plan.
En fermant la fenêtre, j'utilise la fonction "On Close" pour fermer les tables de données associées, comme ceci :
New window() << On close(
Close(TableA, nosave);
Close(TableB, nosave);
) ;
Le problème est que si j'exécute le script deux fois, la TableA de la première exécution sera écrasée lors de la deuxième exécution du script.
J'ai essayé de contourner le problème en utilisant un ID unique créé à chaque lancement de script, comme ceci :
NewWindow() << On Close(
For(i = NItems(GetWindowList() << Get Window Title()), i > 0, i--,
win = GetWindow((GetWindowList() << Get Window Title())[i]);
If(Contains(win << get window title, Eval(uniqueID)) != 0,
win << closewindow()
);
)
)
Malheureusement, le même problème persiste, UniqueID est écrasé.
Existe-t-il un moyen de référencer correctement les tables afin que la fermeture de la fenêtre ferme les bonnes tables ?
Merci d'avance pour votre aide!
Automatisation et scriptsRe : Comment fermer les bonnes tables avec « On close » lors de l'exécution plusieurs fois du même script ?Noms par défaut ici (1); au début du script ou peut-être en utilisant la portée de la fenêtre (ou la boîte). Le Guide de script contient des informations concernant les espaces de noms et les étendues.
Vous pouvez passer à différentes pages à partir du menu de gauche

ou flèches en haut à droite

Re : Comment fermer les bonnes tables avec « On close » lors de l'exécution plusieurs fois du même script ?Merci Craige pour les explications, très utiles ! J'ai généralisé cela et je suis heureux que les bonnes tables soient fermées à la fermeture de la fenêtre.
J'ai encore un problème qui est probablement lié d'une manière ou d'une autre : sur ces fenêtres je mets des scripts de menu afin de permettre l'exploration, maintenant ils appellent les bons arguments grâce au Eval(EvalExpr(...Expr(...))) code. Néanmoins, je définis des variables à l'intérieur de ces scripts à des fins de manipulation de données et je ne sais pas comment éviter qu'elles soient écrasées : existe-t-il un moyen de déclarer ces variables comme locales à ce script ?
Exemple:
Eval(
EvalExpr(
NewWindow("Example", Outline = OutlineBox("Add-ins", Tabs = TabBox())) <<
On close(
Try(Close(Expr(TableA), nosave));
Try(Close(Expr(TableB), nosave));
)
)
);
Outline << Set Menu Script(
{"Script1", Eval(EvalExpr(Add_in_table = Expr(TableA) << Subset(Selected Rows))) ;
// some code
TableD = Add_in_table << Summary(...) ;
Eval(
EvalExpr(
NewWindow(Graph builder()) << OnClose(
Try(Close(Expr(Add_in_table), nosave));
Try(Close(Expr(TableD), nosave));
)
)
)}
);Merci
Re : Comment fermer les bonnes tables avec « On close » lors de l'exécution plusieurs fois du même script ?Comment ça marche : dans votre exemple d'origine,
New window() << On close(
Close(TableA, nosave);
Close(TableB, nosave);
) ;
TableA et TableB sont des variables contenant des pointeurs vers les tables. S'il existe plusieurs instances, les variables pointent vers la dernière instance attribuée.
Dans l'exemple @jthi ,
Eval(EvalExpr(
New Window() << On close(
Try(Close(Expr(TableA), nosave));
Try(Close(Expr(TableB), nosave));
)
));
votre script est prétraité par le code Eval(EvalExpr( ... Expr(...) ) ) pour remplacer la variable par sa valeur. Cela rend le script ne dépendant plus de la variable actuelle de la variable car l'appel à close() utilise désormais une valeur constante (obtenue à partir de la variable beaucoup plus tôt.)
Comment le lire : EvalExpr(...) parcourt son argument pour Expr(...) et les évalue, laissant le résultat évalué à la place de Expr(). Lorsque EvalExpr est terminé, il renvoie une expression qui doit encore être évaluée pour que la méthode OnClose(...) s'exécute.
Il est important de positionner les marqueurs Expr(...) au bon endroit ; la partie qui doit être gravée dans le marbre est simplement la valeur de la variable. Si vous utilisez Expr(close(tableA,nosave)), par exemple, la fonction close() s'exécuterait trop tôt.
Re : Comment fermer les tables correctes avec « On close » lors de l'exécution plusieurs fois du même script ?Incroyable, merci beaucoup !
Re : Comment fermer les tables correctes avec « On close » lors de l'exécution plusieurs fois du même script ?Évaluez les tableaux à votre On Close
Eval(EvalExpr(
New Window() << On close(
Try(Close(Expr(TableA), nosave));
Try(Close(Expr(TableB), nosave));
)
));