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

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

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

Re[8]: フォーム継承時のイベントについて


(過去ログ 148 を表示中)

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

■86601 / inTopicNo.1)  フォーム継承時のイベントについて
  
□投稿者/ MTK (11回)-(2018/02/20(Tue) 14:56:55)

分類:[C#] 

お世話になります。

現在、Formを継承したBaseFormというフォームがあり
そのBaseFormを継承したフォームが20個近くあります。
全てのフォームで終了時に共通で処理したいものがあり、
それとは別に各フォーム別に終了時の処理を追加で行いたいです。

この場合、どのようにすれば処理が可能でしょうか?

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

BaseForm


    public partial class BaseForm : Form
    {
        private Hashtable hash;

        private void OnClosing(object sender, FormClosingEventArgs e)
        {
            // フォーム終了時に共通で実行したい処理(例)
            hash = null;
        }
    }




MenuForm(BaseFormを継承)


    public partial class MenuForm : BaseForm
    {
        private void OnClosing(object sender, FormClosingEventArgs e)
        {
            // 各フォーム個別に終了時に実行したい処理
        }
    }

引用返信 編集キー/
■86602 / inTopicNo.2)  Re[1]: フォーム継承時のイベントについて
□投稿者/ 魔界の仮面弁士 (1572回)-(2018/02/20(Tue) 15:16:27)
No86601 (MTK さん) に返信
> それとは別に各フォーム別に終了時の処理を追加で行いたいです。


(案 1) BaseForm に、「終了時イベント」を実装する
(案 2) BaseForm に、「終了時処理」のデリゲートインスタンスを受け渡せるようにしておく

お奨めは前者。
引用返信 編集キー/
■86603 / inTopicNo.3)  Re[2]: フォーム継承時のイベントについて
□投稿者/ MTK (12回)-(2018/02/20(Tue) 15:33:31)
No86602 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。

> (案 1) BaseForm に、「終了時イベント」を実装する

この終了時イベントとはどのことでしょうか?
上記のBaseFormプログラムに載せている OnClosing がフォーム終了時のイベントとして動きますが、このことでしょうか?
ただ、この状態で継承を行うと、継承先の OnClosing のみしか呼ばれないのです。

引用返信 編集キー/
■86604 / inTopicNo.4)  Re[3]: フォーム継承時のイベントについて
□投稿者/ Jitta (361回)-(2018/02/20(Tue) 15:38:38)
2018/02/20(Tue) 15:56:21 編集(投稿者)

名前のつけかたを間違っていると思われ。
Onイベント名のメソッドは、イベント励起に使います。
それは、共通ライブラリではprotected virtual で宣言されているので、オーバーライドして共通処理はbase呼び出しをする。
「イベントの処理と発生」で検索。

virtualが抜けた。
引用返信 編集キー/
■86605 / inTopicNo.5)  Re[3]: フォーム継承時のイベントについて
□投稿者/ にゃるら (2回)-(2018/02/20(Tue) 15:42:36)
> この終了時イベントとはどのことでしょうか?
> 上記のBaseFormプログラムに載せている OnClosing がフォーム終了時のイベントとして動きますが、このことでしょうか?
> ただ、この状態で継承を行うと、継承先の OnClosing のみしか呼ばれないのです。

.NETのバージョン次第ですが、OnFormClosedの方が終了理由がわかる引数がついてくるので
必要なことがしやすいかなって思いますよ。

protected override void OnFormClosed(FormClosedEventArgs e)
{
// 親クラスの処理を呼び出す
base.OnFormClosed(e);

// このクラスでやりたいことを
}

引用返信 編集キー/
■86608 / inTopicNo.6)  Re[4]: フォーム継承時のイベントについて
□投稿者/ MTK (13回)-(2018/02/20(Tue) 17:15:13)
No86604 (Jitta さん) に返信

回答ありがとうございます。

> 名前のつけかたを間違っていると思われ。
> Onイベント名のメソッドは、イベント励起に使います。

「イベントの処理と発生」で検索してMSDNを見てみました。
ちょっとまだこの理解が出来ていませんが、こちらの説明不足で食い違いがあるかもしれません。
当方VisualStadioを使用しており、フォームイベントの FormClosing イベントの名前を 
OnClosing と改名して使っております。
この OnClosing の命名がメジャーではないということでしょうか?

引用返信 編集キー/
■86609 / inTopicNo.7)  Re[4]: フォーム継承時のイベントについて
□投稿者/ MTK (14回)-(2018/02/20(Tue) 17:16:57)
No86605 (にゃるら さん) に返信

回答ありがとうございます。

> .NETのバージョン次第ですが、OnFormClosedの方が終了理由がわかる引数がついてくるので
> 必要なことがしやすいかなって思いますよ。

なるほど、どちらにしようかと思っていましたが、OnFormClosedの方が良さそうですね。
そちらに変更したいと思います。
例も頂きありがとうございました。
引用返信 編集キー/
■86611 / inTopicNo.8)  Re[5]: フォーム継承時のイベントについて
□投稿者/ にゃるら (4回)-(2018/02/20(Tue) 18:15:18)
フォームクラス「XxxForm」とした場合、
「XxxForm.Designer.cs」っていうファイルがあると思うんだ。

そこにね

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnClosing);

って感じになってるのかな?

