DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Show()メソッド実行時の表示される画面側でのイベント発生順序

環境/言語:[C# 2005 / Windows XP Pro]
分類:[(未選択)]

2007/06/24(Sun) 23:49:50 編集(投稿者)
2007/06/24(Sun) 23:49:47 編集(投稿者)

いつもお世話になっております。

じゅでであります。

今回はShow()メソッドを実行時に表示される側のフォームクラスでの
イベント発生順序についてお伺いしたいです。

現在画面遷移用のクラスを別途作成して、作成したクラスから表示順序
に従いフォームクラスを表示しておりますが、
「戻る」ボタンなどでの画面を戻る際に、もどった先での
イベントをどのようにとらえるかという問題で悩んでおります。

画面を戻る際は、戻り先はHideで表示を隠している状態になっております。

今は、new public void Show()として、継承元のShowを隠蔽し、
内部でベースクラスの.Showを使用して、
新たに作ったnew public void Show()内で、再表示時の表示内容変更を
行おうかと考えておりますが、イベントの発生などでもっと良い方法は
あるでしょうか?

もしご存知の方がいましたらよろしくお願いいたします。

その他に、イベントの発生順序について調査する良い方法があれば、
ご教授いただけないでしょうか。
よろしくお願いいたします。

以上
相手先のCloseイベントを呼び出し元がキャッチするとか。
はいこーん様、ご返信ありがとうございます。

> 相手先のCloseイベントを呼び出し元がキャッチするとか。
申し訳ありません。
私の勉強不足で、根本的な事をお尋ねしたいです。
相手先のイベント発生を、呼出元で監視出来るのでしょうか?
出来るのであれば、これほど助かる事はないのですが、
その方法はどのような方法があるでしょうか?

お忙しいとは思いますが、教えていただければ幸いです。

newでの隠蔽だとアップキャスト時に問題が起こりそうで、
なんともいえない状態となっております。

よろしくお願いいたします。

以上
>>相手先のCloseイベントを呼び出し元がキャッチするとか。
> 申し訳ありません。
> 私の勉強不足で、根本的な事をお尋ねしたいです。
> 相手先のイベント発生を、呼出元で監視出来るのでしょうか?

特別なことは特にありません。
ボタンのクリックイベントを処理するような場合と同じです。
呼び出し先フォームのインスタンスを呼び出し元フォームで
生成していると思いますので、イベントハンドラーの関連付けも行ってください。
よねKEN様、ご返答ありがとうございます。
>
> 特別なことは特にありません。
> ボタンのクリックイベントを処理するような場合と同じです。
> 呼び出し先フォームのインスタンスを呼び出し元フォームで
> 生成していると思いますので、イベントハンドラーの関連付けも行ってください。
>

インスタンスの生成などなのですが、画面遷移管理クラスが行っているので、
自分側ではなにもする事が出来ないのです。
> インスタンスの生成などなのですが、画面遷移管理クラスが行っているので、
> 自分側ではなにもする事が出来ないのです。
自分側では何もする事が出来ないとの事ですが、画面遷移クラスではなく
呼び出し元フォームで呼び出し先フォームの終了を監視したい理由はどのような事なのでしょうか?

画面遷移クラスがインスタンスの生成などなどを行っているのであり、
画面遷移クラスに手を加えることが可能であれば、単純に呼び出し先フォームのインスタンス生成後、かつShow()する前で

呼び出し先フォーム.FormClosed += new System.Windows.Forms.FormClosed(呼び出し元フォーム.イベントを捉えたいハンドラメソッド)

で駄目ですか?
■No19913に返信(じゅでさんの記事)
>>特別なことは特にありません。
>>ボタンのクリックイベントを処理するような場合と同じです。
>>呼び出し先フォームのインスタンスを呼び出し元フォームで
>>生成していると思いますので、イベントハンドラーの関連付けも行ってください。
> >
>
> インスタンスの生成などなのですが、画面遷移管理クラスが行っているので、
> 自分側ではなにもする事が出来ないのです。

画面遷移管理クラスが管理しているという話でしたね。
失念しておりました。
「呼び出し元フォームで生成していると思いますので、
 イベントハンドラーの関連付けも行ってください。」

「画面遷移管理クラスで生成していると思いますので、
 イベントハンドラーの関連付けも行ってください。」
と読み替えてください。

画面遷移管理クラスの役割は、表示するだけでなく、戻る場合も管理するのですよね?

画面Aから画面Bに遷移する場合、

画面A → 画面遷移管理クラス → 画面B

といように画面遷移管理クラスを介していると思います。
戻る場合も同じで、

画面A ← 画面遷移管理クラス ← 画面B

画面Bが閉じられたことは画面遷移管理クラスが知っていればいいことなので、
インスタンス生成同様に画面Bのcloseをハンドリングするのも
画面遷移管理クラスがやるものと思います。

さらに画面Aにもイベントを通知するのであれば、
それは画面遷移管理クラスから画面Aに通知してやればよいかと。
kzt様、よねKEN様、ご返信ありがとうございます。

(サンプルという事で遷移クラスは、抜いております)
イベントの登録なのですが、確かにCloseイベントなどは以下のように取得できるのですが、Hideで隠しているとどうにもならないのが現状であります。

        private void Form1_Load(object sender, EventArgs e)
        {
            _frm.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.frmClose);
        }

        private void frmClose(object sender, EventArgs e)
        {
            MessageBox.Show("フォーム2が閉じられたよ");
        }

