スポンサーサイト

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

F#入門 Windowsアプリケーション編 イベントの処理方法(1)

今回は趣向を変えて、Observableモジュールのメソッドを利用して、少し関数型言語的にイベントを処理してみたいと思います。
 
題材は、ボタンを押すと数字が累積されていくというカウンターを取り上げます。
 
ボタン2つと、結果表示用のラベルをのっけておきます。
 
>let plus1Button  = new Button( Location = new Point(10,10),Text = "+1")
let plus2Button  = new Button( Location = new Point(10,60),Text = "+2")
let resLabel = new Label(Location = new Point(10,110),Text = "0")
mainForm.Controls.Add(plus1Button)
mainForm.Controls.Add(plus2Button)
mainForm.Controls.Add(resLabel);;
 
それでは次の定義をみてください。
 
> let plus1Event = plus1Button.Click |> Observable.map (fun _ -> 1);;
 
val plus1Event : IObservable<int>
 
これで、plusButtonがクリックされたときに、その付加情報のEventArgsの代わりに付加情報として1をもつ、IObservable<int>型の値を束縛しています。
 
同様に
let plus2Event = plus1Button.Click |> Observable.map (fun _ -> 2)
と定義しておきます。
 
さてこれらをObservable.mergeでまとめて、Event版のfold関数である、Observable.scanで足しあげて、最後にこれにObservable.addで「結果表示用の関数」を登録します。
 
Observable.merge plus1Event plus2Event
  |>Observable.scan (+) 0
  |>Observable.add  (fun x -> resLabel.Text <- sprintf "%d" x)
 
これで、次のようなウィンドウができあがり、ボタンを押すと、数が累積されていきます。 

821-1.jpg  
 
それでは、以前ボタン(2)で作ってみた、ラベルが一つと1から9までのボタンが横位置列に並んでいて、ボタンを押すとそのボタンの数だけラベルに表示される値が増えるという簡単なカウンターをこの手法で作ってみます。
 
open System
open System.Windows.Forms
open System.Drawing
 
let mainForm =  new Form(Width = 700, Height =200, Text = "Simple Counter ver2")
mainForm.Show() |> ignore
 
let target_label = new Label(Left = 160,Top = 10,Text = "0",Font = new Font("MS UI Gothic",36.0f),AutoSize = true) 
 
let numButtonLst =
    [1..9]
    |> List.map (fun i -> (i,
                           new Button (Location = new Point (-60+70*i,80),
                                       Width = 50,
                                       Height = 50,
                                       Text = sprintf "+%d" i,
                                       Tag = i )
                           ))
let plusEvents = 
   numButtonLst
    |> List.map (fun (i,btn)  -> btn.Click |> Observable.map (fun _ -> i))
                         
List.reduce (Observable.merge) plusEvents
 |>Observable.scan (+) 0
 |>Observable.add  (fun x -> target_label.Text <- sprintf "%d" x)
 
numButtonLst
 |>List.iter (fun (_,btn) -> mainForm.Controls.Add (btn) |> ignore)
mainForm.Controls.Add(target_label)
 
 
実行例は以下の通りです。 
 
821-2.jpg
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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