JSL Throw() が期待どおりに機能しない場合のヘルプ親愛なるみんな、
(JMP プロ 16.1.0、Win10)
以前の投稿に関連する問題がありますここ、「裏話」に興味があるなら。
私が現在抱えている主な問題は、Throw() コマンドが期待どおりに動作しないことです。 私のコード (完全なコードについては最後を参照) には、現在開いているグラフ ビルダー レポートがあるかどうかを確認するテストがいくつかの場所にあります。これは次のようになり、 Expr() ステートメントでラップされています。
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
問題は、コードを実行するたびに (ツールバーのホットボタンから実行しているかのように)、これらの行がスキップされ、開いているレポートがない場合は無視されるようです。 ただし、コードを「行ごと」に実行すると、開いているレポートがないことが正しく検出され、ユーザーに通知されます。
組織全体のユーザーに配布するコードを作成しようとしており、さまざまな種類の状況に対処できるほど堅牢にしようとしています。たとえば、ユーザーが 1 つ以上のデータ テーブルを開いている場合、および/または 1 つ以上のプロジェクトを開いている場合 (つまり、複数のデータテーブルを含めることができます)。
コードの概念は次のとおりです (問題は項目 6 で発生します)。ユーザーはグラフ ビルダーでグラフィックを作成しており、グラフィックの定期的な変更を行いたいと考えます (詳細については上記のリンクを参照してください)。その後、ユーザーはツールバーをクリックします。上記のアクションを実行するためのホットボタン。
- このコードは、Graphic_Expr 式を実行して、グラフィックの場所を決定します。グラフィックが「スタンドアロン」データ テーブル内にあるのか、プロジェクト内にあるのか (選択できるオプションは 1 つだけです)。 -> (へ移動)
- どのチェックボックスが選択されているかに応じて、コードは dt_win_Expr または prj_win_Expr コードを実行します (現時点では、コードをテストするときにデータ テーブル オプションのみを設定していますが、最終的にはほぼ同じように機能することが理想的です)。 。 -> (へ移動)
- スタンドアロン データ テーブルの場合は、dt_win_Expr が実行され、ユーザーが編集するグラフィックが存在するデータ テーブルを選択するためのウィンドウが作成されます。 ユーザーが複数のデータ テーブルを開いて、複数のグラフ ビルダーを開いている可能性があることを思い出してください。 | (または)
- 同様に、ユーザーがプロジェクトを選択すると、prj_win_Expr (まだ完了していません) が実行され、ユーザーにどのプロジェクト (複数が開いている場合) とそのプロジェクト内の後続のデータ テーブルを選択させます。 -> (へ移動)
- データ テーブルが選択されると、スタンドアロンであってもプロジェクト内であっても、コードは SquarifyWin_Expr 式を実行します。 ここで最初に行うことは、実際に現在のレポートが存在するかどうかをテストすることです (上記の If() コード) (現在のレポートがグラフ ビルダーであるかどうかを変更してテストする必要がある場合があります)。 **ここでは、コードが期待どおりに機能しません。 グラフ ビルダーが開かれていない場合でも、警告がスローされると、グラフ ビルダーはコードの残りの部分を続行します。** すべてがうまくいけば....-> (次へ)
- ピクセルの寸法と二乗するかどうかに基づいて、コードは RprtUpdate_Expr 式を実行し、必要な更新をグラフ ビルダー レポートに送信します。
この説明が意味を成し、私が望むプログラミング パス/機能が何であるかを理解するのに役立つことを願っています。
解決策を見つけるためにご協力をお願いいたします。 最後に完全な JSL コード。
ありがとう!、
DS
Names Default To Here( 1 );
Clear Symbols();
RprtUpdate_Expr = Expr(
gb = Current Report()[Outline Box( 1 )] << Get Scriptable Object;
Report( gb )[framebox( 1 )] << FrameSize( widthN, heightN );
theMax = Max( Report( gb )[axisbox( 1 )] << get max, Report( gb )[axisbox( 2 )] << get max );
theMin = Min( Report( gb )[axisbox( 1 )] << get min, Report( gb )[axisbox( 2 )] << get min );
Report( gb )[framebox( 1 )] << Xaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << Yaxis( Min( theMin ), Max( theMax ) );
Report( gb )[framebox( 1 )] << AddGraphicsScript(
xmin = X Origin();
xmax = X Origin() + X Range();
ymin = Y Origin();
ymax = Y Origin() + Y Range();
Pen Color( "blue" );
Pen Size( 1 );
Line Style( "solid" );
Line( {xmin, ymin}, {xmax, ymax} );
);
);
SquarifyWin_Expr = Expr(
If( Is Empty( Current Report() ) == 1,
Throw( "No Graph Builder Window is Open" )
);
nwin = New Window( "Enter Size of Desired Graph",
<<RETURN result=""></RETURN>マスカスタマイゼーションRe: JSL Throw() が期待どおりに機能しないに関するヘルプやあ@jthiと@David_Burnham 、
フィードバックとアイデアをお寄せいただきありがとうございます。 ミニ モーダル ウィンドウが気に入っています。グラフ ビルダーが開いているかどうかをテストするときに便利です。
私は状況を変えてコードを完全に書き直すことにしました。 これで私が望むことを実行できますが、また、どのグラフビルダーインスタンスがどのプロジェクトのものであるかを連想配列を通じて追跡します。 データ テーブルでは、複数開いていても、単一のデータ テーブル内であっても、グラフ ビルダーの異なるインスタンスを区別するのに問題はありませんが、プロジェクトには複数のタブがあるため、グラブ ビルダーの割り当てを確認する必要がありました。スクリプト可能オブジェクトは正しいプロジェクトに関連付けられました。 AA を使用することができ、彼らに手伝ってもらうことができてとても嬉しかったです。 新しいコードでは、データ テーブル (またはプロジェクト) のみが開いているのか、その両方が開いているのかに応じて、最初のウィンドウも変更されます。
これはちょっとした良い試みだったので、楽しく取り組むことができました。 もう少しテストした後、組織と共有します。 興味があれば、以下にコードを示します。 考えられるすべてのプロジェクトを通過し、プロジェクト内のすべてのウィンドウを通過するときに For Each() を機能させる方法が分からなかったので、代わりに For() ループを実行しました。
ありがとう!、
DS
//JSL to add diagonal line and automatically resize to desired size
//Written by SDF1 with help/input from jthi, txnelson, Craige_Hales, David_Burnham, and Mark_Bailey
Names Default To Here( 1 );
Clear Symbols();
lb_width = 80;
Lines_n = 6;
mmw = Function( {title, text, text_icon = "BlankIndex", window_icon = "NewApplication"},
{Default Local},
New Window( title,
<<MODAL></MODAL>Re: JSL Throw() が期待どおりに機能しないに関するヘルプグラフビルダーウィンドウのスキャンの例:
getGraphBuilderWindows = function({},{default local},
lst = {};
winList = getWindowList();
for each({win},winList,
winTitle = win << getWindowTitle;
if (contains(winTitle,"Graph Builder"),
insertinto(lst,win)
)
);
return(lst);
);
lstGBWindows = getGraphBuilderWindows();Re: JSL Throw() が期待どおりに機能しないに関するヘルプまた、CurrentReport は、作成中のウィンドウも含め、開いているウィンドウを検索することにも注意してください。ウィンドウをグラフ ビルダーとして識別するには、表示ツリー (たとえば、OutlineBox(1)) を調べる必要があります。他のウィンドウを開いている場合は、そのウィンドウが最新ではない可能性があるため、開いているウィンドウのリストを検索してください。
Re: JSL Throw() が期待どおりに機能しないに関するヘルプコードに診断を入れてみてください。
置いた
show ( Current Report() );
テストの前に次のように報告されました。
Current Report() = DisplayBox[HeadBox];
空ではない。
Re: JSL Throw() が期待どおりに機能しないに関するヘルプJMP ログに印刷があるかどうかを確認しましたか? Throw はトリガーされる可能性がありますが、「エラー ウィンドウ」が存在しないだけです。 少なくともアドインを使用する場合、Throw はスクリプトとして実行する場合のようにエラー ウィンドウを作成しないため、カスタム エラー モーダル ウィンドウを使用します。
モーダルダイアログThrow の代わりに使用できる非常に単純なアラート関数があります (スローすることもできますが、モーダル ウィンドウを使用してユーザーにエラーを表示します)。
編集:
情報モーダルウィンドウに使用した関数が 1 つ見つかりました。
Names Default To Here(1);
mini_modal_window = function({title, text, text_icon = "BlankIndex", window_icon = "NewApplication"}, {Default Local},
New Window(title, <<MODAL></MODAL>