スポンサーサイト

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

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

今回はボタンについて調べてみます。
まずはボタンをのっけるためのフォームを生成しておきます。
 
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
 
ここで >t;; とすると、詳細な情報をみることができます。
 
フォームにのっけてみます。
 
> mainForm.Controls.Add(t);;
val it : unit = ()
 
これでフォーム上にボタンは表示されますが、もちろん押しても何も起こりません。
押されたことに対して何か反応させるにはボタンのClickイベントにデリゲートを登録する必要があります。
まずはClickイベントについて調べてみます。
 
> let ce = t.Click;;
 
val ce : IEvent<EventHandler,EventArgs>
 
ここでIEvent<EventHandler,EventArgs>型はIObservable<EventArgs>とIDelegateEvent<EventHandler> インターフェイスを実装しています。
 
ということで、ce.と打つとIObservable<EventArgs>とIDelegateEvent<EventHandler>のメソッドが一覧で出てきます。
 
まずはIDelegateEvent<EventHandler>の方のメソッドを調べてみます。
> ce.AddHandler ;;
val it : (EventHandler -> unit) = <fun:it@4>
> ce.RemoveHandler;;
val it : (EventHandler -> unit) = <fun:it@5-1>
 
EventHandlerデリゲートは次のように定義されています。
 
type EventHandler = 
    delegate of 
        sender:Object * 
        e:EventArgs -> unit
 
パラメーター
sender
型 : System.Object
イベントのソース。
 
e
型 : System.EventArgs
イベント データを格納している EventArgs。
 
ではボタンが押された時に発火されるデリゲートを定義してみます。
 
>let handler0 = EventHandler(fun sender e -> printfn "%A %A" sender e);;
 
val hander0 : EventHandler
 
登録します。
> ce.AddHandler handler0;;
val it : unit = ()
なお
cd.AddHandler (fun sender e -> printfn "%A %A" sender e)
としても、登録できます。(自動的にデリゲートに変換してくれます。)
 
フォームでボタンを押すとF#Interactiveに次のように表示されます。
System.Windows.Forms.Button, Text: Push me System.Windows.Forms.MouseEventArgsMouseEventArgs)
これでこの場合のsenderとeventArgの型が分かりました。
 
handler0を取り除いておきます。
 
> ce.RemoveHandler handler0;;
val it : unit = ()
 
 
これでフォームでボタンを押しても何の反応しなくなりました。
 
次に別のイベントハンドラーを登録してみます。
 
> let handler1 = EventHandler(fun sender e  ->
                               let sBtn = sender:?>Button //キャスト
                               sBtn.Width <- sBtn.Width + 10);;
 
val handler1 : EventHandler
 
>ce.AddHandler handler1 ;;
val it : unit = ()
 
これで押すたびに長さの伸びる気色悪いボタンができあがりました。
 
取りはずしておきます。
 
> ce.RemoveHandler handler1;;
val it : unit = ()
 
なおhandler1では引数のeは使っていないので(fun sender _ -> .....)と書くのがお作法です。
 
次は2番目の引数のMouseEventArgsMouseEventArgsの方を利用してみます。
 
let handler2 = EventHandler(fun sender e  ->
                               let eMEA = e:?>MouseEventArgs
                               eMEA.
 
とすると下図のように表示されますので、今回はLocationを選択してみます。 
 
802-1.jpg 
 
let handler2 = EventHandler(fun sender e  ->
                               let eMEA = e:?>MouseEventArgs
                               printfn "%A" (eMEA.Location))
 
 
ce.AddHandler handler2 
 


ボタンの色々な場所を押してみるとF#Interactiveに例えば次のように表示されます。
> {X=12,Y=7}
{X=43,Y=14}
 
取り外しておきます。
>ce.RemoveHandler handler2;;
 
それでは今回最後にボタンの右半分の場所をクリックするとボタンが伸びて、左半分の場所をクリックするとボタンが縮むという、変態ボタンを定義してみたいと思います。
 
let handler3 = EventHandler(fun sender e  ->
                               let sBtn = sender:?>Button
                               let eMEA = e:?>MouseEventArgs
                               if eMEA.X < (sBtn.Left + sBtn.Right) / 2 then
                                   sBtn.Width <- sBtn.Width - 10
                               else
                                   sBtn.Width <- sBtn.Width + 10 
                               )
 
ce.AddHandler handler3
 
(注意)小さくしすぎると制御不能となります。
 
次回はIObservable<EventArgs>の方を紹介します。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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