7

そのため、イベントトリガーで実行したい関数がありますが、後で削除したいと思います。私はこれのために何をしますか?F#イベントには、ハンドラーとして関数を追加するメソッドがあることは知ってAddいますが、この関数を削除することはできません。わかりましたが、デリゲートの作成方法がまったくわかりません。(まあ、ありますがtype Foo = delegate of type1 -> type2その使い方がわかりません...)

編集:これが私がやりたいことのより明確な例です、コードで:

// Define and publish event
let _someEvent = new Event<string>()
let SomeEvent = someEvent.Publish

// Normally, I'd do this to use it:
SomeEvent.Add (fun arg -> printfn "Argument: %s" arg)

// Trigger the event
someEvent.Trigger "Hello world"

しかし、私の問題は、いつかこのフックを削除したいということです。私はそれが代表者で可能であることを知っています...それを行う方法を正確に知らないだけです。

4

3 に答える 3

7

もう1つのオプションは、Subscribeメソッドを使用し、Disposeを使用してサブスクライブを解除することです。

// Define and publish event
let someEvent = new Event<string>()
let SomeEvent = someEvent.Publish

// Subscribe to event
let subscription =
    SomeEvent.Subscribe (fun arg -> printfn "Argument: %s" arg)

// Trigger the event
someEvent.Trigger "Hello world"

// Unsubscribe
subscription.Dispose()
于 2013-02-01T07:21:16.840 に答える
6

はい、ハンドラーを使用してください。

// Define and publish event
let _someEvent = new Event<string>()
let SomeEvent = _someEvent.Publish

// wrap function in handler
let handler = Handler<string>(fun _ arg -> printfn "Argument: %s" arg)

// add
SomeEvent.AddHandler handler

// remove
SomeEvent.RemoveHandler handler
于 2013-01-26T07:51:13.060 に答える
3

他のオブジェクトを作成するのと同じように、F#でデリゲートを作成できます。関数をコンストラクターに渡すだけです。を使用して、他の.Net言語で行うのと同じ方法で、イベントからハンドラーを削除することもできますRemoveHandler。最初に追加されたのと同じデリゲートを確実に渡す必要があります。

この例(FSIで実行できます)はPaintEventHandler、フォームを青で塗りつぶすを作成し、それをフォームのPaintイベントに追加します。次に、フォームのボタンを設定して、イベントからペイントハンドラーを削除し、フォームを強制的に再描画します。

open System
open System.Drawing
open System.Windows.Forms

let form = new Form()

let paintHandler =
    PaintEventHandler( // The function is passed to the delegate constructor.
        fun sender e ->
            e.Graphics.Clear Color.CornflowerBlue
    )

form.Paint.AddHandler paintHandler // Handler added.

let btn = new Button()
btn.Text <- "Remove Handler"
btn.Width <- 200;
btn.Click.Add (fun e ->
    form.Paint.RemoveHandler paintHandler // Handler removed.
    form.Invalidate() // Redraw
)
form.Controls.Add btn

form.Show()

AddHandler/RemoveHandlerは通常のデリゲートを使用Addしますが、別の署名の機能を使用することに注意することが重要です。(senderパラメーターがありません。)

于 2013-01-26T04:09:26.810 に答える