スポンサーサイト

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

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

今回はListBoxを紹介します。
これは下のような部品で、複数の選択肢から一つ(もしくは複数)の選択をユーザーに対して可能なのものにします。 
 
812-1.jpg 
 
 
では。部品を乗っけるウィンドウズフォームをいつも通り用意しておきます。
 
> open System
open System.Windows.Forms
open System.Drawing
 
let mainForm = new Form(Width = 280, Height = 300, Text = "MyNumericUpDownr Window")
mainForm.Show() |> ignore;;
 
val mainForm : Form = System.Windows.Forms.Form, Text: MyNumericUpDownr Window
 
ListBoxのインスタンスを一個作成してフォームにのっけてみます。
 
> let myListBox = new ListBox( Location = new Point(30,30) )
mainForm.Controls.Add(myListBox);;
 
val myListBox : ListBox = System.Windows.Forms.ListBox
 
これで、フォーム上にListBoxが出現しました。ただ、これでは中身が空なので、ListBoxに中身を追加したいと思います。
 
ListBoxに追加可能なのはobj型の値です。(言い換えるとなんでもOKということです。)
ただしListBoxに表示されるのは、その値に対してToStringメソッドを適用したものとなります。
 
では項目(アイテム)を追加してみます。追加にはItems.Addを用います。
> myListBox.Items.Add("hello")//文字列を追加
;;
val it : int = 0
 
これでListBoxにhelloと表示されました。なお返り値として0が返ってきていますが、これは追加した項目のインデックスです。使わない場合はignoreしておきましょう。
 
いくつか項目を追加してみます。
> myListBox.Items.Add(t) |> ignore              //int型
myListBox.Items.Add(3.1f) |> ignore             //float型
myListBox.Items.Add((fun x -> x + 1)) |> ignore //関数
myListBox.Items.Add([0;2;4])  |> ignore         //リスト
;;
 
これでListBoxは次のようになります。(それぞれのobjのToStringメソッドの結果です。) 
 
812-2.jpg  
 
これではまだ、どの項目も選択されていないで、どれかを選択したいとおもいます。
実行時に選択するにはそれをクリックするわけですが、プログラム上で選択するには例えば次のようにします。
○SelectedIndexを利用する例
 
> myListBox.SelectedIndex <- 2;;
val it : unit = ()
 
これで、上から3番目の3.1が選択状態となります。
 
> myListBox.SelectedIndex <- -1;;
val it : unit = ()
 
とすると、どれも選択されていない状態となります。
 myListBox.ClearSelected()としても同じです。
 
○SelectedItemを利用する例
 
> myListBox.SelectedItem <- t;;
val it : unit = ()
 
これで、識別子tと結びついた3が選択状態となります。
 
> myListBox.SelectedItem <- null;;
val it : unit = ()
 
とすると、どれも選択されていない状態となります。
 
逆に選択されたものを参照するには次のようにします。
 
まずは上から5番目の[0;2;4]を選択状態にしておきます。
 
> myListBox.SelectedIndex <- 4;;
val it : unit = ()
 
選択されたものを参照します。(obj型の値が返ることに留意してください。)
> myListBox.SelectedItem;;
val it : obj = [0; 2; 4]
 
これをリストとして取り扱うにはキャストが必要となります。
> (myListBox.SelectedItem :?> List<int>);;
val it : List<int> = [0; 2; 4]
 
ということで、まとめると、「ListBoxに項目はobj型の値として収納される。表示されるのはその値にToStringメソッドを適用したものである。取り出した値を収納まえの値として取り扱うにはキャストが必要となる。」
 
収納されているアイテムの一覧は次のようにして得ることができます。
 
> myListBox.Items;;
val it : ListBox.ObjectCollection =
  seq ["hello"; 3; 3.0999999f; <fun:clo@17-1>; ...]
  
3番目のアイテムを参照するには次のようにします。
 
> myListBox.Items.Item 2;;
val it : obj = 3.0999999f
 
アイテムの総数は次で求めることができます。
> myListBox.Items.Count;;
val it : int = 5
 
ある要素が含まれるかどうかは次のように判定できます。
 
> myListBox.Items.Contains([0;2;4]);;
val it : bool = true
 
空っぽにするには次のようにします。
 
> myListBox.Items.Clear();;
val it : unit = ()
 
中身を空にするには次のようにします。
 
一般には同じ型のものをListBoxに収納することが多いと思われます。
例えば1から100までの整数をListBoxに収納してみます。
 
[1..100] 
|> List.iter(fun x -> myListBox.Items.Add x |> ignore)
 
それでは次にこの状態のListBoxを複数選択可能にしてみます。
 
> myListBox.SelectionMode <- SelectionMode.MultiSimple;;
val it : unit = ()
 
それでは、ウィンドウフォームで1,3,5を選択してみてください。 
 
812-3.jpg 
 
選択した値の一覧を得るには次のようにします。
 
> myListBox.SelectedItems;;
val it : ListBox.SelectedObjectCollection = seq [1; 3; 5]
 
なおこれはListBox.SelectedObjectCollection型なので、例えばリストに変換するには次のようにします。
 
> [for e in t -> e];;
val it : obj list = [4; 7]
 
int型のリストにする方法は以下の通りです。
 
> [for e in t -> (e :?> int)] ;;
val it : int list = [4; 7]
 
 
それではこれにボタンとラベルを追加して、ボタンを押すと選択した値の和をラベルに表示するようにしてみます。
 
実行例 
 
812-4.jpg  
 
ソース
 
open System
open System.Windows.Forms
open System.Drawing
 
 
let mainForm = new Form(Width = 250, Height = 250, Text = "MyListBox Window")
mainForm.Show() |> ignore
 
let myListBox = new ListBox( Location = new Point(10,40),SelectionMode = SelectionMode.MultiSimple )
let myLable = new Label(Location = new Point (10,10),Text = "0")
let myButton = new Button(Location = new Point (120,10),Text = "Calc sum")
 
mainForm.Controls.Add(myListBox)
mainForm.Controls.Add(myLable)
mainForm.Controls.Add(myButton)
 
[1..100] 
|> List.iter(fun x -> myListBox.Items.Add x |> ignore)
 
myButton.Click.Add(fun _ ->let sum = List.fold (+) 0 [for e in myListBox.SelectedItems -> (e :?> int)]
                           myLable.Text <- sum.ToString()
                           )   
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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