- PR -

VB6 での画面遷移方法について

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-11-10 10:55
VB6 での画面遷移について、みなさんのご意見を伺いたいと思って、スレを立てました。

例えば、
コード:
ログイン − メニュー − 一覧画面 − メンテ画面
              ・      ・
              ・      ・
              ・      ・


というような構成のシステムがあったとします。

メニュー画面には、各一覧画面へ遷移するためのボタンが貼り付けてあります。
一覧画面では DataGrid や SPREAD 等で各テーブルのデータを一覧形式で表示します。
一覧画面でメンテ対象データを選択し、画面上にある「追加」「更新」「削除」ボタンを押すと、各メンテ画面に遷移します。
メンテ画面で、メンテナンスが正常終了すると、自動的に一覧画面に戻り、最新の状態を表示します。

このような仕組みのシステムの場合、通常、画面遷移ってどうやってやるものなのでしょうか?

私なんかは、メンテ画面から一覧画面に戻る際に最新の状態を表示する必要があるため、一覧画面の「Form_Load」で一覧に表示するようにしておき、

【一覧画面 → メンテ画面】
メンテ画面.Show
Unload Me

【メンテ画面 → 一覧画面】
一覧画面.Show
Unload Me

なんてやってしまいます。
画面上、1画面しかユーザが触れないようにする必要があるため、Unload しています。

でも、毎回、Load & Unload するのは無駄なのかな、とも思ったり。
モーダルを使う方法が一般的だったりするんですかね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-10 12:52
引用:

ひろれいさんの書き込み (2006-11-10 10:55) より:

私なんかは、メンテ画面から一覧画面に戻る際に最新の状態を表示する必要があるため、一覧画面の「Form_Load」で一覧に表示するようにしておき、

【一覧画面 → メンテ画面】
メンテ画面.Show
Unload Me

【メンテ画面 → 一覧画面】
一覧画面.Show
Unload Me

なんてやってしまいます。
画面上、1画面しかユーザが触れないようにする必要があるため、Unload しています。


ログインとメニューは、本題とは関係ないのですね。

引用:

でも、毎回、Load & Unload するのは無駄なのかな、とも思ったり。
モーダルを使う方法が一般的だったりするんですかね。


私は Hide するか、場合によってはオーナーフォームを使います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-11-10 13:25
引用:

じゃんぬねっとさんの書き込み (2006-11-10 12:52) より:

ログインとメニューは、本題とは関係ないのですね。


いいえ。ログインもメニューも含めて、Show & Unload しています。
メニューからログインに戻ることは出来ない仕様ですけど。

引用:

私は Hide するか、場合によってはオーナーフォームを使います。


「オーナーフォーム」を調べてみました。Show メソッドの第2引数が使えるんですね。
知らなかった・・・orz

どちらの場合も一覧画面に戻る場合に、一覧画面情報の最新化が必要なわけですが、それは Activate でやる、という理解でよろしいんでしょうか?

Load & Unload を繰り返すよりも、Hide & Show を繰り返した方が良い、という理解をしました。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-11-10 13:26
ふつうはhideでしょうねえ。毎回unload/loadは…。
オーナーフォームにするかどうかは、仕様によるでしょうね。

あと、機能がまとめてもいいものだったり数が少なかったりなら、1画面の中でペインを切り替えることも。

