Re: JSL의 클래스 내에서 "변경 시" 처리실제로 내가 받는 오류 메시지는 다음과 같습니다.
이름 미해결: 'clb' 액세스 또는 평가의 clb, clb/*###*/
미안합니다!
Re: JSL의 클래스 내에서 "변경 시" 처리반원들이 가지고 있다고 생각합니다. 기본 로컬 당신이 원하든 원하지 않든 메커니즘. 입력
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 객체를 사용한 함수형 프로그래밍 . 나는 수업을 여러 번 사용하려고 시도했지만 결코 만족하지 못했습니다. 클래스가 정말 잘하는 것 중 하나는 참조로 전달하는 것이며, 이것이 클래스를 사용하는 가장 좋은 이유일 수 있습니다. 클래스 인스턴스에서 큰 배열을 래핑하면 배열의 복사본을 만들지 않고 사용자 작성 함수에 배열을 전달할 수 있습니다.
그리고 < 이것 매개변수가 상자를 가리키면 훨씬 쉬울 것입니다.
Re: JSL의 클래스 내에서 "변경 시" 처리<< Set Function은 함수 인수로 "this"가 있기 때문에 << On Change 대신 사용하기에 좋은 옵션일 수 있습니다. 결국 무엇을 하려는지에 따라 적어도 세 가지 다른 옵션이 있다고 말할 수 있습니다.
1. Craige가 제안한 대로 수행하고 Col 목록 상자에 대한 참조를 평가합니다.
2. << Set Function을 사용하면 이것을 참조할 수 있습니다(col 목록 상자 자체를 참조함). 동작이 약간 다르지만 애플리케이션에 영향을 미칠 수 있습니다.
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의 클래스 내에서 "변경 시" 다루기커뮤니티 안녕하세요!
Classes를 사용하는 동안 약간 막혔습니다. 그래서 누군가가 저를 도울 수 있기를 바랍니다.
약간의 컨텍스트: 저는 메인 스크립트와 함수 스크립트의 두 가지로 나누어진 스크립트를 작업하고 있습니다. 여기서 후자가 메인 스크립트에 포함됩니다. 변수가 있어야 할 때만 찾을 수 있도록 클래스 및 네임스페이스로 작업하려고 합니다. Col List Box에서 "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 데이터 테이블과 Col 목록 상자가 있는 창을 열 수 있지만 열을 클릭할 때마다 오류가 발생합니다.
Send는 'Send' 액세스 또는 평가에서 스크립터블 개체를 예상합니다. clb << /*###*/Get Items /*###*/
내가 잘못하고 있거나 이해하지 못하는 것이 있습니까? 아니면 "On Change"가 프로그래밍되는 방식과 관련이 있습니까? 도움을 주시면 감사하겠습니다!
데이터 접근Re: JSL의 클래스 내에서 "변경 시" 처리이것은 오래된 스레드이지만 클래스 내부의 창을 처리할 때 매우 편리하다고 생각되는 솔루션을 하나 더 게시하고 싶었습니다. 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'와 동일합니다.
나는 이런 방식으로 메소드를 사용하는 것이 대화형 구성 요소가 있는 모듈식 창을 만드는 데 매우 편리하다는 것을 알았습니다.