もしそうなってるとしたら、これはイベントハンドラっていうのをイベントにくっつけた状態ですね。

ここにあるFormClosingの部分が

public event FormClosingEventHandler FormClosing;

って感じでFormクラスで宣言されています。

これを

protected override void OnFormClosed(FormClosedEventArgs e)

っていうFormのメソッドの中から呼ばれてるんだよ。

だから、イベントハンドラをつけるのではなくて、
このメソッド自体を継承してあげることで、

Form >> 継承 >> (親フォームクラス) >> 継承 >> (いろいろな子フォームクラス)

ってなってるのだったら、制御が簡単だと思います。

「XxxForm.cs」を開いて、「override 」って入力すれば継承可能なメソッドとかが
インテリセンスで出ると思うので、コーディングも簡単だと思いますよ。


引用返信 編集キー/
■86613 / inTopicNo.9)  Re[6]: フォーム継承時のイベントについて
□投稿者/ MTK (15回)-(2018/02/20(Tue) 19:23:35)
2018/02/20(Tue) 19:24:42 編集(投稿者)

No86611 (にゃるら さん) に返信

分かりやすい説明ありがとうございます。
フォーム毎にイベントハンドラを付けずに基底フォームのイベントをメソッドとして継承すべきということですね。
これでうまく処理できそうです。
解決済み
引用返信 編集キー/
■86614 / inTopicNo.10)  Re[5]: フォーム継承時のイベントについて
□投稿者/ Jitta (362回)-(2018/02/20(Tue) 23:11:22)
No86608 (MTK さん) に返信
> ■No86604 (Jitta さん) に返信
>
> 回答ありがとうございます。
>
>>名前のつけかたを間違っていると思われ。
>>Onイベント名のメソッドは、イベント励起に使います。
>
> 「イベントの処理と発生」で検索してMSDNを見てみました。
> ちょっとまだこの理解が出来ていませんが、こちらの説明不足で食い違いがあるかもしれません。
> 当方VisualStadioを使用しており、フォームイベントの FormClosing イベントの名前を 
> OnClosing と改名して使っております。
> この OnClosing の命名がメジャーではないということでしょうか?
>

イベントに対して、
イベントが発生したことにより処理するメソッドに Onイベント という名前をつけます。※1
このメソッドの仕事の中に、イベント発生を外部に通知することがあります。
イベントのデリゲート変数に イベント という名前をつけます。
イベントの情報を集めたハンドラーへの引数とするクラスに イベントEventArgs という名前をつけます。
イベントの通知を扱う(Handler)メソッドは、任意の名前をつけます。
VSでは、イベントを発生させたインスタンスの名前_イベント という名前をつけます。※2
というように、名前を見れば何をするものかわかるようにします。
VSのフォームデザイナーでフォームを選び、
プロパティエディタでイベント一覧を表示し、
FormClosingをダブルクリックしてできたメソッドを OnClosing にするのは、命名規約に沿っていません。
これは、通知されたイベントを扱うところです。
イベントは、オブジェクトの中で発生します。
通知を受け取った時は、イベント発生よりも後(on ではなく after)です。
※1と※2が混ざっているように思います。
解決済み
引用返信 編集キー/
■86615 / inTopicNo.11)  Re[6]: フォーム継承時のイベントについて
□投稿者/ MTK (16回)-(2018/02/21(Wed) 11:57:07)
2018/02/21(Wed) 11:58:21 編集(投稿者)
2018/02/21(Wed) 11:58:10 編集(投稿者)

No86614 (Jitta さん) に返信

ありがとうございます。
理解の乏しい私に、もう少しお付き合い頂けると幸いです。
今までの部分で自分なりの理解で記載しますので、ご指摘下さい。


例えばボタンコントロール(closeButtonという名前とします)をクリックした場合で考えると


@オブジェクト(ボタン)の中でイベントが発生
buttonオブジェクトの中のOnClickイベントが呼ばれる(ここが※1のことでしょうか?)
このOnClickの中で、外部へイベントの通知が行われている?

Aフォーム側で上記イベントを受け取る
フォーム上のボタンのプロパティエディタの「Click」から生成した
closeButton_Clickメソッドが上記の通知を受け取る用のメソッドであり、
Designer.cs内にある「closeButton.Click += new System.EventHandler(this.closeButton_Click);」
の部分で@の通知をcloseButton_Clickメソッドで受け取るよ という設定をしている?
その際、closeButton_Clickメソッドは通知を受け取る関数(イベント発生の関数ではない)のでOn〜という命名は不適切ということでしょうか?

解決済み
引用返信 編集キー/
■86616 / inTopicNo.12)  Re[7]: フォーム継承時のイベントについて
□投稿者/ Jitta (363回)-(2018/02/21(Wed) 17:27:27)
No86615 (MTK さん) に返信

そうです。
「名前付けのガイドライン」なのですが、
メチャクチャな機械翻訳になってやがる。

# 誰かgithubの使い方教えてくだされ
解決済み
引用返信 編集キー/
■86617 / inTopicNo.13)  Re[8]: フォーム継承時のイベントについて
□投稿者/ MTK (17回)-(2018/02/21(Wed) 18:30:48)
No86616 (Jitta さん) に返信

ありがとうございました。
イベントの流れが大分つかめてきました。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -