¿Cómo puedo hacer que este mensaje de error desaparezca?

Aparece cuando cierro la tabla y la ventana mediante el botón "Cerrar ventana" después de haber dibujado un gráfico por primera vez. Copié el script a continuación, pero para ejecutarlo habría que tener abierta una tabla de datos adecuada (ver ejemplo adjunto). Esta, y solo esta tabla, debe estar abierta al ejecutar el script. Este script es un intento de tener una pequeña calculadora de estabilidad de escritorio (muy sucia, razonablemente rápida) / ayudante al escribir informes, evaluar la vida útil del producto, etc. Permite al usuario aplicar nuestros datos de estabilidad normalizados (donde t=0 corresponde al 1000 % rel.) a concentraciones iniciales hipotéticas de cualquier parámetro de calidad (siempre que sea numérico) y cambiar rápidamente entre configuraciones y parámetros. Lo hice hasta ahora, pero este mensaje de error me está volviendo loco. (Además, ¿puedo mostrar esto en la próxima Grupo de usuarios nórdicos en persona: 5 de octubre de 2022 ?)

Delete Symbols();
Names Default To Here( 1 );
dt = Current Data Table();
dt << Clear Row States;
dt << Clear Select; // avoids accidentally including columns in colList
// alpha level for bivariate plot
alpha = 0.1;
// get lists for model selection
Batch = Associative Array( dt:Batch ) << Get Keys; // direct column reference
For( i = 1, i <= N Row( dt ), i++, // find all rel% columns
For( j = 1, j <= N Col( dt ), j++,
If( Column( j )[i] == 0,
For( k = 1, k <= N Col( dt ), k++,
If( Column( k )[i] == 100,
Column( k ) << Set Selected( 1 )
)
)
)
)
);
colList = dt << Get Selected Columns;
// length of column list box
nItems = N Items( colList );
// radio box argument
rb1_expr = Expr(
dt << Clear Row States;
one_rb = rb1 << Get Selected;
dt << Select Where( (dt:Batch == one_rb) ); // direct column reference
dt << Invert Row Selection;
dt << Hide and Exclude;
dt << Invert Row Selection );
// "draw graph" button & column list selection arguments
action_expr = Expr(
vlb << Delete; // delete existing vlb
yColAbs = Eval(
Eval Expr(
dt << New Column( one_rb || " / " || " / " || "start level = " || Char( startLevel ) || " for " || Char( yColRel ),
formula( Expr(startLevel) / Expr(100) * (As Column( Expr( yColRel ) ) ) )
)
)
);
pb << Append( // append new vlb with fresh graph
vlb = V List Box(
biv = Bivariate(
Y( yColAbs ), // is this the culprit?
X( dt:Time ), // direct column reference
Fit Line(
{Confid Curves Fit( 1 ),
Confid Curves Indiv( 1 ),
Confid Shaded Fit( 1 ),
Confid Shaded Indiv( 1 ),
Line Color( {230, 159, 0} )},
{Set α Level( 0.1 )}
),
Automatic Recalc( 1 ),
SendToReport(
// note reference to one_rb below in use for changing y axis label
Dispatch( {}, one_rb, TextEditBox, {Set Text( "QC parameter value" )} ),
Dispatch( {}, "timepoint 1", TextEditBox, {Set Text( "Time [months]" )} ),
Dispatch( {}, "Linear Fit", OutlineBox, {Close( 1 )} )
),
)
)
)
);
// model selection window with radio buttons & colum list box
nw = New Window( "Model selection",
Show Menu( 0 ),
Show Toolbars( 1 ), // to have access to cross hair
Border Box( Top( 0 ), Bottom( 20 ), Left( 20 ), Right( 10 ),
H List Box(
Panel Box( "Batch",
rb1 = Radio Box(
Eval List( Batch ),
rb1_expr
),
),
Panel Box( "QC parameter (y-axis)",
stabDat = Col List Box(
Max Selected( 1 ),
Width( 250 ),
N Lines( nItems ),
On Change(
yColRel = Column( dt, (stabDat << Get Selected) );
If( Is Empty( startLevel ),
//then
Empty(),
//else
action_expr
)
)
)
),
stabDat << Append( colList );
Panel Box( "Action",
V List Box(
H List Box (
neb = Number Edit Box( Empty(), 7, << Set Function(
startLevel = neb << Get;
If( Is Empty( yColRel ),
//then
Empty(),
//else
action_expr
) ) ),
Spacer Box( Size( 5, 0 ) ),
Text Box( "Enter start level" )
),
Spacer Box( Size( 0, 10 ) ),
Button Box( "Draw graph",
If( ( Is Empty( startLevel ) + Is Empty( yColRel )) > 0,
// then
New Window( "Message", modal,
V List Box(
Text Box( "QC parameter selection and/or start level missing!" ),
Spacer Box( size( 0, 10 ) )
)
),
// else
action_expr
)
),
Spacer Box( Size( 0, 10 ) ),
Button Box ( "Close Window",
If( !Is Empty( PF ), PF << Close Window);
nw << Close Window;
Close(dt, no save)
)
)
),
pb = Panel Box( "Model",
vlb = V List Box () // space for model graph
)
)
)
);
// making the initially selected buttons active in row selection
one_rb = rb1 << Get Selected;
dt << Select Where( (dt:Batch == one_rb) );
dt << Invert Row Selection;
dt << Hide and Exclude;
Creo que action_expr se activa cuando cierras la ventana y luego se estropeará todo. No estoy exactamente seguro de por qué sucede esto, pero el cuadro de lista de columnas no se destruye lo suficientemente rápido. Como solución alternativa, tal vez podría mover el cierre de la tabla de datos a On Close () y eliminarlo del botón "Cerrar ventana".
Añadir esto como última línea
nw << On close(Close(dt, no save));
y cambiar el botón a
Button Box("Close Window",
If(!Is Empty(PF),
PF << Close Window
);
nw << Close Window;
)Una forma rápida y sucia de manejar el problema sería cambiar el párrafo Cerrar ventana para ignorar los errores.
Button Box( "Close Window",
If( !Is Empty( PF ),
Try( PF << Close Window )
);
Try( nw << Close Window );
Try( Close( dt, no save ) );
)
¡Gracias! Como siempre, muy apreciado, pero sigue arrojando un mensaje de error.@jthi Sin embargo, la solución funcionó.
En caso de que esto sea de algún interés, el mensaje de error fue causado por el uso de "Al cambiar" en lugar de "Establecer función" en relación con el cuadro de lista de columnas. La secuencia de comandos (o al menos una versión modificada de la publicada aquí) seguía arrojando mensajes de error cuando no se salía usando el botón "Cerrar ventana" sino el botón Salir en la esquina superior derecha de la ventana. Esto sucedió después de haber agregado algunas líneas para asegurarme de que la tabla de datos esté cerrada independientemente de cómo se haya salido de la ventana. Sospecho que el "On Change" se activa... de alguna manera...
Antiguo
Panel Box( "QC parameter (y-axis)",
stabDat = Col List Box(
Max Selected( 1 ),
Width( 250 ),
N Lines( nItems ),
On Change( // not working so well for this application
yColRel = Column( dt, (stabDat << Get Selected) );
If( Is Empty( startLevel ),
//then
Empty(),
//else
action_expr
)
)
)
)Nuevo
Panel Box( "QC parameter (y-axis)",
stabDat = Col List Box(
Max Selected( 1 ),
Width( 250 ),
N Lines( nItems ),
<< Set Function( // no more error messages
yColRel = Column( dt, (stabDat << Get Selected) );
If( Is Empty( startLevel ),
//then
Empty(),
//else
action_expr
)
)
)
)
Por si alguien tiene un problema similar con una aplicación generada en Creador de aplicaciones .
Para las aplicaciones, el al cerrar() El comando se puede enviar a través de
(thisModuleInstance << Get Box) << on close(...)