C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 別プロジェクトのフォームを呼び出したい


(過去ログ 49 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■26711 / inTopicNo.1)  別プロジェクトのフォームを呼び出したい
  
□投稿者/ Yossi (1回)-(2008/10/18(Sat) 15:08:23)

分類:[C#] 

VS2005 C#で作成されている 一つのソリューションがあります、その中に複数の
プロジェクトがあるのですが

自分が作ったプロジェクトをそのソリューションに追加することはできたのですが
その自分が作ったプロジェクトのフォームを 他の既存のプロジェクトから呼び出
すにはどうしたらよいのでしょうか?
using でそのプロジェクトのクラス名とかネームスペースではだめでした。

なんかものすごく低レベルな質問で申し訳ないのですがご存知の方アドバイスを
お願いします。



引用返信 編集キー/
■26712 / inTopicNo.2)  Re[1]: 別プロジェクトのフォームを呼び出したい
□投稿者/ 渋木宏明(ひどり) (920回)-(2008/10/18(Sat) 15:25:44)
渋木宏明(ひどり) さんの Web サイト
> using でそのプロジェクトのクラス名とかネームスペースではだめでした。

の前に、プロジェクト参照の追加が必要です。

ソリューションエクスプローラで、自分が作成したプロジェクトの配下にある「参照設定」フォルダのコンテキストメニューを開き、「参照の追加」を選択します。

「参照の追加」ダイアログが表示されたら「プロジェクト」タブを選択し、利用したいフォームが含まれているプロジェクト名を選択して、OK します。


引用返信 編集キー/
■26713 / inTopicNo.3)  Re[2]: 別プロジェクトのフォームを呼び出したい
□投稿者/ Yossi (3回)-(2008/10/18(Sat) 16:05:38)
Yossi さんの Web サイト
No26712 (渋木宏明(ひどり) さん) に返信
>>using でそのプロジェクトのクラス名とかネームスペースではだめでした。
>
> の前に、プロジェクト参照の追加が必要です。
>
> ソリューションエクスプローラで、自分が作成したプロジェクトの配下にある「参照設定」フォルダのコンテキストメニューを開き、「参照の追加」を選択します。
>
> 「参照の追加」ダイアログが表示されたら「プロジェクト」タブを選択し、利用したいフォームが含まれているプロジェクト名を選択して、OK します。
>
>

渋木宏明(ひどり) さん アドバイスありがとうございます。

教えていただいた方法でまずは普通に参照設定しました。
ビルドが通りました。ありがとうございます。
ただビルドは通るものの、実行時にプログラム自体が落ちてしまいます。
その時の参照は exe に対してでした

それで今度はクラスライブラリとしてつまり DLLにして参照して実行して
みました。

しかし,結果は exe への参照とおなじで、呼び出し側のプロジェクト
のボタンをクリックした時に、以下のコードで呼び出しているのですが
瞬間に落ちてしまいます。

なぜかブレークポイントを設定しても止まりません、これもちょっと
なぞなのですが

下の関数の中で
MessageBox.Show("myform"); だけなら正常に動作するのですが

参照設定した フォームを呼び出すと MessageBoxのメッセージも
出さずに落ちてしまいます。

private void mybutton_Click(object sender, EventArgs e)
{
MessageBox.Show("myform");

myProject.Form1 myform = new myProject.Form1();
myform.show();
Application.Run(myform);
}

なぜこうなるのかわかりません、引き続きお時間が許せばコメント
いただけると幸いです。

引用返信 編集キー/
■26714 / inTopicNo.4)  Re[3]: 別プロジェクトのフォームを呼び出したい
□投稿者/ 渋木宏明(ひどり) (921回)-(2008/10/18(Sat) 17:23:23)
渋木宏明(ひどり) さんの Web サイト
> その時の参照は exe に対してでした

C# のプロジェクトなら、.exe のプロジェクトであっても基本的には問題ありません。
あまり無計画にやらない方がいいとは思いますが。

> なぜこうなるのかわかりません、

一般論でいえば問題ないはずです。
参照している/あるいはされているプロジェクトに固有の問題だと思うので、実装の詳細が分からないと何とも言えません。

