スポンサーサイト

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

F#入門 Windowsアプリケーション編 ボタン(2)

前回の続きでボタンについて調べてみます。
 
まずはボタンをのっけるためのフォームを生成しておきます。
 
open System
open System.Windows.Forms
open System.Drawing
 
let mainForm = new Form(Width = 620, Height = 450, Text = "Window For Button") //#1
mainForm.Show() |> ignore
 
これだけをF# Interactiveにおくると中身なしのフォームが表示されます。
ボタンを生成します。
 
> let btn = new Button(Left = 10,Top = 20,Text = "Push me");;
 
val btn : Button = System.Windows.Forms.Button, Text: Push me
 
押されたことに対して何か反応させるにはボタンのClickイベントにデリゲートを登録する必要があるのでした。次のようにします。
 
> let ce = t.Click;;
 
val ce : IEvent<EventHandler,EventArgs>
 
IEvent<EventHandler,EventArgs>型はIObservable<EventArgs>とIDelegateEvent<EventHandler> インターフェイスを実装して、前回はIDelegateEventの方を紹介したので今回はIObservable<EventArgs>の方のメソッドAddを使ってみます。
 
> ce.Add;;
val it : ((EventArgs -> unit) -> unit) = <fun:it@6-2>
 
ということでこちらは関数が引数となります。
 
(使用例)
> t.Click.Add(fun e -> printfn "%A" e);;
val it : unit = ()
 
これでボタンを押すとF#InteractiveにSystem.Windows.Forms.MouseEventArgsと表示されます。
 
IDelegateEventであることを利用してデリゲートを登録するのに対して、こちらの方は、
(1)関数を登録
(2)引数の数が2つではなく、senderがなくなって一つ
(3)Removeがない
というような特徴をもちます。
 
通常のボタンの使用方法は、ボタンに押された時に実行するunit->unit型の関数doSomething()を定義しておいて、押された時にこの関数が実行されるようにしておくという形なので、
t.Click.Add(fun _ -> doSomething())として利用する場合が多いかと思います。
 
次にObservable モジュールに準備されているIObservable<>型の値を引数にするメソッドを使用してみます。
 

 
(t.Click |> Observable.filter (fun e -> (e:?>MouseEventArgs).X % 3 = 0)).Add(fun e ->printfn "pushed %A" (e:?>MouseEventArgs).X)
 
こうするとボタンを押したときのマウスのx座標が3の倍数の時だけ、F# Interactiveにpushed ** という文字列が表示されます。
 
また上は次のようにも書けます。
 
t.Click 
    |> Observable.filter (fun e -> (e:?>MouseEventArgs).X % 3 = 0)
    |> Observable.add (fun e ->printfn "pushed %A" (e:?>MouseEventArgs).X)
 
その他のObservable モジュールに準備されているIObservable<>型の値を引数にするメソッドについては
F#入門初級編  Delegates と Eventsを参照してください。
 
さてそれでは、ラベルが一つと1から9までのボタンが横位置列に並んでいて、ボタンを押すとそのボタンの数だけラベルに表示される値が増えるという簡単なカウンターを作ってみます。
 
ラベルと整数を与えると、「押すとラベルの値を整数分だけふやすボタン」を返す関数を定義してみます。
 
> let makeButton (label : Label) width height i =
    let t = new Button(Text = ("+" + i.ToString()),Width = width ,Height = height)
    t.Click.Add(fun _ -> label.Text <- (Int32.Parse(label.Text) + i).ToString() )
    t;;
 
val makeButton : Label -> int -> int -> int -> Button
 
次に「ボタンを入れるフォーム」と「左端のボタンのx座標」と「ボタンの隙間の幅」と「ボタンのy座標」と「ボタンのリスト」を渡すと、横一列にボタンを配置する関数を定義します。
 
let putRowControls (form :Form) initPosX padX posY (ctrls : list<Button>) =
    ctrls
    |> List.fold (fun cur_pos (ctr:Button) -> ctr.Location <- new Point(cur_pos,posY)
                                              form.Controls.Add ctr
                                              cur_pos + ctr.Width + padX
                                                   )
                 initPosX
    |> ignore
    
 
あとはフォーム、ラベルを生成し、フォームにラベルをのっけて、上の関数を利用するだけです。
 
 
    
let mainForm = new Form(Width = 620, Height = 450, Text = "Simple Counter") //#1
let target_label = new Label(Left = 160,Top = 10,Text = "0",Font = new Font("MS UI Gothic",36.0f),AutoSize = true)
mainForm.Controls.Add(target_label) 
 
[1 .. 9]
    |> List.map (makeButton target_label 50 50 )
    |> putRowControls mainForm 10 10 80 
 
mainForm.Show() |> ignore
 
実行例 
 
803.jpg
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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