- PR -

WindowsFormの状態を保持するには?

投稿者投稿内容
Hiro
会議室デビュー日: 2004/01/08
投稿数: 12
投稿日時: 2004-01-08 10:12
画面遷移するWindowsアプリケーションをC#で作成しています。
1→2→3と画面が進んで行くのですが、3→2→1と戻ることも出来るようになっています。つまり、画面の遷移は前後に自由に行えます。
そして、画面を戻った時には最後に表示した画面と同じ状態(画面への入力内容やフォーカス位置など)で表示させたいと思っています。

これを実現するために、最初に1,2,3の全ての画面のインスタンスを作成して保持しておき、保持しているインスタンスに対して順番にShowDialogとCloseをする方法を考えました。一度Closeした画面でも、画面遷移で戻ってきた時には同じインスタンスに対して再びShowDialogするという方法です。インスタンスを破棄していないので、ShowDialogした時には最後にCloseした状態と同じ状態の画面が開かれるはずです。

しかし、WindowsFormsライブラリの設計上、同一インスタンスのFormに対してShowDialogとCloseを繰り返し使用することは想定外であると聞き、この方法は使えないことがわかりました。

WindowsFormの状態を保持する方法として皆さんはどのような手法を採用していますか?
(それとも、あまりこういう要望は無いのでしょうか・・・)

ご教授ください。
よろしくお願いいたします。
kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 2004-01-08 10:51
Closeとかで閉じるのではなく
Visibleにて非表示にしてみては?
で、表示したいときにVisible=trueにするのではどうでしょう。
Hiro
会議室デビュー日: 2004/01/08
投稿数: 12
投稿日時: 2004-01-08 15:45
返信ありがとうございます。

ひとつ作成中のアプリケーションの前提を書き忘れておりました。
Formの制御用クラスを作ろうと思っています。
その制御用クラスでShowDialogし、Formが閉じられた際の戻り値を受けて次に呼ぶ画面を決定したり、それにパラメータを渡したりしようと思っています。

ShowDialogを使用するとFormが閉じられるまで呼び元クラスのコートが実行されないと思います。しかし、Visibleを操作した場合、呼び元クラスではそのまま処理が続行されてしまうので、そこをどうすれば良いでしょうか?
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-01-08 16:34
引用:

Hiroさんの書き込み (2004-01-08 10:12) より:
画面遷移するWindowsアプリケーションをC#で作成しています。
1→2→3と画面が進んで行くのですが、3→2→1と戻ることも出来るようになっています。つまり、画面の遷移は前後に自由に行えます。
そして、画面を戻った時には最後に表示した画面と同じ状態(画面への入力内容やフォーカス位置など)で表示させたいと思っています。



現在、進行中のプロジェクト(VB.NETですが)では、
下記のようにしています。参考までに。

Form1〜3のインスタンスはあらかじめ作成しておきます。
(仮にForm1〜3の変数にそれらは保持しているとします。)

Form1から次の画面への遷移の処理
Form2(←次に遷移する予定のインスタンス).Ownerにthis(つまりForm1)を設定し、
Form2.Showで表示、this.HideでForm1を非表示。

Form2から次の画面への遷移の処理

Form3(←次に遷移する予定のインスタンス).Ownerにthis(つまりForm3)を設定し、
Form3.Showで表示、this.HideでForm2を非表示。

Form2から元の画面への遷移の処理

this.Owner(つまりForm1).Show
this.Ownerをnullに設定
this.Hide

以下、Form3も同様です。

----(訂正)-----------
現在、進行中のプロジェクトでは、閉じる画面は完全に破棄するので
(戻るときにthis.Hideではなくthis.Closeで戻る)、
インスタンスはあらかじめ生成せずに、各画面の次の画面を開く場所で
インスタンスを生成しています。戻るときは上記方法で数珠つなぎで戻っていきます。


[ メッセージ編集済み 編集者: よねKEN 編集日時 2004-01-08 16:37 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-01-08 16:45
Hiroさん、こんにちは。

引用:

ShowDialogを使用するとFormが閉じられるまで呼び元クラスのコートが実行されないと思います。しかし、Visibleを操作した場合、呼び元クラスではそのまま処理が続行されてしまうので、そこをどうすれば良いでしょうか?


イベントかデリゲートを使用するようにしては如何でしょうか?

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-01-08 18:17
引用:

きくちゃんさんの書き込み (2004-01-08 16:45) より:

引用:

ShowDialogを使用するとFormが閉じられるまで呼び元クラスのコートが実行されないと思います。しかし、Visibleを操作した場合、呼び元クラスではそのまま処理が続行されてしまうので、そこをどうすれば良いでしょうか?


イベントかデリゲートを使用するようにしては如何でしょうか?


というか、消すのはHide、開くのはShowDialogでは駄目でしょうか?

そういえば、ShowDialogで表示したフォームをCloseするってかかれてましたけど、このCloseってのはどういうCloseなんでしょうか?
Closeメソッド?単にユーザの操作などでフォームを閉じること?

ShowDialogで表示したフォームは、明示的にCloseメソッドを呼び出さない限り、普通に閉じればCloseは呼ばれないと思いますが…
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-08 18:51
引用:

なちゃさんの書き込み (2004-01-08 18:17) より:

そういえば、ShowDialogで表示したフォームをCloseするってかかれてましたけど、このCloseってのはどういうCloseなんでしょうか?
Closeメソッド?単にユーザの操作などでフォームを閉じること?


 Closeメソッドによって「閉じる」のと、ユーザ操作によって「閉じる」のが、ごっちゃになっているようですね<元質問

 さらに、ShowDialogすると呼出元Formはさわれませんから、状態を戻すも何も、元のまま=質問は無意味では?
 フォーカスを持ったコントロールについては、例えばボタンをクリックしてForm2を表示させると、ボタンにフォーカスが移ってしまいますから、ちとややこしいかも。。。


 それとも、1→2→3→2→1と進んで、また2へ進んだときに、以前の内容を復元したい、ということでしょうか?これなら意味が通るなぁ。
 これだとして、、、保存/復元したいコントロール値に対するPublicなプロパティを作り、XMLにはき出す、とか。
Hiro
会議室デビュー日: 2004/01/08
投稿数: 12
投稿日時: 2004-01-08 19:13
色々とご意見ありがとうございます。
うまく伝わっていない部分があるようですので、書き込みいたします。

作成中のアプリケーションですが、まずはWindowsFormではない自作のクラスから処理を始めるようにしています。
Formの生成やShowDialog、Form間のパラメータの受け渡しは全てこのクラスがつかさどっています。FormからFormを直接呼び出しているわけではありません。
(各Formに遷移処理を記述すると収拾が付かなくなり、また見通しも悪くなるため、この制御クラスを作成しました)

そして、Form上に配置した「次へ進む」ボタンや、「前へ戻る」ボタンを押した時に自分でCloseメソッドを発行してFormを閉じ、制御クラスへ処理を戻しています。制御クラスに処理が戻ってきたら、制御クラスが次に表示するFormを決定し、パラメータを渡してShowDialogする、という構造にしています。

一度制御クラスに処理が戻る、というのがうまく伝わっていなかったようです。
申し訳ございませんでした。

スキルアップ/キャリアアップ(JOB@IT)