回复:處理 JSL 類中的“On Change”實際上,我收到的錯誤消息是:
名稱未解析:clb 正在訪問或評估“clb”,clb/*###*/
對於那個很抱歉!
回复:處理 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,但你需要發明一種方法來獲得這個.
我寫了兩個關於類的博客,如何使用定義類和使用 JSL 對象的函數式編程. 我曾多次嘗試使用課程,但從未感到滿意。 一個類做得很好的一件事是通過引用傳遞,這可能是使用它們的最佳理由。 在類實例中包裝一個大數組可以將數組傳遞給用戶編寫的函數,而無需製作數組的副本。
如果只有 <這個參數,指向盒子,這會容易得多。
回复:處理 JSL 類中的“On Change”<< Set Function 可能是替代 << On Change 的好選擇,因為它具有“this”作為函數參數。 根據您最終要做什麼,我想說至少有三種不同的選擇
1. 執行 Craige 的建議並評估對 Col List Box 的引用
2. 使用<< 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(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 中處理類中的“On Change”你好社區!
我在使用 Classes 時遇到了一些困難,所以我希望有人可以幫助我。
一些上下文:我正在編寫一個腳本,該腳本分為兩個:主腳本和函數腳本,然後後者包含在主腳本中。 我正在嘗試使用類和命名空間,以確保僅在應該找到變量時才找到變量。 當嘗試將“On Change”功能與 Col 列錶框一起使用時,我的具體問題出現了。
我做了一個最小的工作示例來說明我的問題。 考慮主要代碼:
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 數據表以及帶有 Col 列錶框的窗口,但每當我單擊某一列時,都會收到錯誤:
發送在訪問或評估“發送”時需要可編寫腳本的對象,clb << /*###*/Get Items /*###*/
是我做錯了什麼,還是不理解? 還是與“On Change”的編程方式有關? 任何幫助表示讚賞!
數據存取回覆:在 JSL 類別中處理“On Change”這是一個較舊的線程,但我想發布另一個解決方案,我認為在處理類別內的視窗時非常方便。與 Jarmo 的解決方案類似,您可以使用 << Set Function 訊息,但使用 Method 定義。它具有與 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'。
我發現以這種方式使用方法對於創建具有互動式元件的模組化視窗非常方便。