スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門初級編 第16回 Delegates と Events(4)

今回は前回の続きでF#のControl.Event ModuleのIEvent型の値を引数にとる関数を紹介します。
 
まずはずっと使用しているPublisherExampWithDelgクラス関連のコードを再掲します。
 
type WhatTimeDidItHappenEventArgs (dateTime : System.DateTime) =
    inherit System.EventArgs()
    member this.DateTime = dateTime
 
type DelegateForPublisherExampWithDelg = 
                    delegate of obj * WhatTimeDidItHappenEventArgs -> unit
 
type PublisherExampWithDelg () =
    let _event1 = 
        new Event< DelegateForPublisherExampWithDelg,WhatTimeDidItHappenEventArgs>()
    member this.SomethingHappen() =
        _event1.Trigger(this,new WhatTimeDidItHappenEventArgs( System.DateTime.Now ))
    member this.Event1 = _event1.Publish
 
これで
> let t = new PublisherExampWithDelg();;
val t : PublisherExampWithDelg
 > let originalEvent = t.Event1;;
val originalEvent :
  IEvent<DelegateForPublisherExampWithDelg,WhatTimeDidItHappenEventArgs> 
  
としておいた上で例としてoriginalEventを引数とした例を順次みていきます。
 
○Event.partition
 
これは、窓口を付加情報が条件を満たす場合と、満たさない場合の二つに分けます。
 
// Signature:
Event.partition : ('T -> bool) -> IEvent<'Del,'T> -> IEvent<'T> * IEvent<'T> (requires delegate)
 
// Usage:
Event.partition predicate sourceEvent
 
//Parameters
predicate
Type: 'T -> bool
The function to determine which output event to trigger.
 
sourceEvent
Type: IEvent<'Del,'T>
The input event.
 
関数の返り値は IEvent<'T> * IEvent<'T>となっていますから、満たす場合用の窓口と、満たさない場合用の窓口がタプルで返ります。(IEvent<>型ですから、Handler<>型をAddHandlerしていきます。)
時刻の秒が10未満用の時トリガーが引かれる窓口とそれ以外の場合にトリガーが引かれる窓口を作って使用してみます。
 
let (lessThan10Event,notLessThan10Event) = //2つの窓口
    originalEvent 
     |> Event.partition(fun (whatTimeArgs : WhatTimeDidItHappenEventArgs) ->
                        whatTimeArgs.DateTime.TimeOfDay.Seconds < 10) 
                        //Event.filterのEventはモジュール名
 
let myHandlerForLess10 =
    new Handler<WhatTimeDidItHappenEventArgs>(
           fun sender args -> printfn "秒は %A で10未満" args.DateTime
     )
 
let myHandlerForNotLess10 =
    new Handler<WhatTimeDidItHappenEventArgs>(
           fun sender args -> printfn "秒は %A で10以上" args.DateTime
     )
 
lessThan10Event.AddHandler(myHandlerForLess10)
notLessThan10Event.AddHandler(myHandlerForNotLess10)
 
eventを手動で発火してみます。
> t.SomethingHappen();;
秒は 2010/04/09 8:38:03 で10未満
val it : unit = ()
> t.SomethingHappen();;
秒は 2010/04/09 8:38:07 で10未満
val it : unit = ()
> t.SomethingHappen();;
秒は 2010/04/09 8:38:11 で10以上
val it : unit = ()
> t.SomethingHappen();;
秒は 2010/04/09 8:38:15 で10以上
val it : unit = ()
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。