Re : Traiter "On Change" dans une classe dans JSLEn fait, le message d'erreur que j'obtiens est :
Nom non résolu : clb en accès ou évaluation de 'clb', clb/*###*/
Désolé pour ça!
Re : Traiter "On Change" dans une classe dans JSLJe pense que les membres de la classe ont un locale par défaut mécanisme, que vous le vouliez ou non. Dans
method1 = Method({},
this:window = New Window( "Test Window", clb = Col List Box( all, On Change( Show( clb << Get Items ) ) ) );
);
clb est affecté lorsque method1 est en cours d'exécution, puis oublié lors du retour de method1. Bien plus tard, lorsque la méthode OnChange s'exécute, elle est introuvable. Si vous voulez une solution rapide et imparfaite, rendez clb plus global.
Une meilleure solution, mais plus laide, nécessite d'intégrer la valeur de clb à la place 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();
cette ne fait probablement pas ce que vous attendez. Il n'y a pas d'équivalent à un this-> C++ et vous aurez du mal à l'inventer sans créer de fuite mémoire. Dans l'exemple ci-dessus, il serait encore mieux d'intégrer cette plutôt que CLB, mais vous devez inventer un moyen d'obtenir cette .
J'ai écrit deux blogs sur les cours, Comment utiliser Définir une classe et Programmation fonctionnelle à l'aide d'objets JSL . J'ai essayé d'utiliser les cours plusieurs fois et je n'ai jamais été satisfait. Une chose qu'une classe fait très bien est de passer par référence, et c'est peut-être la meilleure raison de les utiliser. Envelopper un grand tableau dans une instance de classe permet de passer le tableau à des fonctions écrites par l'utilisateur sans faire de copie du tableau.
Et si seulement le rappel < cette paramètre, pointant vers la case, ce serait tellement plus facile.
Re : Traiter "On Change" dans une classe dans JSL<< Set Function peut être une bonne option à utiliser à la place de << On Change, car il a "this" comme argument de fonction. Selon ce que vous essayez de faire à la fin, je dirais qu'il y a au moins trois options différentes
1. Faites ce que Craige suggère et évaluez la référence à la Col List Box
2. Utilisez << Set Function et vous pourrez ensuite le référencer (qui fera référence à la zone de liste de cols elle-même). Ceux-ci ont des comportements un peu différents, mais cela peut affecter votre application
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. Utilisez la portée de la fenêtre ( Guide de script > Méthodes de programmation > Portée avancée et espaces de noms > Noms de portée )
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();Traiter "On Change" dans une classe dans JSLBonjour la communauté !
J'ai été un peu bloqué lors de l'utilisation de Classes, alors j'espère que quelqu'un pourra m'aider.
Un peu de contexte : je travaille sur un script qui se divise en deux : un script principal et un script de fonctions, où ce dernier est ensuite inclus dans le script principal. J'essaie de travailler avec des classes et des espaces de noms, pour m'assurer que les variables ne sont trouvées que lorsqu'elles sont censées être trouvées. Mon problème spécifique survient lorsque j'essaie d'utiliser la fonction "On Change" avec une Col List Box.
J'ai fait un exemple de travail minimal qui illustre mon problème. Considérez le code 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();
puis le script de classe :
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 ) ) ) );
);
);L'idée est d'ouvrir une fenêtre dans laquelle vous pouvez sélectionner certaines colonnes d'une table de données, puis d'obtenir une liste avec les colonnes sélectionnées. Cela fonctionne bien lorsque je n'utilise pas de classes, c'est-à-dire si j'écris simplement la partie classes du script en tant que code "normal". Le code ci-dessus parvient à ouvrir la table de données Big Class et la fenêtre avec la Col List Box, mais chaque fois que je clique sur une colonne, j'obtiens une erreur :
Send attend un objet inscriptible dans l'accès ou l'évaluation de 'Send', clb << /*###*/Get Items /*###*/
Y a-t-il quelque chose que je fais mal ou que je ne comprends pas ? Ou est-ce quelque chose à voir avec la programmation de "On Change" ? Toute aide est appréciée!
Accès aux donnéesRe : Gérer "On Change" dans une classe en JSLIl s'agit d'un fil de discussion plus ancien, mais je voulais publier une solution supplémentaire qui, à mon avis, est très pratique lorsqu'il s'agit de fenêtres à l'intérieur des classes. Semblable à la solution de Jarmo, vous pouvez utiliser le message << Set Function, mais utilisez une définition de méthode. Il a à peu près les mêmes fonctionnalités qu'une fonction avec l'avantage supplémentaire d'évaluer dans le cadre de la classe, ce qui signifie que vous pouvez référencer des variables d'objet.
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 'this' fonctionne de la même manière que Jarmo l'a expliqué, mais vous pouvez également référencer n'importe quelle autre variable de la classe. Ici, « ceci » équivaut à « m_clb ».
Je trouve que l'utilisation des méthodes de cette manière est très pratique pour créer des fenêtres modulaires avec des composants interactifs.