スポンサーサイト

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

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

ListBoxとListViewの投稿の順番を間違えてしまいました。話題はさかのぼりますが、今回はListViewの紹介です。

これはListBoxによく似ていて、複数の選択肢から一つ(もしくは複数)の選択をユーザーに対して可能なのものにします。
表示スタイルとして4種類が用意されているので、まずはこれを順番に見ていきます。
それではいつも通り部品をのっけるWindows Formを準備しておきます。
 
open System
open System.Windows.Forms
open System.Drawing
 
let mainForm = new Form(Width = 280, Height = 300, Text = "MyListView Window")
mainForm.Show() |> ignore
 
ListViewのインスタンスを一個作成してフォームにのっけてみます。
 
それでは中身を追加するためにmyListView.Items.と打ってみます。すると次のようになります。

815-1.jpg



単純な文字列を追加する以外では、ListViewItem型の値を追加するのがセオリーですので、次にこのListViewItem型のインスタンスを一つ生成して調べてみます。
 
> let myLVItem01 = new ListViewItem();;//22個のオーバーロード有
val myLVItem01 : ListViewItem = ListViewItem: {}
 
> myLVItem01;;
val it : ListViewItem =
  ListViewItem: {}
    {BackColor = Color [Window];
     Bounds = {X=0,Y=0,Width=0,Height=0};
     Checked = false;
     Focused = false;
     Font = [Font: Name=MS UI Gothic, Size=9, Units=3, GdiCharSet=128, GdiVerticalFont=False];
     ForeColor = Color [WindowText];
     Group = null;
     ImageIndex = -1;
     ImageKey = "";
     ImageList = null;
     IndentCount = 0;
     Index = -1;
     ListView = null;
     Name = "";
     Position = {X=-1,Y=-1};
     Selected = false;
     StateImageIndex = -1;
     SubItems = seq [ListViewSubItem: {}];
     Tag = null;
     Text = "";
     ToolTipText = "";
     UseItemStyleForSubItems = true;}
 
取り合えずこれをListViewに収納してみます。
 
> myListView.Items.Add(myLVItem01) |> ignore;;
val it : unit = ()
 
myLVItem01自身がデフォルトの状態で表示するものがないので、なにも変化はみられませんが、
> myListView.Items.Count;;
val it : int = 1
となることからも分かるようにちゃんと収納されています。
 
この状態で
>myLVItem01.Text <- "text01";;
とすると、ListViewの一行目にtest01と表示されます。
(これは、let myLVItem01 = new ListViewItem("test01");myListView.Items.Add(myLVItem01) |> ignoreとしても同じ事になります。)
 
一度に複数の文字列を登録するのであれば例えば次の様にできます。
 
["test02";"test03";"test04";"test05"]
|> List.iter(fun str -> myListView.Items.Add(new ListViewItem(str))|>ignore)
 
さてこの結果どうなっているかというと、下のようになっています。 
 
815-2.jpg 

 
「なんだこれは!」という感じですが、これには訳があって、ListViewには表示モードというものが5種類あるのです。デフォルトでは、大きいアイコンと一緒にテキストを表示モードになっています。
アイコンを一緒に表示するにはImageListクラスのインスタンスにイメージを登録しておき、更にListViewのLargeImageListプロパティにそれを設定したうえで、ImageListのインデックスとテキストを組にしてListViewに登録するのですが、ここでは割愛します。
ではモードを切り替えてみます。ListBoxと良く似た表示モード(Viewプロパティに設定する)はSamllIconとなります。
 
> myListView.View <- View.SmallIcon;;
val it : unit = () 
 
815-3.jpg 
 
これも、ListViewのSmallImageListプロパティにImageListクラスのインスタンスを登録して、テキスト毎にインデックスと一緒に登録すれば、アイコンも一緒に表示されるのですが、登録していないので、文字列だけが表示されます。(同様の手段で他のモードもすべて文字列と一緒にアイコンを表示可能です。)
 
あるItemだけを取り除くには、そのItemのRemoveメソッドを使います。
 
> myLVItem01.Remove();;
val it : unit = ()
 
もしくはListViewサイドからなら
>myListView.Items.Remove(myLVItem01);;
ともできますし、何番目を取り除くという指定の仕方をするのなら
> myListView.Items.RemoveAt(0);;
という処理になります。
 
全部取り除く場合は
>myListView.Items.Clear();;
とします。
 
次に複数のアイテム選択についてですが、ListViewはデフォルトで複数選択可能(MultiSelectプロパティがtrue)になっているので、Ctrlを押しながらクリックすることで、複数選択できます。
 
さて、それではListViewのそれぞれのアイテムに文字列以外の、何らかのオブジェクトを保持させるにはどうすればよいのでしょうか。一つの答えはTagプロパティを利用するというものです。Tagプロっパティには任意のobj型の値を収納できますので、(厳密にいえば、参照の値を持てる)これを使用します。
 
ではサンプルとして次のようなプログラムを作ってみます。 
 
815-4.jpg 
 
これは、一番上のNumericUpDownコントロールで数値を設定た上で、ListViewで操作(関数)を選ぶと、選んだ関数を順次上から元の数値に適用した結果が下のラベルに表示されるというプログラムです。
(特にListViewである必要性はなく、ListBoxでも同様のものは作れます。)
下の図では、種の2に3を加えて4を乗じているので(2+3)*4ということで結果の20が表示されています。
プログラムは以下の通りです。
 
open System
open System.Windows.Forms
open System.Drawing
 
let mainForm = new Form(Width = 360, Height = 300, Text = "MyListView Window")
mainForm.Show() |> ignore;;
 
//種になる数字の設定用のmyNumericUpDown
let myNumericUpDown = new NumericUpDown(Location = new Point(30,20),TextAlign = HorizontalAlignment.Right,
                                        Minimum = -100M,
                                        Maximum =  100M
                                        )
 
//関数を入れておくListView
let myListView = new ListView(View = View.SmallIcon,Location = new Point(30,80))
//フォーカスがなくなっても選択中のitemが分かるように表示
myListView.HideSelection <- false
 
//itemの表示用textとTag(これにint->int型の関数を入れる)のタプルをもとに、itemを作りListViewに収納
[(" 1を加える",(fun x -> x + 1));
 (" 3を加える",(fun x -> x + 3));
 (" 1を減ずる",(fun x -> x - 1));
 (" 5を減ずる",(fun x -> x - 5));
 (" 4を乗じる",(fun x -> x * 4));
 ("-4を乗じる",(fun x -> x * (-4)));
 (" 2乗する",  (fun x -> x * x ))]
|> List.iter(fun (str,f) -> 
                myListView.Items.Add(new ListViewItem(Text=str,Tag = f))|>ignore)//Tagに関数を収納
 
//計算結果用のLabel
let myLabel = new Label(Location = new Point(30,200),TextAlign = ContentAlignment.MiddleRight)
 
//種の値に対し、ListViewで選択されているitemのTagに入っているint->intの関数を次々に適用する
let calc () =
    let fLst = [for items in (myListView.SelectedItems) -> (items.Tag :?> (int -> int))]
    List.fold (fun acum f ->f acum) (int myNumericUpDown.Value) fLst
 
myListView.SelectedIndexChanged.Add(fun _ -> myLabel.Text <- (calc ()).ToString())
myNumericUpDown.ValueChanged.Add(fun _ -> myLabel.Text <- (calc ()).ToString())
 
mainForm.Controls.Add(myListView)
mainForm.Controls.Add(myLabel)
mainForm.Controls.Add(myNumericUpDown)
 
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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