bybalsendercase
Full メンバー
オフライン
投稿: 27
I'm a llama!
|
|
class Form1の値をclass SolidWorksMacroで利用したい
« 投稿日: 2015/08/23 - 16:55:56 » |
|
ご多忙中申し訳ありません。
class Form1の値をclass SolidWorksMacroのMessageBoxで表示したいのですが、現状のコードのままですとclass Form1のコードが素通りして値が取得できません。 なんかあまりにも初歩的な質問で恐縮ですが、教えてください。
public partial class SolidWorksMacro { public SldWorks swApp; public void Main() { Form1 f1 = new Form1(); f1.Show(); MessageBox.Show(f1.num.ToString()); } }
public partial class Form1 : Form { public Form1() { InitializeComponent(); } double _num; private void button1_Click(object sender, EventArgs e) { _num = 0.1; } public double num { get { return _num; } }
フォームにボタンを貼り付けてボタンをクリックしたらメッセージボックスに0.1が表示されるようにしたいと思います。
どうかよろしくお願いします。
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #1 投稿日: 2015/08/25 - 13:04:39 » |
|
bybalsendercaseさん、こんにちは
一番手っ取り早い方法は、フォームをShow→ShowDialogに変えて表示してあげることで、フォームが閉じられるまで処理待ちさせることが可能です。 ShowDialogを使うと、フォームが閉じられた状況も返すことが可能なので便利です。 ただし、フォーム表示中にSolidWorks側で操作が必要な場合は、ShowDialogは適さないので、Showで表示させる必要があります。 その場合は、「.net フォーム 値 保持」などで検索すると、いろいろ方法が調べられると思います
|
|
|
|
bybalsendercase
Full メンバー
オフライン
投稿: 27
I'm a llama!
|
|
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #2 投稿日: 2015/08/25 - 18:01:14 » |
|
hisaさんへ
お返事ありがとうございます。
>フォーム表示中にSolidWorks側で操作が必要な場合は まさに上記の通りです。
>「.net フォーム 値 保持」 こちらで検索してみます。
|
|
|
|
bybalsendercase
Full メンバー
オフライン
投稿: 27
I'm a llama!
|
|
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #3 投稿日: 2015/08/28 - 20:35:56 » |
|
hisaさんへ
こんばんは
ご多忙中大変申し訳ありません。
「.net フォーム 値 保持」で検索すれば簡単にできるとおもいきや マクロでは簡単にはいかないみたいです。
以下はMicrosoft Visual Studio 2012で書いたコードです。 #Form1にはボタンを2個貼り付けています。 #1個はForm2の表示のためです。 #もう一つはclass Form2から値を取りに行くためです。 #class Form2はボタンが1個、テキストボックスが1個貼り付けてあります。
// class Form2の作成 Form2 f2 = new Form2(); //string _str; private void button1_Click(object sender, EventArgs e) { //Form2の表示 f2.Show(); } private void button2_Click(object sender, EventArgs e) { //class Form2から値を取りに行く textBox1.Text = f2.str; }
//class Form1に渡す値の変数 static string _str; private void button1_Click(object sender, EventArgs e) { _str = textBox1.Text; } //textBox1の値をプロパティに読み取る public string str { get { return _str; } } }
こんな感じでForm1もForm2も消さないで値の受け渡しをしています。これと同じようにマクロでもForm1も消さないでclass SolidWorksMacroに値を渡したいと思います。
たぶんすご?く簡単なことかもしれませんが、しばらくプログラミングから遠ざかっていたため、よくわからなくなりました。
大変申し訳ありません、なにかヒントでもいいですのでご教示お願いします。 よろしくお願いします。
|
|
|
|
hisa
カタマリの王様!?
オフライン
投稿: 507
PANDA-Z!!
|
|
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #4 投稿日: 2015/09/18 - 11:38:47 » |
|
bybalsendercaseさん、こんにちは
あれから調べてみたのですが、まずForm1を表示してもMainの処理が終了してForm1が閉じてしまう件に関しては、実際にビルドしたものを実行する際には閉じない様です。 Debug中は、すべての処理が完了するとDebug完了と共にForm1も閉じてしまいます。 回避方法は、SolidWorksのシステムオプションにある「VSTAデバッグをマクロ終了時に停止」のチェックを外すだけで良いです
Form1表示中に、SolidWorksMacroで継続して処理させたい場合ですが、ちょっと工夫が必要見たいです この方法が最良かは分かりませんが、BackgrouodWorkerを使ってForm1が閉じるまで待機する処理を実行させれば良さそうです (多分…) 単純にForm1が閉じるまで繰り返すループ処理をMainに入れると、SolidWorks自体が操作できなくなるため、BackgrouodWorkerを使って後ろで待機させます。
コードは、こんな感じです。 bw.RunWorkerAsync()でbw_DoWorkが実行され、bw_DoWork内の処理が終わったらbw_RunWorkerCompletedが実行される感じです。
Code:using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; using System.Runtime.InteropServices; using System; using System.Windows.Forms; using System.ComponentModel;
namespace Macro1.csproj { public partial class SolidWorksMacro { Form1 frm1 = new Form1(); static BackgroundWorker bw;
public void Main() { //Form1表示 frm1.Show();
//バックグランドワーカー生成 bw = new BackgroundWorker(); //イベント登録 bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); // バックグランドワーカー開始 bw.RunWorkerAsync();
// Form1表示後にすぐ処理されてしまう… MessageBox.Show("まだ終わってない!"); }
/// <summary> /// The SldWorks swApp variable is pre-assigned for you. /// </summary> public SldWorks swApp;
void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bw = sender as BackgroundWorker;
//Form1が閉じる(非表示)になるまでループ開始 while (frm1.Visible == true) { // 1秒待機 System.Threading.Thread.Sleep(1000); } }
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("フォーム閉じた!"); } } } |
どのタイミングでSolidWorksMacro側に処理をさせるかが分からないので、とりあえずこんな感じで… Form1をメインフォームとしてSolidWorksMacro側で実行させようとしている処理をさせても良い気はしますが
|
|
|
|
bybalsendercase
Full メンバー
オフライン
投稿: 27
I'm a llama!
|
|
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #5 投稿日: 2015/09/19 - 04:54:49 » |
|
hisaさんへ
こんにちは
>「VSTAデバッグをマクロ終了時に停止」のチェックを外すだけで良いです
>BackgrouodWorkerを使ってForm1 >が閉じるまで待機する処理を実行させれば良さそうです
上記の2通りのパターンは非常に有効です。 BackgrouodWorkerは依然はよく使っていましたが、最近はプログラムから離れていましたので完全に忘れていました。
BackgrouodWorkerは少し癖がありますので、サンプルのコードを書いていただいたので助かりました。
貴重な情報を有難うございました。
|
|
|
|
bybalsendercase
Full メンバー
オフライン
投稿: 27
I'm a llama!
|
|
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #6 投稿日: 2015/09/19 - 04:55:43 » |
|
hisaさんへ
こんにちは
>「VSTAデバッグをマクロ終了時に停止」のチェックを外すだけで良いです
>BackgrouodWorkerを使ってForm1 >が閉じるまで待機する処理を実行させれば良さそうです
上記の2通りのパターンは非常に有効です。 BackgrouodWorkerは依然はよく使っていましたが、最近はプログラムから離れていましたので完全に忘れていました。
BackgrouodWorkerは少し癖がありますので、サンプルのコードを書いていただいたので助かりました。
貴重な情報を有難うございました。
|
|
|
|