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

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

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

Re[2]: フォーム遷移について


(過去ログ 64 を表示中)

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

■36922 / inTopicNo.1)  フォーム遷移について
  
□投稿者/ non (3回)-(2009/06/10(Wed) 03:28:12)

分類:[C#] 

続けざまですみません。

実はそもそもWindows form アプリケーションはほとんど初めてで、ちょっと疑問に思う事があります。

Windows formアプリケーションのテンプレートでプロジェクトを作成するとMain関数の中でForm1のインスタンスが作成されますよね?
その後、画面遷移をしようとしてForm1の中で以下のような処理をするとプログラムが終了してしまいます。
Form2 frm2 = new Form2();
frm2.Show();
this.Close();
フォーム2のインスタンスを保持するインスタンスが無くなってしまうので当たり前といえば当たり前なのですが、Form1 −> Form2 −> Form3
のような遷移をしたい場合にはどのような処理がC#では常套手段なのでしょうか?
(今はForm1をメインのフォームとして必要無い時にHideしています)



引用返信 編集キー/
■36924 / inTopicNo.2)  Re[1]: フォーム遷移について
□投稿者/ れい (846回)-(2009/06/10(Wed) 07:05:59)
No36922 (non さん) に返信
> フォーム2のインスタンスを保持するインスタンスが無くなってしまうので当たり前といえば当たり前なのですが、Form1 −> Form2 −> Form3
> のような遷移をしたい場合にはどのような処理がC#では常套手段なのでしょうか?
> (今はForm1をメインのフォームとして必要無い時にHideしています)

C#なら Application.Run を、
VBなら WindowsFormsApplicationBase.ShutdownStyle あたりを参考にするとよいかと。
引用返信 編集キー/
■36928 / inTopicNo.3)  Re[1]: フォーム遷移について
□投稿者/ よねKEN (349回)-(2009/06/10(Wed) 09:49:44)
終了方法のカスタマイズについては、れいさんご指摘の

> C#なら Application.Run を、

のApplicationContextを引数に取るオーバーロードを使います。

> (今はForm1をメインのフォームとして必要無い時にHideしています)

私ならこのようにしますね。私が関わるような業務アプリでは、
メニュー画面がメインフォームになり、アプリを終了するときくらいしか閉じる必要がないので。

引用返信 編集キー/
■36934 / inTopicNo.4)  Re[1]: フォーム遷移について
□投稿者/ biac (123回)-(2009/06/10(Wed) 10:55:57)
biac さんの Web サイト
No36922 (non さん) に返信
> フォーム2のインスタンスを保持するインスタンスが無くなってしまうので当たり前といえば当たり前なのですが、Form1 −> Form2 −> Form3
> のような遷移をしたい場合にはどのような処理がC#では常套手段なのでしょうか?

本当に、そのようにフォームを順次表示していってプログラム終了、でいいんですか?
それなら、 これだけのことですけど… f(^^;

static class Program
{
 static void Main()
 {
  前処理();
  (new Form1()).ShowDialog();
  処理1();
  (new Form2()).ShowDialog();
  処理2();
  (new Form3()).ShowDialog();
  処理3();
 }
}

「画面遷移」っていう発想は、 昔のダム端 ( TSO 端末とか、 いろんな呼びかたがあります ) の時代のものです。
モニターには文字しか出せなくって、 画面全体でだいたい 80文字×25行くらいが表示できました。 そこに入力項目 ( イメージとしては TextBox ) が並んでいて、ユーザーがキーボードから入力項目にデータを入力して Enter キーを押すと、 その画面で入力した全部のデータがコンピューターに送り返され、 プログラムはそれを処理したら次の画面を端末に送信する… そんなふうにユーザーと対話するプログラムを作っていました。
その発想のまま、 (ダム端の 1画面分) = (Windows の 1フォーム) という解釈をすると、 「Form1 → Form2 → Form3 と画面遷移させる」 という設計が出てきます。 その設計をコードに落とすと、 上記のようなプログラムになります。

まずは、Form1 と Form2 と Form3 を分ける理由はなにか? …ということから見直してみてはどうでしょうか。
Form はひとつで、 その中に表示するものだけを切り替えれば良いのかもしれません。


> (今はForm1をメインのフォームとして必要無い時にHideしています)

よねKENさんが書かれたように、 Form1 をメニュー画面として、 そこでユーザーが選択した機能ごとに別の Form を出す、 というのが、 Windows 用の業務アプリケーションではよくあるパターンかと思います。
※ それは Form とロジックを緊密に結びつけてしまっている、 という設計になっているわけですが、 とりあえず今は不問に… f(^^;

その場合の 「画面遷移」 ( じつは Form1 はずっと存在しているので、 ダム端の画面遷移とは意味合いが違う ) は、 たとえば次のように書くことになりますね。
・ Form1(メニュー) → Form2(機能1) → Form1(メニュー)
・ Form1(メニュー) → Form3(機能2) → Form1(メニュー)
あるいは、 複数画面で 1機能を実装するとして
・ Form1(メニュー) → Form2(機能1A) → Form3(機能1B) → Form1(メニュー)
といった具合に、 元の画面に戻ってくる遷移が出てきます。


※ 「AからBに遷移する」 という言葉の本来の意味は、 「最初AであったものがBにうつりかわる (Aは存在しなくなる)」 ということです。 "Form1(メニュー)" を隠すどころか、 表示したままで "Form2(機能1)" を出す場合ですら、 なぜか慣習として 「画面遷移」 と言うことがありますが、 私にはすごく違和感があります。

引用返信 編集キー/
■36989 / inTopicNo.5)  Re[2]: フォーム遷移について
□投稿者/ non (4回)-(2009/06/11(Thu) 01:28:45)
返信ありがとうございます。
”ApplicationContextを引数に取るオーバーロード”
をもう少し噛み砕いて説明していただけるとありがたいのですが。。


No36928 (よねKEN さん) に返信
> 終了方法のカスタマイズについては、れいさんご指摘の
>
>>C#なら Application.Run を、
>
> のApplicationContextを引数に取るオーバーロードを使います。
>
>>(今はForm1をメインのフォームとして必要無い時にHideしています)
>
> 私ならこのようにしますね。私が関わるような業務アプリでは、
> メニュー画面がメインフォームになり、アプリを終了するときくらいしか閉じる必要がないので。
>
引用返信 編集キー/
■36990 / inTopicNo.6)  Re[2]: フォーム遷移について
□投稿者/ non (5回)-(2009/06/11(Thu) 01:40:31)
No36924 (れい さん) に返信
> ■No36922 (non さん) に返信
>>フォーム2のインスタンスを保持するインスタンスが無くなってしまうので当たり前といえば当たり前なのですが、Form1 −> Form2 −> Form3
>>のような遷移をしたい場合にはどのような処理がC#では常套手段なのでしょうか?
>>(今はForm1をメインのフォームとして必要無い時にHideしています)
>
> C#なら Application.Run を、
> VBなら WindowsFormsApplicationBase.ShutdownStyle あたりを参考にするとよいかと。

