Re: JSLのクラス内で「On Change」を扱う実際、私が得ているエラーメッセージは次のとおりです。
名前未解決: 'clb' のアクセスまたは評価の clb、clb/*####*/
ごめんなさい!
Re: JSLのクラス内で「On Change」を扱うクラスのメンバーにはデフォルトのローカルあなたが望むかどうかに関係なく、メカニズム。 の
method1 = Method({},
this:window = New Window( "Test Window", clb = Col List Box( all, On Change( Show( clb << Get Items ) ) ) );
);
clb は method1 の実行時に割り当てられ、method1 が戻ると忘れられます。 その後、OnChange メソッドを実行すると、それが見つかりません。 迅速で不完全な修正が必要な場合は、clb をよりグローバルにします。
より良い、しかし醜い修正には、clb の代わりに 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();
これおそらくあなたが期待することをしません。 C++ の this-> に相当するものはなく、メモリ リークを発生させずに発明するのは難しいでしょう。 上記の例では、埋め込む方がさらに良いでしょうこれclbではなく、取得する方法を発明する必要がありますこれ.
クラスについてのブログを2つ書きましたが、クラス定義の使い方とJSL オブジェクトを使用した関数型プログラミング. クラスを何度か使用しようとしましたが、満足できませんでした。 クラスが本当にうまく機能することの 1 つは参照渡しであり、それがクラスを使用する一番の理由かもしれません。 クラス インスタンスで大きな配列をラップすると、配列のコピーを作成せずに、ユーザーが作成した関数に配列を渡すことができます。
<これパラメータをボックスに指定すると、これは非常に簡単になります。
Re: JSLのクラス内で「On Change」を扱う<< Set Function は、関数の引数として「this」があるため、 << On Change の代わりに使用するのに適したオプションです。 最終的に何をしようとしているのかにもよりますが、少なくとも3つの異なるオプションがあると思います
1. Craige の提案を実行し、Col List Box への参照を評価します。
2. << セット関数を使用すると、これを参照できます (列リスト ボックス自体を参照します)。 これらの動作は少し異なりますが、アプリケーションに影響を与える可能性があります
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. ウィンドウ スコープを使用します (スクリプトガイド > プログラミング方法 > 高度なスコープと名前空間 > スコープ名)
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();JSL のクラス内での「変更時」の処理こんにちはコミュニティです!
クラスの使用中に少し行き詰まったので、誰かが助けてくれることを願っています。
少し文脈を説明します。私はメイン スクリプトと関数スクリプトの 2 つに分かれたスクリプトに取り組んでいます。後者はメイン スクリプトに組み込まれています。 クラスと名前空間を使用して、変数が見つかるはずのときにのみ見つかるようにしようとしています。 私特有の問題は、列リスト ボックスで "On Change" 関数を使用しようとしたときに発生します。
私の問題を説明する最小限の実用的な例を作成しました。 メインコードを考えてみましょう。
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();
そしてクラススクリプト:
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 ) ) ) );
);
);アイデアは、データ テーブルからいくつかの列を選択できるウィンドウを開いて、選択した列を含むリストを取得することです。 これは、クラスを使用しない場合、つまりスクリプトのクラス部分を「通常の」コードとして記述するだけの場合には正常に機能します。 上記のコードは、Big Class データ テーブルと列リスト ボックスを含むウィンドウを開くことができますが、列をクリックするたびにエラーが発生します。
Send は、「Send」へのアクセスまたは評価でスクリプト可能オブジェクトを期待します、clb << /*###*/Get Items /*###*/
何か間違っていることや、理解していないことはありますか? それとも「On Change」のプログラム方法に関係があるのでしょうか? 助けていただければ幸いです。
データアクセスRe: JSL のクラス内での「On Change」の扱いこれは古いスレッドですが、クラス内でウィンドウを扱うときに非常に便利だと思う解決策をもう 1 つ投稿したいと思いました。 Jarmo のソリューションと同様に、<< Set Function メッセージを使用できますが、メソッド定義を使用します。これは関数とほぼ同じ機能を持ちますが、クラスのスコープ内で評価できるという追加のボーナスがあり、オブジェクト変数を参照できることを意味します。
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();「this」変数は Jarmo が説明したのと同じように機能しますが、クラスから他の変数を参照することもできます。ここで、「this」は「m_clb」に相当します。
この方法でメソッドを使用すると、対話型コンポーネントを含むモジュラー ウィンドウを作成するのに非常に便利であることがわかりました。