もしHideで捕まえるならVisibleChangedイベントあたりかとも思い、
イベントの登録をしようとしたのですが、ヘルプを見てもデリゲートの
一覧に乗っておらず、どうしようかと考え中です。(見落としてたらすいません)

また、現状では、画面遷移クラスに手を入れる事は行えない状態で、
なんとか自分自身のフォームで完結させたいとも考えております。

引き続きよろしくお願いいたします。
> また、現状では、画面遷移クラスに手を入れる事は行えない状態で、

であるなら

> なんとか自分自身のフォームで完結させたいとも考えております。

無理です。
イベントを受信できるということは、オブジェクトの参照を保持しているということです。
画面遷移クラスを無いものとして考えた技術的解法が無いとはいいませんが、すべて愚法だと思います。
画面遷移クラスに実装すべきですし、そのために生まれたもののはずだと思います。
あぁ、質問の意味が分かりました。

つまり画面遷移クラスで呼び出し先フォームがHide()された時に、自身でイベントを受け取りたかったって事ですよね。

画面遷移クラスでインスタンスの生成などなど行っていて、インスタンスの参照を持っていないのですから、まどかさんがおっしゃっている通りに画面遷移クラスでその様な通知処理を実装して頂いてもらうように相談してみる事をお勧めします。

一度イベントあたりに目を通しておくと良いと思います。
まどか様、kzt様、ご返信ありがとうございます。

やはり無理がありますよね。
苦肉の作で以下のようにして逃げておりますが・・・
画面遷移クラスでなんともならなければ、こうするしかないですかね・・・
最悪遷移元の再表示時にあわせて画面データの表示内容変更を変更できれば
いいので、もうこれで逃げてしまおうというきになっております。

new public void Show()
{
Base.Show();
}
質問されている意図を明確に理解したいので、
じゅでさんが行いたい処理フローを教えていただけませんか?

苦肉の策でっておっしゃられてるShow()を隠蔽する方法も
、なぜその様にしないといけないのか良く分かりません。
Show()の時に表示内容変更処理を行っているとの事ですが、
単純に自身のShownイベントで表示内容変更処理を行うのでは駄目なのですか?
それにShow()をしているのは画面遷移クラスなんじゃ?

まずやりたい事が良く分からないので、具体的にどうのこうのって
判断出来ません。
kzt様、ご返信ありがとうございます。

Main部で、画面遷移に必要な、画面の型と表示方法、順番その他を
登録します。

画面遷移クラスから、画面遷移の方法にしたがい、初期表示画面を
呼出ます。
(インスタンス作成もこのとき行われるが、画面表示を始めて行う再に
インスタンスの作成を行い、その後の画面はHideで見えないようにし、
インスタンスは再作成しません)

画面遷移クラスから呼び出された初期表示画面を表示します。

画面表示を行った後、次画面に引渡すので、画面遷移クラスに
処理を戻します。(画面遷移クラス内で、フォームのHideやShow()を
行っております。

表示元の画面を、画面遷移クラスでHideに指定したのちに、
画面遷移クラスから、次画面のインスタンス作成(あるならしない)
を行い、画面をShow()します。

新たに開いた次画面より、前画面の値について、詳細設定を行います。

詳細設定後に、前画面に戻る為に、画面遷移クラスの処理を戻します。

画面遷移クラスより、開いていた画面をHideとして、初期表示画面を
Show()します。

Show()をした際に、画面表示内容が、詳細設定された内容を反映された
状態で表示します。

----------------------------------------------------------------

おっしゃるとおり、Show()しているのは、画面遷移クラスなので、
画面遷移クラスからShow()された瞬間に書き換えが出来れば、
問題ない事は問題ないです。

苦肉の策といったのは、本来なら、画面遷移クラスとBaseFormあたりで
やりとりを実装しておいてくれればいいのになぁ〜と言う事であります。
やはり説明から察しても画面遷移クラスにて実装するべき事だと思います。
相談されてみたらどうでしょうか?
kzt様、ご返信ありがとうございます。

一度画面遷移クラスの役割について相談してみます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板