Mantenere gli ambiti localiSto cercando di creare un framework per la visualizzazione dei dati: questo mi porta a creare un modello con diversi pulsanti che possono agire sui dati passati al modello.
Tuttavia, sto riscontrando un problema con l'ambito in cui creare un pulsante con una funzione da chiamare: chiamare questa funzione avviene in un ambito diverso rispetto a dove avrei pensato in base alla posizione del pulsante nel codice.
Ho fornito un esempio di lavoro minimo di seguito: mi aspetto che quando si fa clic su ciascun pulsante la chiamata della funzione risultante si verifichi nell'ambito di definizione originale.
C'è un modo per realizzare questo?
Grazie!
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");
)Ri: Mantenere gli ambiti localiSi noti nello script precedente che la funzione insert_text fa riferimento a tab, tb e msg, msg. La funzione << Set passa il riferimento (questo) al pulsante e puoi riferire al suo genitore il VListBox o il suo genitore << padre, il tab.
Prima di tutto, non vorrei usare una funzione per creare le schede. Ho modificato lo script per utilizzare i tabpage box e ho creato una variabile o loro. Nota dal momento che stai usando una funzione, se specifichi tutte le variabili ma msg sono locali, i riferimenti alle variabili saranno sconosciuti una volta che tab_function è in esecuzione. Ho commentato il nostro {Default Local}; decommentalo per vedere gli errori.
Ho modificato la funzione insert_text per dimostrare che lo script sa quale pulsante è stato premuto ed è possibile ottenere informazioni su tale pagina. Prova il pulsante di ogni scheda.
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>Ri: Mantenere gli ambiti localiGrazie dell'aiuto! Tuttavia, questo non è esattamente quello che sto cercando - Devo essere in grado di fare riferimento a variabili locali a "tab_function" dalla funzione "inserire_text" passando un riferimento di detta variabile nella funzione "insert_text".
Ri: Mantenere gli ambiti localiNon sono sicuro di cosa stai cercando di fare. Ma questa è la mia ipotesi migliore. Ho modificato alcune cose.
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>