スポンサーサイト

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

F#入門 Windowsアプリケーション編 HScrollBar VScrollBar

HScrollBarは横方向のスクロールバーであり、VScrollBarは縦方向のスクロールバーです。 
 
811-1.jpg  
 
HScrollBarおよびVScrollBarのインスタンスを一つづつ作成してウィンドウズフォームにのっけてみます。
 
> open System
open System.Windows.Forms
open System.Drawing
 
let mainForm = new Form(Width = 280, Height = 280, Text = "MyNumericUpDownr Window")
mainForm.Show() |> ignore
 
let myHScrollBar = new HScrollBar(Location = new Point(30,10))
let myVScrollBar = new VScrollBar(Location = new Point(10,60))
 
mainForm.Controls.Add(myHScrollBar)
mainForm.Controls.Add(myVScrollBar);;
 
val mainForm : System.Windows.Forms.Form =
  System.Windows.Forms.Form, Text: MyNumericUpDownr Window
val myHScrollBar : System.Windows.Forms.HScrollBar =
  System.Windows.Forms.HScrollBar, Minimum: 0, Maximum: 100, Value: 0
val myVScrollBar : System.Windows.Forms.VScrollBar =
  System.Windows.Forms.VScrollBar, Minimum: 0, Maximum: 100, Value: 0
 
 
これで、上図のようなウィンドウが表示されます。
F#Interactiveからの返答をみると最小値0最大値100、値0がデフォルト値のようです。
 
> myHScrollBar;;と打つと、いつものようにプロパティの詳細が表示されます。
 
さて、HScrollBarもVScrollBarもScrollBarクラスの派生クラスなので、ScrollBarクラスにキャスト可能です。
キャストしてみます。(:?>ではなく、:>であることに留意してください。)
> let scrH = myHScrollBar :> ScrollBar;;
 
val scrH : ScrollBar =
  System.Windows.Forms.HScrollBar, Minimum: 0, Maximum: 100, Value: 0
 
>scrH;;と打つと、ScroolBarクラスとしてのプロパティの詳細が表示されます。
 
同様にmyVScrollBarもキャストしてみます。
 
> let scrV = myVScrollBar :> ScrollBar;;
 
val scrV : ScrollBar =
  System.Windows.Forms.VScrollBar, Minimum: 0, Maximum: 100, Value: 0
  
さてこうしておくと、scrHもscrVも共に一つのリスト(やseq等)に格納可能となります。
 
次のようにすると共に現在の値Valueが30となります。
 
> scrs
|> List.iter (fun scr -> scr.Value <- 30);;
val it : unit = ()
 
Scroll ->unit型の関数の代わりにScroll -> Scroll型の関数を>>で連結すれば複数の操作を同時にできます。
 
> scrs
|> List.iter ((fun scr -> scr.Value <- 20 ; scr)
              >>(fun scr -> scr.Minimum<- 10  ;scr)
              >>(fun scr -> scr.Maximum<- 120)) //iterを使うため最後の関数はunitを返すこと 
;;
val it : unit = ()
 
 
forを使うと次のようになります。
 
for scr in scrs do
    scr.Value <- 20
    scr.Minimum <- 10
    scr.Maximum <- 120
    
 
HScrollBar,VScrollBar のイベントでよく使われるのがscrH.ValueChangedイベントで、値が変化したときに発火されます。
 
さて、今まで紹介してきたTextBox等の部品は、Controlクラスの派生型です。一度Contorl型にキャストすれば、一つのリスト等に収納可能であり、Control型のもつ、プロパティ、メソッドを利用することができます。
 
例としてテキストボックスをインスタンス化して、Control型にキャストして、Control型のもつ、プロパティを表示してみます。
 
> let samp = new TextBox()
let asControl = samp :> Control;;
 
val samp : TextBox = System.Windows.Forms.TextBox, Text: 
val asControl : Control = System.Windows.Forms.TextBox, Text: 
 
> asControl;;
val it : Control =
  System.Windows.Forms.TextBox, Text: 
    {AcceptsReturn = false;
     AcceptsTab = false;
     中略
     Height = 19;
    中略
     Width = 100;
     WindowTarget = System.Windows.Forms.Control+ControlNativeWindow;
     WordWrap = true;}

 
なおメソッド、イベントについては、ソースコードでasContorl. とすればみることができますが、実際はMSDNをみるのが一番です。http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control_members(v=VS.80).aspx 
 
では、サンプルプログラムとして、水平方向のスクロールバーと、垂直方向のスクロールバーとテキストボックス、ボタンが一つずつあるウィンドウを作り、スクロールバーを動かすと、テキストボックスとボタンののサイズが変化するプログラムを書いてみます。
(実行例) 
 
811-2.jpg  
 
 
ソース (F# Interactiveに食わせてみてください。)
 
open System
open System.Windows.Forms
open System.Drawing
 
type WhatToDo =
    |WIDTH_CHANGE = 0
    |HEIGHT_CHANGE = 1
 
let doThings (doKind:WhatToDo) (v:int) (cntrlLst : list<Control>) =
    let selectedFunc : Control -> unit  =
        match doKind with
        |WhatToDo.WIDTH_CHANGE  -> (fun (ctrl:Control) -> ctrl.Width <- v)  
        |WhatToDo.HEIGHT_CHANGE -> (fun (ctrl:Control) -> ctrl.Height <- v)  
        |_ -> failwith "this cannot happen"
 
    List.iter selectedFunc cntrlLst
 
 
let mainForm = new Form(Width = 550, Height = 550, Text = "MyScrollBar Window")
mainForm.Show() |> ignore
 
//ダウンキャスト用関数
let dc2s c = c :> ScrollBar
let dc2c c = c :> Control
 
//TextBox,Buttonのそれぞれの初期位置と共通の初期サイズ
let (mytix,mytiy) = (150,150)
let (mybix,mybiy) = (300,300)
let (myiw,myih)= (80,30) //これは更にScrollBarの初期値にも利用する
 
let myTextBox = new TextBox(Location = new Point(mytix,mytiy),Size = new Size(myiw,myih),Multiline = true)
let myButton = new Button(Location = new Point(mybix,mybiy),Size = new Size(myiw,myih))
 
let ctrlLst = [dc2c myTextBox;dc2c myButton]
 
ctrlLst
|> List.iter (fun scr -> mainForm.Controls.Add(scr) ) 
 
let myScrHS = new HScrollBar(Location = new Point(50,30),Value = myiw ,Maximum = 200 )
let myScrVS = new VScrollBar(Location = new Point(30,60),Value = myih ,Maximum = 200)
 
let scrAndKindLst = [(dc2s myScrHS,WhatToDo.WIDTH_CHANGE);(dc2s myScrVS,WhatToDo.HEIGHT_CHANGE)]
 
scrAndKindLst 
|> List.iter (fun (scr,_) -> mainForm.Controls.Add(scr) ) 
 
scrAndKindLst
|> List.iter (fun (scr,kind) ->
                scr.ValueChanged.AddHandler(fun sender _->
                                                doThings kind (sender :?> ScrollBar).Value ctrlLst))
 
スポンサーサイト

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

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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