VSでフォームアプリケーションのテンプレートを使ってプロジェクトを作成すると、Application.Runは以下のように引数で初期フォームのインスタンスをとりますよね?
"Application.Run(new MainForm());"
これは、このアプリケーションが存在する間は MainForm が存在しなければならないということなのでしょうか?

久々にプログラムをしてみようとVC#をさわってみたのですが、なんだか世界が変わってしまっているようでいまいち感覚的にわかりません。。
(何年か前、最後にかかわったのはVB6です)



引用返信 編集キー/
■36992 / inTopicNo.7)  Re[2]: フォーム遷移について
□投稿者/ non (6回)-(2009/06/11(Thu) 01:56:02)
すみません。画面遷移という言葉が適切でなかったかもしれません。
表現したかったのは、以下のご指摘のようなかたちです。

>その場合の 「画面遷移」 ( じつは Form1 はずっと存在しているので、 ダム端の画面遷移とは意味合いが違う ) は、 たとえば次のように書くことになりますね。
>・ Form1(メニュー) → Form2(機能1) → Form1(メニュー)
>・ Form1(メニュー) → Form3(機能2) → Form1(メニュー)
>あるいは、 複数画面で 1機能を実装するとして
>・ Form1(メニュー) → Form2(機能1A) → Form3(機能1B) → Form1(メニュー)
>といった具合に、 元の画面に戻ってくる遷移が出てきます。

この場合にはやはりForm1が大元となって他のFormを呼び出し(呼び出し中にはForm1をHide)、必要な処理が終わったら破棄する・・というのが常套手段なのでしょうか?


引用返信 編集キー/
■37004 / inTopicNo.8)  Re[3]: フォーム遷移について
□投稿者/ よねKEN (352回)-(2009/06/11(Thu) 10:29:34)
No36989 (non さん) に返信
> ”ApplicationContextを引数に取るオーバーロード”
> をもう少し噛み砕いて説明していただけるとありがたいのですが。。

Application.Runメソッドのオーバーロード一覧
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.run(VS.80).aspx

ApplicationクラスのRunメソッドは、

(1) Application.Run()
(2) Application.Run(ApplicationContext)
(3) Application.Run(Form)

という3つのオーバーロードがあります。
(オーバーロードとは一つのメソッドを引数違いで多重定義することです)

通常は、(3)のFormクラスを引数に取るApplication.Runが使われますが、
この場合、引数で指定されたFormが閉じるとアプリが終了します。
終了方法をカスタマイズする場合は、(2)を使います。
((1)を使う方法もありますが、Formを閉じることをきっかけに終了するでしょうから、
(2)でよいはずです)

(2)の使い方の例は以下のURLが参考になるかと思います。
http://dobon.net/vb/dotnet/form/showforminsequence.html

No36992 (non さん) に返信
> すみません。画面遷移という言葉が適切でなかったかもしれません。

私は特に違和感ありませんでした。
今回ご説明されていた内容はどれも画面遷移だと思います。

> この場合にはやはりForm1が大元となって他のFormを呼び出し(呼び出し中にはForm1をHide)、必要な処理が終わったら破棄する・・というのが常套手段なのでしょうか?

元の画面に戻るなら、元の画面を非表示にして残しておくのは自然だと思いますよ。
引用返信 編集キー/
■37046 / inTopicNo.9)  Re[4]: フォーム遷移について
□投稿者/ non (8回)-(2009/06/11(Thu) 21:43:15)
No37004 (よねKEN さん) に返信

>
> ApplicationクラスのRunメソッドは、
>
> (1) Application.Run()
> (2) Application.Run(ApplicationContext)
> (3) Application.Run(Form)
>
> という3つのオーバーロードがあります。
> (オーバーロードとは一つのメソッドを引数違いで多重定義することです)
>
> 通常は、(3)のFormクラスを引数に取るApplication.Runが使われますが、
> この場合、引数で指定されたFormが閉じるとアプリが終了します。
> 終了方法をカスタマイズする場合は、(2)を使います。
> ((1)を使う方法もありますが、Formを閉じることをきっかけに終了するでしょうから、
> (2)でよいはずです)
>

ApplicationContextを引数にとった場合を少し調べてみました。
なるほど、これだとターゲットのフォームを入れ替えながらメインのメッセージループを維持できるんですね。

ありがとうございます。参考になりました。



解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -