안녕!
테이블의 On Close 문 내에서 해당 테이블에 대한 참조를 얻는 데 도움이 필요합니다.
간단한 스크립트가 있습니다. "열기" 버튼이 있는 GUI가 있는데, 이 버튼을 누르면 데이터 테이블이 열리고, 테이블 목록이 있는 콤보 박스도 있습니다.
또한 테이블 이름을 키로, 테이블 참조를 값으로 하는 연관 배열을 사용하여 테이블들을 관리합니다.
이 스크립트에서 유지 관리해야 하는 기존 네임스페이스가 몇 개 있습니다. 콤보 상자에서 테이블을 제거하기 위해 OnClose 문에서 Eval(Eval Expr(Expr()))라는 방법을 사용하고 있습니다. 하지만 이 방법은 연관 배열에서 테이블을 제거하는 데는 작동하지 않습니다.
Function({this}, _dt = ((this << Child) << Get Data Table))을 사용하는 또 다른 트릭이 있습니다. 이 함수는 데이터 테이블에 대한 참조를 가져오는 데는 제대로 작동하지만, Eval(Eval Expr(Expr()))) 안에 넣으면 작동을 멈춥니다.
I tried to get the reference to the table separately, but looks like I don't know how Function({this}, ) works. How do I assign a result of this function to a variable?&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/P&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;P&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Anyways, here's the latest iteration of my script, please help me tweak it to make it work.&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/P&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;P&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Eventually, I will need to handle data table manual name changes somehow and reflect it in the combo box.&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/P&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;PRE&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;CODE class=" language-jsl"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Names Default To Here( 1 );
data = New Namespace(
"DataTables"
);
gui = New Namespace(
"GUI"
);
data:tablesListAA = [=&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; ];
gui:guiWindow = Expr(
Border Box( Left( 10 ), Right( 10 ), Top( 10 ), Bottom( 10 ), Sides( 15 ),
V List Box(
gui:cb = Combo Box(
{},
selection = gui:cb &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; GetSelected();
Print( "Selected: " || selection );
Current Data Table( data:tablesListAA[selection] );
Print( "Current Data Table: " || (Current Data Table() &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Name) );
),
Button Box( "Add Table",
filePath = Pick File(
"Select JMP File",
"$SAMPLE_DATA",
{"JMP Files|jmp;jsl;jrn", "All Files|*"},
1,
0,
"newJmpFile.jmp"
);
dt = Open( filePath );
Eval(
Eval Expr(
dt &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; On Close(
getTable = Function( {this},
_table = ((this &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Child) &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Data Table);
Return(_table);
);
_table = getTable(this);
Local( {data = Namespace( Expr( data &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Name ) ), gui = Namespace( Expr( gui &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Name ) ), _table = Expr(_table)},
Try(
_tableName = _table &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Name;
Print("Trying to remove: "||_tableName);
Remove From( data:tablesListAA, _tableName );
gui:cb &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Set Items( data:tablesListAA &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Keys );
)
)
)
)
);
dtName = dt &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Name();
Insert Into( data:tablesListAA, dtName, dt );
gui:cb &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Set Items( data:tablesListAA &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt; Get Keys );
)
)
)
);
nw = New Window( "Test table selection", gui:guiWindow );
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/CODE&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/PRE&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;br /&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/lingo-body&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;lingo-labs id="lingo-labs-918808" slang="en-US" mode="CREATE"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;lingo-label&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;Automation and Scripting&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/lingo-label&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/lingo-labs&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
보통 저는 On Close 이벤트에서 테이블 이름/참조를 평가합니다. <를 사용할 수도 있습니다. 이것은 데이터 테이블 창 을 참조하는 것입니다(스크립트 색인에 예제가 있습니다).
더 보기...
Names Default To Here(1);
data = New Namespace(
"DataTables"
);
gui = New Namespace(
"GUI"
);
data:tablesListAA = [=> ];
gui:guiWindow = Expr(
Border Box(Left(10), Right(10), Top(10), Bottom(10), Sides(15),
V List Box(
gui:cb = Combo Box(
{},
selection = gui:cb << GetSelected();
Print("Selected: " || selection);
Current Data Table(data:tablesListAA[selection]);
Print("Current Data Table: " || (Current Data Table() << Get Name));
),
Button Box("Add Table",
filePath = Pick File("Select JMP File", "$SAMPLE_DATA", {"JMP Files|jmp;jsl;jrn", "All Files|*"}, 1, 0, "newJmpFile.jmp");
dt = Open(filePath);
Eval(
Eval Expr(
dt << On Close(
tb = Expr(dt);
_tableName = tb << get name;
Print("Trying to remove: " || _tableName);
)
)
);
dtName = dt << Get Name();
Insert Into(data:tablesListAA, dtName, dt);
gui:cb << Set Items(data:tablesListAA << Get Keys);
)
)
)
);
nw = New Window("Test table selection", gui:guiWindow);
테이블 목록을 관리하려면 `Subscribe To Data Table List()` 함수를 사용하는 것도 고려해 볼 수 있습니다. 저는 이 함수를 사용하여 JMP 스크립트 편집기에서 볼 수 있는 테이블 목록과 매우 유사한 기능을 구현했으며, 이름 변경/테이블 폐쇄/개설을 처리할 수 있습니다(다만 구현이 더 복잡하고 몇 가지 문제점이 있습니다).
무슨 이유인지 모르겠지만, 이 사용 사례에서는 Eval(Eval Expr(Excpr)))에 테이블을 포함시키는 것이 잘못되었다고 판단했습니다. 다시 작성해 보겠습니다.