Re: Tratar con "On Change" dentro de una clase en JSLEn realidad, el mensaje de error que recibo es:
Nombre Sin resolver: clb en acceso o evaluación de 'clb', clb/*###*/
¡lo siento por eso!
Re: Tratar con "On Change" dentro de una clase en JSLCreo que los miembros de la clase tienen una locales predeterminados mecanismo, lo quieras o no. En
method1 = Method({},
this:window = New Window( "Test Window", clb = Col List Box( all, On Change( Show( clb << Get Items ) ) ) );
);
clb se asigna cuando se ejecuta el método 1, luego se olvida cuando regresa el método 1. Mucho más tarde, cuando se ejecuta el método OnChange, no se puede encontrar. Si desea una solución rápida e imperfecta, haga que clb sea más global.
Una solución mejor, pero más fea, requiere incrustar el valor de clb en lugar de clb.
Define Class( "exampleClass",
// create the instance variables
m_clb = .;
m_window = .;
m_BC = .;
_init_ = Method( {},
m_BC = Open( "$SAMPLE_DATA/Big Class.jmp" );
m_window = Empty();
);
method1 = Method( {},
m_clb = Col List Box( all );
// add the on change script after creating the box. The script needs
// to reference the box. Substitute the actual box that m_clb refers
// to for the xxx placeholder name, then evaluate the resulting script
Eval( Substitute(
Expr( m_clb << onChange( Show( xxx << getselected ) ) ),
Expr( xxx ),
m_clb
));
m_window = New Window( "Test Window", m_clb );
);
);
// Create an object of the class and try to use the function
testObject = New Object( exampleClass() );
testObject:method1();
este probablemente no hace lo que esperas. No existe un equivalente a un C++ this-> y le resultará difícil inventarlo sin crear una pérdida de memoria. En el ejemplo anterior, sería incluso mejor incrustar este en lugar de clb, pero necesita inventar una forma de obtener este .
Escribí dos blogs sobre clases, Cómo usar Definir clase y Programación funcional usando objetos JSL . He intentado usar las clases varias veces y nunca he quedado satisfecho. Una cosa que una clase hace muy bien es pasar por referencia, y esa puede ser la mejor razón para usarla. Envolver una matriz grande en una instancia de clase hace posible pasar la matriz a funciones escritas por el usuario sin hacer una copia de la matriz.
Y si solo < este parámetro, apuntando a la caja, esto sería mucho más fácil.
Re: Tratar con "On Change" dentro de una clase en JSL<< Set Function podría ser una buena opción para usar en lugar de << On Change, ya que tiene "this" como argumento de función. Dependiendo de lo que intente hacer al final, diría que hay al menos tres opciones diferentes
1. Haga lo que sugiere Craige y evalúe la referencia al cuadro de lista de columnas.
2. Use << Establecer función y luego puede hacer referencia a esto (que se referirá al cuadro de lista col en sí). Estos tienen comportamientos un poco diferentes, pero podrían afectar su aplicación
Define Class( "exampleClass",
m_clb = Empty();
m_window = .;
m_BC = .;
_init_ = Method( {},
m_BC = Open( "$SAMPLE_DATA/Big Class.jmp" );
m_window = Empty();
);
method1 = Method( {},
m_window = New Window("Test Window",
m_clb = Col List Box(
Datatable(m_BC),
all,
<< Set Function(function({this},
Show(this << get selected)
))
)
);
);
);
// Create an object of the class and try to use the function
testObject = New Object( exampleClass() );
testObject:method1();
3. Use el alcance de la ventana ( Guía de secuencias de comandos > Métodos de programación > Ámbito y espacios de nombres avanzados > Nombres con ámbito )
Define Class( "exampleClass",
m_window = .;
m_BC = .;
_init_ = Method( {},
m_BC = Open( "$SAMPLE_DATA/Big Class.jmp" );
m_window = Empty();
);
method1 = Method( {},
m_window = New Window("Test Window",
window:m_clb = Col List Box(
Datatable(m_BC),
all,
<< onChange(Show(window:m_clb << Get Selected))
)
);
);
);
// Create an object of the class and try to use the function
testObject = New Object( exampleClass() );
testObject:method1();Tratar con "On Change" dentro de una clase en JSL¡Hola comunidad!
Me quedé un poco atascado al usar Clases, así que espero que alguien pueda ayudarme.
Un poco de contexto: estoy trabajando en un script que se divide en dos: un script principal y un script de funciones, donde este último se incluye en el script principal. Estoy tratando de trabajar con clases y espacios de nombres, para asegurarme de que las variables solo se encuentren cuando se supone que se deben encontrar. Mi problema específico surge cuando trato de usar la función "Al cambiar" con un cuadro de lista de columnas.
Hice un ejemplo de trabajo mínimo que ilustra mi problema. Considere el código principal:
Names Default To Here(1);
Clear log(); Clear Globals(); Clear Symbols();
// Include the class script
If( !Namespace Exists( "mainNamespace" ), New Namespace( "mainNamespace" ) );
mainNamespace:dir = Get Default Directory();
Include(mainNamespace:dir || "classScript.jsl");
// Create an object of the class and try to use the function
testObject = New Object( exampleClass());
testObject:method1();
y luego el script de clase:
Names Default To Here(1);
If( !Namespace Exists( "classNamespace" ), New Namespace( "classNamespace" ) );
Define Class("exampleClass",
_init_ = Method( {},
this:BC = Open( "$SAMPLE_DATA/Big Class.jmp", Show(1) );
this:window = Empty();
);
method1 = Method({},
this:window = New Window( "Test Window", clb = Col List Box( all, On Change( Show( clb << Get Items ) ) ) );
);
);La idea es tener una ventana abierta donde puede seleccionar algunas columnas de una tabla de datos y luego obtener una lista con las columnas seleccionadas. Esto funciona bien cuando no uso Clases, es decir, si solo escribo las clases como parte del script como código "normal". El código anterior logra abrir la tabla de datos de Big Class y la ventana con el cuadro de lista de columnas, pero cada vez que hago clic en una columna, aparece un error:
Enviar espera un objeto programable en acceso o evaluación de 'Enviar', clb << /*###*/Obtener elementos /*###*/
¿Hay algo que estoy haciendo mal, o no entiendo? ¿O tiene algo que ver con la forma en que se programa "On Change"? ¡Cualquier ayuda es apreciada!
Acceso a los datosRe: Tratar con "Al cambiar" dentro de una clase en JSLEste es un hilo antiguo, pero quería publicar una solución más que creo que es muy útil cuando se trata de ventanas dentro de clases. De manera similar a la solución de Jarmo, puede usar el mensaje << Establecer función, pero use una definición de método. Tiene aproximadamente la misma funcionalidad que una Función con la ventaja adicional de evaluar dentro del alcance de la clase, lo que significa que puede hacer referencia a variables de objeto.
Define Class( "exampleClass",
m_clb = Empty();
m_window = .;
m_BC = .;
_init_ = Method( {},
m_BC = Open( "$SAMPLE_DATA/Big Class.jmp" );
m_window = Empty();
);
method1 = Method( {},
m_window = New Window("Test Window",
m_clb = Col List Box(
Datatable(m_BC),
all,
<< Set Function(Method({this},
Show(this << get selected);
Show(m_clb << get selected);
Show(m_window);
Show(m_BC);
))
)
);
);
);
// Create an object of the class and try to use the function
testObject = New Object( exampleClass() );
testObject:method1();La variable 'esta' funciona igual que explicó Jarmo, pero también puedes hacer referencia a cualquier otra variable de la clase. Aquí 'esto' es equivalente a 'm_clb'.
Considero que usar Métodos de esta manera es muy conveniente para crear ventanas modulares con componentes interactivos.