東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

他のフォームに起こるイベントを掴まえる

http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=8456
↑こいつにちょっと反省。

FormAのボタン押したらFormBが開く。
そこでFormB上のボタンを押したらFormAにあるイベントハンドラに着火したい。
ってことですね。

僕は↓こう答えた:

Public Class FormA

    ' Button1が押されたらFormBを開く
    Private Sub Button1_Click(ByVal sender As System.Object,
                              ByVal e As System.EventArgs)
                              Handles Button1.Click
        ' FormBをこしらえ、
        Dim b As New FormB
        ' bのButton1-ClickにオノレのButton2_Clickを掴ませる
        AddHandler b.Button1.Click, AddressOf Button2_Click
        ' んでもって開く
        b.ShowDialog()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object,
                              ByVal e As System.EventArgs)
                              Handles Button2.Click
        TextBox1.Text = "素直なやつぅ..."
    End Sub

End Class

回答つけた後で思ったんだけど、これは下策です。
FormB.Button1が未来永劫Button1だって保証はありませんし、
第一Form上のボタンなんて本来外に公開するもんじゃない。

だからちゃんとやるなら↓こうしたほうがよかろーね。

'------------ FormB.vb
Public Class FormB

  ' FormBに起こった出来事をobserverで掴ませておくれ
    Public Sub AddObserver(ByVal observer As
                 System.EventHandler)
        AddHandler Button1.Click, observer
    End Sub

End Class

'------------ FormA.vb
Public Class FormA

    ' Button1が押されたらFormBを開く
    Private Sub Button1_Click(ByVal sender As System.Object,
                              ByVal e As System.EventArgs)
                              Handles Button1.Click
        ' FormBをこしらえ、
        Dim b As New FormB
        ' bに起こるイベントにオノレのButton2_Clickを掴ませる
        b.AddObserver(AddressOf Button2_Click)
        ' んでもって開く
        b.ShowDialog()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object,
                              ByVal e As System.EventArgs)
                              Handles Button2.Click
        TextBox1.Text = "素直なやつぅ..."
    End Sub
 
End Class


「相手の腹を探っちゃダメ / やって欲しいことは'お願い'しよう」
オブジェクト指向のキモだよね。

投稿日時 : 2006年11月22日 15:38

コメントを追加

# re: Q&A ふぉろー : 他のフォームに起こるイベントを掴まえる 2006/11/22 17:06 とっちゃん

予想通りというかなんというか...
追加質問が入ってますね。

まるで、ここ見てから質問した?とでもききたくなるくらいなw

# re: Q&A ふぉろー : 他のフォームに起こるイベントを掴まえる 2006/11/22 17:13 επιστημη

うんうんう(笑

さて、このふぉろーで理解してくれるだろーか。
それが心配。

# re: 他のフォームに起こるイベントを掴まえる 2006/11/23 1:03 まどか

>オブジェクト指向のキモだよね。
であれば、そもそも循環参照仕様だと思うんだけど。。。

# re: 他のフォームに起こるイベントを掴まえる 2006/11/23 1:33 επιστημη

…ごめんなさい、循環参照仕様ってなんですか?

# re: 他のフォームに起こるイベントを掴まえる 2006/11/23 9:03 R・田中一郎

>「相手の腹を探っちゃダメ / やって欲しいことは'お願い'しよう」

ええ言葉や~(T-T)

# re: 他のフォームに起こるイベントを掴まえる 2006/11/23 17:50 まどか

>…ごめんなさい、循環参照仕様ってなんですか?
お互いに依存してませんか?>元の要求仕様

>やって欲しいことは'お願い'しよう
そうそう、FormBはお願いするだけにしないと。SOSみたいに。

# re: 他のフォームに起こるイベントを掴まえる 2006/11/23 18:20 επιστημη

ああ、FormA/Bがお互いに依存してるてことか。
いや、「であれば」に引っかかりを感じたです。
なにが オブジェクト指向のキモであれば なんだろ、と。

# きっかけは… 2006/11/23 23:06 AQUA's .NET 奮闘記

きっかけは…

# きっかけは… 2006/11/23 23:08 AQUA's .NET 奮闘記

きっかけは…

# re: 他のフォームに起こるイベントを掴まえる 2006/11/24 10:10 囚人

Java 臭が半分するとか言ってみる。

-----------------------FormA
Public Class FormA
Inherits System.Windows.Forms.Form

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim b As New FormB
AddHandler b.OkButtonClick, AddressOf b_OkButtonClick
b.ShowDialog()
End Sub

Private Sub b_OkButtonClick(ByVal sender As System.Object, ByVal e As EventArgs)
TextBox1.Text = "素直なやつぅ..."
End Sub
End Class

-----------------------FormB
Public Class FormB
Inherits System.Windows.Forms.Form

Public Event OkButtonClick As EventHandler

Protected Sub OnOkButtonClick()
RaiseEvent OkButtonClick(Me, EventArgs.Empty)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
OnOkButtonClick()
End Sub
End Class


FormB に OkButtonClick イベント(もっといい名前があれば尚良し)を定義する。
やってる事は変わんないですけど^^;

# re: 他のフォームに起こるイベントを掴まえる 2006/11/24 23:57 επιστημη

ないす。

僕はeventを外部に晒すのはちっとばかし躊躇します。
なぜっていわれてもァレなんですが ^^;
「変数を公開するな」が染み付いちゃってんでしょね。

# re: 他のフォームに起こるイベントを掴まえる 2006/12/04 3:15 稍丼

> 「変数を公開するな」

でも,

VB では,

Public Event OkButtonClick As EventHandler

が,コンパイル後,

.field private class [mscorlib]System.EventHandler OkButtonClickEvent

.method public specialname instance void
add_OkButtonClick(class [mscorlib]System.EventHandler obj)

.method public specialname instance void
remove_OkButtonClick(class [mscorlib]System.EventHandler obj)

となり,

C# では,コンパイル後,

public event EventHandler OnButtonClick;

が,

.field private class [mscorlib]System.EventHandler OkButtonClick

.method public hidebysig specialname instance void
add_OkButtonClick(class [mscorlib]System.EventHandler 'value')

.method public hidebysig specialname instance void
remove_OkButtonClick(class [mscorlib]System.EventHandler 'value')

となり,

C++/CLI だと,

public: event EventHandler^ OnButtonClick;

が,コンパイル後,

.field private class [mscorlib]System.EventHandler '<backing_store>OnButtonClick'

.method public hidebysig specialname instance void
add_OnButtonClick(class [mscorlib]System.EventHandler 'value')

.method public hidebysig specialname instance void
remove_OnButtonClick(class [mscorlib]System.EventHandler 'value')

.method family hidebysig specialname instance void
raise_OnButtonClick(object value0,
class [mscorlib]System.EventArgs value1)

だったりなんていうカラクリがあって,
デリゲートなフィールド自体は,
private に 'こっそり' なってたりするので,
結果的にカプセル化になっているような。

タイトル
名前
URL
コメント