Mantener los ámbitos locales.Estoy intentando crear un marco para visualizar datos; esto me lleva a crear una plantilla con varios botones que pueden actuar sobre los datos que se pasaron a la plantilla.
Sin embargo, me estoy topando con un problema con el alcance donde crear un botón con una función a la que llamar: llamar a esta función ocurre en un ámbito diferente al que habría pensado según la ubicación del botón en el código.
A continuación, proporcioné un ejemplo de trabajo mínimo: esperaría que cuando se haga clic en cada botón, la llamada a la función resultante ocurra dentro del ámbito de definición original.
¿Hay alguna manera de lograr esto?
¡Gracias!
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: Mantener los ámbitos locales.Tenga en cuenta en la secuencia de comandos anterior que la función insert_text hace referencia a la pestaña, tb, y al msg, msg. La función << Establecer función pasa la referencia (este) el botón y usted puede hacer referencia a su padre el VListBox o su padre el padre, la pestaña.
En primer lugar, no usaría una función para crear las pestañas. Modifiqué el script para usar cuadros de pestañas y creo una variable o ellos. Tenga en cuenta que si está utilizando una función, si especifica todas las variables pero los mensajes son locales, las referencias de las variables se desconocen una vez que se ejecute tab_function. Comenté nuestro {Default Local}; Descomentarlo para ver los errores.
Modifiqué la función insert_text para demostrar que el script sabe qué botón de pestaña se presionó y puede obtener información sobre esa página de pestaña. Prueba el botón de cada pestaña.
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: Mantener los ámbitos locales.¡Gracias por ayudar! Sin embargo, esto no es precisamente lo que estoy buscando. Necesito poder hacer referencia a variables locales a "tab_function" desde dentro de la función "insert_text" pasando una referencia de dicha variable a la función "insert_text".
Re: Mantener los ámbitos locales.No estoy seguro de lo que estás tratando de hacer. Pero esta es mi mejor conjetura. He modificado algunas cosas.
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>