質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

17151閲覧

コンソールアプリケーションでFormを使う

gari

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2015/08/19 19:16

コンソールアプリケーションで開発しています。
コンソールアプリケーション上で処理している配列を
引数にしてFormアプリケーションを呼び出し、
配列内の数字に応じて画像を描画したいのですが、
コンソールアプリケーション上でFormがうまく扱えません。

コンソールアプリケーションを開始した時にFormを作成し、
Formに値を渡したタイミングで描画されなおされ
かつ、バックグラウンド(って表現で合ってるかわからないですが)で処理され続けるようにしたいのです。

イメージとしては、

C#

1public static void Main(string[] args) 2{ 3 System.Windows.Forms.Application.Run(new System.Windows.Forms.Form()); 4 5 Form1 app = new Form1(); 6 int[] value = new int[9]; 7 //コンソールアプリケーション処理で valueに値を入れる 8 app(value); 9} 10class Form1 : Form 11{ 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 Image[] image = new Image[] 17 { 18 Image.FromFile("imag\\000.bmp"), 19 Image.FromFile("imag\\001.bmp") 20 }; 21 private void Form1_Paint(object sender, PaintEventArgs e) 22 { 23 swtch(app_value[0]) 24 { 25 case 0: 26 e.Graphics.DrawImage( image[0] ); 27 } 28 } 29}

という感じで、配列内の数字をFormでグラフィカルに表示したいです。
どうしたら良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

普通に作成した場合、1つのプログラムでは1つしか命令が動きません(シングルスレッド)
つまりコンソールアプリと画面のアプリはどちらかが動いていたらどちらかが止まります。
これを回避するにはいくつかの方法があります。

・見せかけ上で同時に動いているようにする(イベントなど)
→イベント駆動についての知識が必要

・プログラム内で別スレッドで同時実行する
→並列プログラミングの知識が必要

・そもそも別のEXEプログラムとする(Excelとメモ帳のように)
→プロセス間でデータのやりとりをする方法が必要(例えばコピペバッファを使うとか)

どれも一長一短があるのでどれとは言えません。
簡単に2ついっぺんに動かすという事はできないかと思います。意外と大変です。
ちなみにWindows.FormsではApplication.Run内でFormの処理(表示や入力など)をずっとぐるぐるやっています。
そのためそれより下のプログラムは動きません。

投稿2015/08/27 16:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

イメージのソースを基にするのであれば

Main関数の開始直後にフォーム生成・表示を行う

C#

1 Form1 app = new Form1(); 2 app.Show();

class Form1にデータ設定用のメソッドを追加し、データをセットする際にReflesh関数を呼ぶ

C#

1 public void SetValue(int[] value) 2 { 3 // valueの要素数をチェックしてからapp_valueにコピー(略) 4 5 // Formの再描画 6 Reflesh(); 7 }

Reflesh関数を呼ぶとフォームの再描画イベントが発生するので、Form1_Paint()が呼ばれます。
Main関数ないのデータを更新したい箇所でapp.SetValue()で値をセットします。
実際に試してませんが、こんな感じでできると思います。

投稿2015/08/20 01:16

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gari

2015/08/20 08:19 編集

```C# public static void Main(string[] args) { System.Windows.Forms.Application.Run(new System.Windows.Forms.Form()); Form1 app = new Form1(); app.Show(); } ``` こうやって Formを作成出来たのですが、 >>System.Windows.Forms.Application.Run(new System.Windows.Forms.Form()); のところでコンソールアプリケーション側の処理が止まってしまいます。 Form作成後もコンソールアプリケーションの処理を続ける場合どうしたらよいのでしょうか
KoichiSugiyama

2015/08/20 09:54

>System.Windows.Forms.Application.Run(new System.Windows.Forms.Form()); この行を消してみてください。
KoichiSugiyama

2015/08/20 11:54

あと注意点としてフォームをMain関数の中で呼ぶ場合、ループ処理などが走る際に適宜Application.DoEvents()を呼んでやらないと、フォームの描画が止まったりします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問