引用返信 編集キー/
■26715 / inTopicNo.5)  Re[4]: 別プロジェクトのフォームを呼び出したい
□投稿者/ Yossi (4回)-(2008/10/18(Sat) 17:42:08)
Yossi さんの Web サイト
No26714 (渋木宏明(ひどり) さん) に返信
>>その時の参照は exe に対してでした
>
> C# のプロジェクトなら、.exe のプロジェクトであっても基本的には問題ありません。
> あまり無計画にやらない方がいいとは思いますが。
>
>>なぜこうなるのかわかりません、
>
> 一般論でいえば問題ないはずです。
> 参照している/あるいはされているプロジェクトに固有の問題だと思うので、実装の詳細が分からないと何とも言えません。
>

渋木宏明(ひどり)さん ありがとうございます。

試しに、ごく単純な二つのプロジェクトを持つソリューションを
作ってみました
渋木さんの参照に関するアドバイスを適用し、以下の呼び出しで
別プロジェクトのフォームを呼び出せました。

private void mybutton_Click(object sender, EventArgs e)
{
myProject.Form1 myform = new myProject.Form1();
myform.show();
}

何かソリューション本体に問題があるようです。
ありがとうございました。
解決済み
引用返信 編集キー/
■26716 / inTopicNo.6)  Re[5]: 別プロジェクトのフォームを呼び出したい
□投稿者/ 渋木宏明(ひどり) (922回)-(2008/10/18(Sat) 22:35:05)
渋木宏明(ひどり) さんの Web サイト
>>一般論でいえば問題ないはずです。

ごめんなさい、Form 表示を行うコードをちゃんと見てませんでした。
問題アリアリです。

>private void mybutton_Click(object sender, EventArgs e)
>{
>MessageBox.Show("myform");
>
>myProject.Form1 myform = new myProject.Form1();
>myform.show();
>Application.Run(myform);
>}

では

>Application.Run(myform);

が余分です。GUI アプリケーションとして正しい動作は望めません。

引用返信 編集キー/
■26717 / inTopicNo.7)  Re[6]: 別プロジェクトのフォームを呼び出したい
□投稿者/ Yossi (5回)-(2008/10/19(Sun) 09:22:42)
Yossi さんの Web サイト
No26716 (渋木宏明(ひどり) さん) に返信
>
> >Application.Run(myform);
>
> が余分です。GUI アプリケーションとして正しい動作は望めません。

ご指摘ありがとうございます。

■26715で書くべきだったのですが、Application.Run(myform);は、そのまま実行
しますとデバッガがその行で

単一スレッドで2回目のメッセージループを開始することは有効な操作ではあり
ません。FormShowDialogを使用してください。

とメッセージを表示しましたので、直後にその行は無効にしましたがそれでも
動かしたいソリューション内では動きませんでした。

COMとかを多用しているソリューションのようなのでかなり複雑です。
といっても自分のプロジェクトのアセンブリを COM参照可能にしても
ダメなのですが・・・
このあたりはもっと基礎から理解しないと刃が立たないことを痛感しています。

渋木さんを初めとしてここでサクサク回答できるみなさんは
どんな勉強をしておられるのか?思考のパターンがちがうのか・・


引用返信 編集キー/
■26718 / inTopicNo.8)  Re[7]: 別プロジェクトのフォームを呼び出したい
□投稿者/ 渋木宏明(ひどり) (923回)-(2008/10/19(Sun) 09:43:56)
渋木宏明(ひどり) さんの Web サイト
2008/10/19(Sun) 10:33:34 編集(投稿者)

> とメッセージを表示しましたので、直後にその行は無効にしましたがそれでも
> 動かしたいソリューション内では動きませんでした。

ですか。とするとやはり、何か固有の問題があるってことですね。

> COMとかを多用しているソリューションのようなのでかなり複雑です。

もし ActiveX コントロールを利用しているなら、新たに作成したプロジェクトの Main() メソッドに STAThread 属性が付加されているかどうかを確認してください。

それで足りないようなら、正常に動作しているプロジェクトの方でどういった初期化処理をしているかとかを丹念に見ていくしかないですね。


