Garder une portée localeJ'essaie de créer un cadre pour la visualisation de données. Cela m'amène à créer un modèle avec plusieurs boutons pouvant agir sur les données transmises au modèle.
Cependant, je rencontre un problème avec la portée, où la création d'un bouton avec une fonction à appeler - appeler cette fonction a une portée différente de celle à laquelle je l'aurais pensé en fonction de l'emplacement du bouton dans le code.
J'ai fourni un exemple de travail minimum ci-dessous - Je m'attendrais à ce que chaque fois qu'un bouton est cliqué, l'appel de fonction résultant se produise dans la portée de définition d'origine.
Y a-t-il un moyen d'accomplir cela?
Merci!
Names Default To Here ( 1 );
insert_text = Function({tb, msg}, {Default Local},
tb << Add ( "Added", msg )
);
tab_function = Function({msg}, {Default Local},
Tab Box (
"one",
tb1 = Tab Box();
V List Box(
b = Button Box ( "Add", insert_text(tb1, msg))
);,
"two",
tb2 = Tab Box();
V List Box(
b = Button Box ( "Add", insert_text(tb2, msg))
);,
"three",
tb3 = Tab Box();
V List Box(
b = Button Box ( "Add", insert_text(tb3, msg))
);
)
);
New Window(
"Test Window",
tab_function("hi");
)Re: Garder des portées localesVeuillez noter dans le script précédent que la fonction insert_text fait référence à l'onglet tab, à la tab, et au msg, msg. La fonction << Set transmet la référence (this) au bouton et vous pouvez référencer son parent le VListBox ou son parent << parent, l'onglet.
Tout d’abord, je n’utiliserais pas de fonction pour créer les onglets. J'ai modifié le script pour utiliser des zones de page à onglet et je crée une variable ou eux. Notez que puisque vous utilisez une fonction, si vous spécifiez toutes les variables mais que les msg sont locaux, les références aux variables seront inconnues une fois que tab_function sera exécuté. J'ai commenté notre {Default Local}; décommentez-le pour voir les erreurs.
J'ai modifié la fonction insert_text pour montrer que le script sait quel bouton d'onglets a été activé et que vous pouvez obtenir des informations sur cette page d'onglets. Testez le bouton de chaque onglet.
Names Default To Here ( 1 );
insert_text = Function({tb, msg}, {Default Local},
tb << select;
str = tb << get title;
str = "I am on tab " || str || " with message " || msg;
Caption(str); wait(2); Caption(remove);
tb << Append (TextBox( msg ));
tb << deselect;
);
tab_function = Function({msglist}, //{Default Local},
Eval(Eval Expr(
mytb= Tab Box (
tb1=Tab Page Box( "one",
V List Box(
b = Button Box ( "Add", insert_text(tb1, expr(msglist[1])) )
)
),
tb2 =Tab Page Box( "two",
V List Box(
b = Button Box ( "Add", insert_text(tb2, expr(msglist[2])) )
)
),
tb3=Tab Page Box("three",
V List Box(
b = Button Box ( "Add", insert_text(tb3, expr(msglist[3])) )
)
)
)
) )
);
New Window(
"Test Window",
tab_function({"hi","stay awhile", "goodbye"} );
);
//this command with throw an error with {Default Local}...once the tab_function runs tb1, etc are unknown
show( mytb << class name, tb2<<GET title=""></GET>Re: Garder des portées localesMerci pour ton aide! Cependant, ce n’est pas précisément ce que je recherche. Je dois pouvoir référencer les variables locales à "tab_function" à partir de la fonction "insert_text" en passant une référence de cette variable dans la fonction "insert_text".
Re: Garder des portées localesJe ne suis pas sûr de ce que vous essayez de faire. Mais c'est ma meilleure supposition. J'ai modifié quelques petites choses.
Names Default To Here ( 1 );
insert_text = Function({tb, msg}, {Default Local},
tb << select;
Caption(msg); wait(2); Caption(remove);
tb << Sib Append (TextBox( msg ));
tb << deselect;
);
tab_function = Function({msg}, {Default Local},
Eval(Eval Expr(
Tab Box (
"one",
V List Box(
b = Button Box ( "Add",
<<SET function=""></SET>