[ メッセージ編集済み 編集者: mio 編集日時 2006-11-10 13:27 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-11-10 13:31
引用:

ひろれいさんの書き込み (2006-11-10 10:55) より:
私なんかは、メンテ画面から一覧画面に戻る際に最新の状態を表示する必要があるため、一覧画面の「Form_Load」で一覧に表示するようにしておき、

【一覧画面 → メンテ画面】
メンテ画面.Show
Unload Me

【メンテ画面 → 一覧画面】
一覧画面.Show
Unload Me

なんてやってしまいます。


「一覧画面」と「メンテ画面」の2つのオブジェクトだけで画面遷移を制御しようとすると、泥縄式になると思います。この2つを管理する第三者のコントローラーを置いて、そいつが上記のような遷移を管理させるようにすると良いかもしれません。このコントローラーは実装によっては見えないフォームにする実装方法もあるかもしれませんし、あるいはフォームにしないほうが良いのかもしれません。
実装はさておき、「一覧画面」と「メンテ画面」の間の情報のやりとりは必要がなければ避けたいと考えます。
すなわち、

   「一覧画面」←×→「メンテ画面」
「コントローラー」←○→「メンテ画面」
「コントローラー」←○→「一覧画面」

みたいな依存関係にしたほうが、仕様変更などにも強いと思います。
登場人物が多くて複雑ならば、「コントローラー」と「一覧画面」をひとつにまとめるというのも簡便化としてはアリかもしれません。

引用:

ひろれいさんの書き込み (2006-11-10 10:55) より:
画面上、1画面しかユーザが触れないようにする必要があるため、Unload しています。

でも、毎回、Load & Unload するのは無駄なのかな、とも思ったり。
モーダルを使う方法が一般的だったりするんですかね。


Load/Unload を伴なうようにするかどうかは、実装の好みにもよるのかもしれません。私としては、長くインスタンスを保持していると管理がややこしくなるので、画面に見えていないものはすぐに Unload してしまいたいほうです。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-11-10 13:51
>mioさん

普通は、Hide ですか(^_^;)
Form_Load に処理が無いとしても、やっぱり Hide ですかね?

確かに、画面項目数が少なければ、画面切替って手もありますね。
私は、苦手ですけど(^_^;)


>unibonさん

おぉっ! 画面制御のプログラムを別個で用意しておくって手ですね。
Web 系のシステムでそんな制御をしているのを見たことがあります。
画面ID なんかを持ちまわって、「戻る」とかの異常遷移を制御するって方式でした。

でも、これの設計をするのが大変そうですね(^_^;)

私なんかも、コストが高くなければ、Unload してしまった方がスッキリするタイプです。
Activate で処理するのも何か違和感を感じてしまいます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-10 16:12
引用:

ひろれいさんの書き込み (2006-11-10 13:25) より:

どちらの場合も一覧画面に戻る場合に、一覧画面情報の最新化が必要なわけですが、それは Activate でやる、という理解でよろしいんでしょうか?


いいえ。(Activate イベントで行うのは名前からして不適切ですよね?)

モーダルの場合は、Show メソッドで制御が止まるので、その後に Refresh するメソッドを用意するとして、
モードレスの場合はイベントで通知するなどします。

最初のレスで、

 > 私は Hide するか

と書かせて頂きましたが、これは、
 「次の Form へ遷移するとして、呼び出し元の Form をどうするか」
ということだと捉え、回答しています。
(誤解を招く書き方でした、ごめんなさい)

私は、呼び出し元は Unload はしませんが、呼び出し先の都合が終わったら、呼び出し先は Unload しますね。
[一覧] から [メンテナンス] へ遷移する時は、[一覧] は Hide。
[メンテナンス] から [一覧] に戻る時、[メンテナンス] は Unload。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-11-10 17:11
引用:

じゃんぬねっとさんの書き込み (2006-11-10 16:12) より:

いいえ。(Activate イベントで行うのは名前からして不適切ですよね?)


そうですよね。これは、納得です。

引用:

モーダルの場合は、Show メソッドで制御が止まるので、その後に Refresh するメソッドを用意するとして、
モードレスの場合はイベントで通知するなどします。


■Refresh するメソッドを用意する
これは、分かります。でも、Show した後に Refresh って何か違和感があるんです。
VB が分かる人は、「あぁ、モーダルだから、Show した Form が閉じてから実行されるんだな」って分かると思いますが、VB が分からない人は困惑するんじゃないかな、と。

■イベントで通知する
これは、メンテ画面から一覧画面に戻る時に通知する、ってことですよね?
これが出来ないとずっと思ってたので、メンテ画面に遷移する時に Hide ではなく、Unload を使っていました。

例えば、どんなイベントで通知するんでしょうか?

引用:

最初のレスで、

 > 私は Hide するか

と書かせて頂きましたが、これは、
 「次の Form へ遷移するとして、呼び出し元の Form をどうするか」
ということだと捉え、回答しています。
(誤解を招く書き方でした、ごめんなさい)

私は、呼び出し元は Unload はしませんが、呼び出し先の都合が終わったら、呼び出し先は Unload しますね。
[一覧] から [メンテナンス] へ遷移する時は、[一覧] は Hide。
[メンテナンス] から [一覧] に戻る時、[メンテナンス] は Unload。


ここも了解しました。

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