引用返信 編集キー/
■26719 / inTopicNo.9)  Re[8]: 別プロジェクトのフォームを呼び出したい
□投稿者/ Yossi (6回)-(2008/10/19(Sun) 10:38:37)
Yossi さんの Web サイト
No26718 (渋木宏明(ひどり) さん) に返信

> COM を利用しているなら、新たに作成したプロジェクトの Main() メソッドに STAThread 属性が付加されているかどうかを確認してください。
>
> それで足りないようなら、正常に動作しているプロジェクトの方でどういった初期化処理をしているかとかを丹念に見ていくしかないですね。

重ね重ねありがとうございます。

[STAThread]属性はありました。つけた覚えはないのですが・・
でも属性についてググッてみて色々勉強になりました。m(__)m

腑に落ちないのは
デリゲートの中で他のプロジェクトのフォームを呼んだら落ちるのに
以下のようにコードでフォーム生成して表示することには問題がありません

private void mybutton_Click(object sender, EventArgs e)
{
 Form myform = new Form();
 myform.show();
}

ということは呼び出される側に問題アリと考えて良いのでしょうか?
なぜかブレークポイントが効かなくて動作を追えないのが辛いところです。


引用返信 編集キー/
■26721 / inTopicNo.10)  Re[9]: 別プロジェクトのフォームを呼び出したい
□投稿者/ 渋木宏明(ひどり) (924回)-(2008/10/19(Sun) 11:54:58)
渋木宏明(ひどり) さんの Web サイト
> デリゲートの中で他のプロジェクトのフォームを呼んだら落ちるのに
> 以下のようにコードでフォーム生成して表示することには問題がありません

てことは、そのデリゲートが「どのスレッドから呼び出されているのか」が問題な気がします。

例えば、System.Threading.Timer の TimerCallback なんかはアプリケーションのプライマリスレッドとは異なるスレッドから呼び出されるので、TimerCallback 内で直接的にフォームを表示行おうとすると、様々な不都合が発生します。

こういった問題は、通常 Control.Invoke(), Control.BeginInvoke() を利用することで回避します。

引用返信 編集キー/
■26722 / inTopicNo.11)  Re[10]: 別プロジェクトのフォームを呼び出したい
□投稿者/ Yossi (7回)-(2008/10/19(Sun) 13:10:20)
Yossi さんの Web サイト
No26721 (渋木宏明(ひどり) さん) に返信

>
> てことは、そのデリゲートが「どのスレッドから呼び出されているのか」が問題な気がします。
>
> 例えば、System.Threading.Timer の TimerCallback なんかはアプリケーションのプライマリスレッドとは異なるスレッドから呼び出されるので、TimerCallback 内で直接的にフォームを表示行おうとすると、様々な不都合が発生します。
>
> こういった問題は、通常 Control.Invoke(), Control.BeginInvoke() を利用することで回避します。

渋木さん ありがとうございます。
おやすみのところ恐縮です。
ただ内容は、半分ぐらい付いてゆけません Orz

これでテキトーに触って動いたとしても精神衛生上良くないので
C#と .NETを基礎から固めて出直します。

貴重な示唆を与えてくださったことに感謝します。m(_ _)m


解決済み
引用返信 編集キー/
■26725 / inTopicNo.12)  Re[11]: 別プロジェクトのフォームを呼び出したい
□投稿者/ 渋木宏明(ひどり) (925回)-(2008/10/19(Sun) 17:30:48)
渋木宏明(ひどり) さんの Web サイト
> ただ内容は、半分ぐらい付いてゆけません Orz

表面的にはそれほど難しい話ではありません。

「デリゲート内で Form を表示しようとするとコケる」ということなので

・その時、デリゲートはアプリケーションのプライマリスレッドとは異なるスレッドから呼び出されている
・そのスレッドは STA ではない
・結果、Form に配置された ActiveX コントロールのインスタンス生成でコケている

と仮定しました。

また、基本的に Windows の GUI はプライマリスレッドで使用するべきものです。(=ここを「何故?」と問うと小難しい話になります)

なので、もし、件のデリゲートが別スレッドから呼び出されているようなら、「Control.Invoke() や Control.BeginInvoke() を使用して、Form2 の表示をプライマリスレッドに委譲すればよい」ということです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -