オーバライドで?

解決


マグ  2005-05-06 02:46:57  No: 121435

「フォームが閉じられた」というのをオーバライドで
受け取るにはどのように記述すればよろしいでしょうか?

なぜ、オーバライドで?という疑問もされそうなので、
理由は現在、Buttonのコントロールを作成してて、
フォームが閉じられると同時に自作Buttonのオーバライド
を作動させて、
Dim g As Graphics
を破棄させたいんです。


マグ  2005-05-06 19:49:07  No: 121436

環境を書き忘れていました。

開発環境:VB.NET + Windows XP
動作環境:Windows XP SP1


マグ  2005-05-07 03:09:31  No: 121437

Protected Overrides Sub Finalize()
 
        MyBase.Finalize()
    End Sub

これでした。
解決しました。


じゃんぬねっと  URL  2005-05-12 21:15:40  No: 121438

フツーに間違ってる気がする。


マグ  2005-05-12 21:54:14  No: 121439

>フツーに間違ってる気がする。

間違っているのですか・・・(・・;)
もう一度、調べてみます。


じゃんぬねっと  URL  2005-05-13 03:29:46  No: 121440

「フォームが閉じられた」なのですから...
ファイナライザはもっと後ですよね。


マグ  2005-05-13 21:59:31  No: 121441

調べたのですが、オーバライドにClosedイベントかClosingイベント
を受け取るものが見つかりませんでした。

他の方法はないでしょうか?
結果的にファイナライザで終了を受け取るしかないのでしょうか?


じゃんぬねっと  URL  2005-05-13 22:44:11  No: 121442

イベントはオーバーライドしません。
On〜 あたりを調べてみましたか?


マグ  2005-05-13 23:00:58  No: 121443

On〜あたりも調べてみましたが、
OnClosedかOnClosingが見つかりませんでした。

終了の通知を受け取るには
    Protected Overrides Sub Finalize()
 
        MyBase.Finalize()
    End Sub
しか残っていないのでしょうか?


特攻隊長まるるう  2005-05-14 00:36:30  No: 121444

見つかりませんでしたって何?(^^;)
[Form.OnClosed メソッド]
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsformclassonclosedtopic.asp
[Form.OnClosing メソッド]
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsformclassonclosingtopic.asp

プロテクトメソッドだからね?


マグ  2005-05-14 01:38:13  No: 121445

それはインスタンスがFormを設定していた場合のオーバライドです。
一番、最初のレスに記述していますが、Buttonコントロールです。
もちろんのことインスタンスもButtonに設定しています。

そのため、オーバライドでOnClosedやOnclosingがないんです。
その場合、終了の通知を受け取るにはどうすればよろしいのでしょうか?
という質問なんです。

行っている作業は
Visial Stadioを起動して、ファイル→新規作成→プロジェクト→Windows アプリケーションをクリックして、
プロジェクト→コンポーネントの追加→開くをクリックして、
コードビューに切り替えて、
Inherits System.ComponentModel.Componentを
Inherits System.Windows.Forms.Buttonに書き換えて、
Form上にオリジナルButtonコントロールを作成しているため、
インスタンスがButtonに設定されており、
OnClosedやOnClosingの通知をどうすれば、受け取れるかが分からないんです。


特攻隊長まるるう  2005-05-14 02:53:27  No: 121446

>一番、最初のレスに記述していますが、Buttonコントロールです。
なるほどなるほど。それはごめんなさいでした。最初の質問から
いまいち納得いってなかった部分がやっと納得できました。(^^;)
(↑だから放置してたの(汗))
MyBase がボタンなのね?。今、分かりました。Form とばかり思ってました。
というのも、
『フォームに乗ってるコントロール側でフォームのイベントを拾う』
というのが概念としてちょっと特異です。親子関係がイマイチです。
問題がある…かも。

まず、通常の(継承してない)コントロールにどういう処理が行われて
いるかはご存知ですか?。これは
" Windows フォーム デザイナで生成されたコード "
の部分で行われています。ここで、InitializeComponent という
関数で、フォームの上に存在するコントロールが New されていますね?。
では、コンポーネントの消去はどうなっていますか?。Dispose 
をオーバーライドしてますね?。Dispose で自分のつかんでいるメモリ
(コントロール)を破棄しているわけです。

この考え方からいくと開放処理は Dispose で行うのが良いでしょう。
で、親のフォームを閉じる処理に依存するのではなく『誰かから(フォームとは
限らない)Dispose (破棄)命令を受けた時に自分の保持している開放すべき
メモリを開放する』という考え方が良いでしょう。コントロールの
内部で処理が閉じておくべきです。

また、Control クラスのベースである Component クラスの解説を
読んでおいて下さい。
[Component クラス]
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemComponentModelComponentClassTopic.asp

Finalize ではなく Dispose の方が良さそうです。


マグ  2005-05-14 03:35:03  No: 121447

Disposeのオーバライドが自動生成されるので、
下手にいじったらパソコンがどうなるんだろうみたいな感じで
怖くて、いじれませんでした。
結果的に破棄することになると、Disposeオーバライドを使うしか
ないみたいですね。

で、
疑問にはまってしまいました。
上記に記述した「行っている作業は」でコントロールを生成し、
そのコントロールのDisposeオーバライドの

        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)

の部分を

        If disposing Then
            If Not (components Is Nothing) Then
                MessageBox.Show("実験")
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)

のように変更し、作成コントロールをFormに設置して、
そして、作成コントロールのタブに移動して、
ビルドして、Formのタブに移動すると・・・・・

実行していないのにDisposeのオーバライドが動作します。
さらに、デバッグ→デバッグなしで実行をクリックすると、
Formの起動時と終了時にDisposeオーバライドが動作してしまいます。

そして、コントロールタブにして実行すると、正常に動作します。
コンパイルしたEXEも正常に動いてくれます。

なぜ、Formだけ?っていう疑問が・・・・
これって、バグでしょうか?


特攻隊長まるるう  2005-05-16 18:48:09  No: 121448

>Disposeのオーバライドが自動生成されるので、
>下手にいじったらパソコンがどうなるんだろうみたいな感じで
>怖くて、いじれませんでした。
デザイン画面に関係してるので、下手にいじったらデザインモードで
開けなくなるだけです。あくまで1つのアプリケーションに過ぎません
ので、パソコンがどうなる事はないでしょう。ですから、プロジェクトの
バックアップを取れる人であれば下手にいじっても構わないと思います。
もちろん自己責任で。ただ、何も勉強しないでいじるのであれば、最悪
[VB.NET]の再インストールくらいは覚悟しておいて下さい。ちゃんと
勉強してるなら、例えば
    Public Sub New()
でも
        ' InitializeComponent() 呼び出しの後に初期化を追加します。
という記述があり、初期化処理を呼び出すコードを書いた事もあるでしょう
から、Dispose も同じ事だと理解できるはずです。

>実行していないのにDisposeのオーバライドが動作します。
>さらに、デバッグ→デバッグなしで実行をクリックすると、
>Formの起動時と終了時にDisposeオーバライドが動作してしまいます。
バグでは無い感じがしますが…。現象を再現できませんでしたので回答は
できません。
ただ、MessageBox.Show はプログラムの流れを止めてしまいますので、
こういったフォームのイベント処理でのデバッグには向いていません。
処理を止めずにログを書き出す形にしましょう。
また、
『実行してないのに』という書き込みの主語は『自分が』ですよね?。
Dispose イベントだけ見ても原因は分かりません。何が Dispose を
呼び出しているのか調べないと。最初に書いたように、デザイン画面と
密接に関係してるので、とりあえず、デザイン画面は全て閉じて実行して
下さい。あとは[VB.NET]が何か作ってるかもしれなので、…そこは
調べないと分かりませんね。…新規でこちらの環境での簡単なテスト
では再現しませんでしたので、コードに問題がある可能性も十分に
考えられます。

バグと言ってしまうのは簡単ですが、本来、原因がバグだと分かるもの
がバグです。原因が分からないものをバグだと思うのはやめましょう。


マグ  2005-05-17 18:18:14  No: 121449

Public Sub New()
などの動きは分かりますので、VB.NET自体の再インストールはないと思います。

>ただ、MessageBox.Show はプログラムの流れを止めてしまいますので、
>こういったフォームのイベント処理でのデバッグには向いていません。
>処理を止めずにログを書き出す形にしましょう。

ログへの書き込みが分からないから、MessageBoxで処理の流れを念のため、
確認しました。

>『実行してないのに』という書き込みの主語は『自分が』ですよね?。

はい、そうです。

>バグと言ってしまうのは簡単ですが、本来、原因がバグだと分かるもの
>がバグです。原因が分からないものをバグだと思うのはやめましょう。

そうだったのですか。
知りませんでした。
今まで、動きがおかしいものを全て、バグと言っていました。
では、今後、気をつけます。

ソースに関しては、実験だったので、
コンポーネントのコントロールを追加するソースを
「Windows デザイナーで生成されたコードです」の中に記述し、
上記に記述したDisposeオーバライドを変更したぐらいですので、
それ以外のソースの変更と一行も打ってません。
にも関わらず、なぜ、そのような現象が起こるのかわかりません。


じゃんぬねっと  URL  2005-05-17 19:29:02  No: 121450

デザイナ モードであるかどうかを判別して、然るべき処理をしましょう。
http://www.google.co.jp/search?hl=ja&q=MSDN+DesignMode&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja


マグ  2005-05-17 20:10:10  No: 121451

このようなことができるなんて初めて知りました。
では、ソースに組み込んでみます。
特攻隊長まるるうさん、じゃんぬねっとさん
ありがとうございます。

できなかったら、また、質問します。


じゃんぬねっと  URL  2005-05-18 02:33:58  No: 121452

ただ、特攻隊長まるるうさんが仰っているように、

> 『フォームに乗ってるコントロール側でフォームのイベントを拾う』
> というのが概念としてちょっと特異です。

です。

どうしてもやるのであれば、WithEvents で ParentForm をヒモ付けるんですが、
果たして、それが必要な状況か、疑問です。


マグ  2005-05-19 01:50:04  No: 121453

>どうしてもやるのであれば、WithEvents で ParentForm をヒモ付けるんですが、

頭から煙が・・・・・
どうやって、WithEventsに親フォームをヒモ付けるのでしょうか?

もう一度、やってみたら、今度はDisposeオーバライドがなぜか、動作しません。
別のPCで・・・・・
実験したPCはWindows XP SP2です。

SP1の時は、Disposeオーバライドが動作するのですが・・・・・


マグ  2005-05-20 01:40:34  No: 121454

>もう一度、やってみたら、今度はDisposeオーバライドがなぜか、動作しません。
>別のPCで・・・・・
>実験したPCはWindows XP SP2です。
>SP1の時は、Disposeオーバライドが動作するのですが・・・・・

どうやら、勘違いでした。
SP1とSP2どちらもDisposeオーバライドが動作しました。

原因不明のDisposeオーバライド問題については、ソースの方で対策します。

特攻隊長まるるうさん、じゃんぬねっとさん
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加