スポンサーサイト

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

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

今回はComboBoxの紹介です。
それではいつも通り部品をのっけるWindows Formを準備しておきます。
 
open System
open System.Windows.Forms
open System.Drawing
 
let mainForm = new Form(Width = 460, Height = 150, Text = "MyComboBox Window")
mainForm.Show() |> ignore
 
ComboBoxのインスタンスを一個作成してフォームにのっけてみます。
 
> let myComboBox01 = new ComboBox(Location = new Point(10,10));;
val myComboBox01 : ComboBox = System.Windows.Forms.ComboBox, Items.Count: 0
 
フォームにのっけます。(次のような状態になります。)
mainForm.Controls.Add(myComboBox01) 
 
818-1.jpg 
 
では項目を追加してみます。
> myComboBox01.Items.Add(3) |> ignore;;
val it : unit = ()
 
この作業をしても、ComboBoxの見え方は変わらないのですが、ドロップダウン表示用の右のボタン部分をクリックすると、次のようになります。 
 
818-2.jpg 
 
このように追加した項目は選択の候補として追加されています。
同様にItemをいくつか追加しておきます。
List.iter (fun t -> myComboBox01.Items.Add(t) |> ignore) [1;6;9]
 
選択候補の一覧は次のようにして調べることができます。
> myComboBox01.Items;;
val it : ComboBox.ObjectCollection = seq [3; 1; 6; 9]
 
comboBoxというのはTextBoxとListBoxのキメラのようなコントロールで、テキスト表示領域にキーボードから入力もできますし、リストから選択もできるようになっています。
 
それでは、一つのボタンといくつかのラベルを配置して、ボタンを押すと、comboBoxのいくつかのプロパティの状態がF#Interactiveに表示されるようにします。
 
let mainForm = new Form(Width = 460, Height = 150, Text = "MyComboBox Window")
mainForm.Show() |> ignore
 
let myComboBox01 = new ComboBox(Location = new Point(10,10))
mainForm.Controls.Add(myComboBox01)
 
[10;11;12;13]
|> List.iter (fun t -> myComboBox01.Items.Add(t) |> ignore) 
 
let myButton = new Button(Location = new Point(10,80))
mainForm.Controls.Add(myButton)
myButton.Click.Add(fun _ ->
                    printfn "myComboBox01.SelectedItem = %A" myComboBox01.SelectedItem
                    printfn "myComboBox01.SelectedIndex = %A" myComboBox01.SelectedIndex
                    printfn "myComboBox01.SelectedValue = %A" myComboBox01.SelectedValue
                    printfn "myComboBox01.Text = %A" myComboBox01.Text
                    ) 
  
818-3.jpg 
 
この状態でボタンを押すと。F#Interactiveに次のように表示されます。
 
> myComboBox01.SelectedItem = <null>
myComboBox01.SelectedIndex = -1
myComboBox01.SelectedValue = <null>
myComboBox01.Text = ""
 
次に"Hello, World"と打ち込んでからボタンを押します。 
 
818-4.jpg 
 
myComboBox01.SelectedItem = <null>
myComboBox01.SelectedIndex = -1
myComboBox01.SelectedValue = <null>
myComboBox01.Text = "Hello, World"
 
次にドロップダウンリストから12を選んでからボタンを押します。 
 
818-5.jpg

> myComboBox01.SelectedItem = 12
myComboBox01.SelectedIndex = 2
myComboBox01.SelectedValue = <null>
myComboBox01.Text = "12"
 
新規入力部分はTextBoxのように、ドロップダウンリストのほうはListBoxのように、ふるまっています。
共通して値が拾えるのはTextプロパティです。
ということで、「文字列の入力、選択」という用途では、Textプロパティの値を使用すればよさそうですが、例えばint型の値を得る場合で「ドロップダウンリストにあればそれを選択してもよいし、入力したければ入力してもよい」という形で使用する場合は注意が必要です。
この場合入力部分での入力をして次のコントロールにフォーカスが移る時にきちんとint型にparseできるかどうかの確認をする必要がでてきます。
 
ComboBoxに対して、int型の値をドロップダウンリストに登録したうえで、入力テキストをintにparseできるものに制限する関数をつくってみます。
 
let initComboForInt (cb:ComboBox) (intLst :list<int>)=
   //ドロップダウンリストの要素は一つ以上で設定すること
   if List.length intLst = 0 then
      failwith "引数のリストの要素が空です"
   else  
      //ドロップダウンリストへの要素の追加
      intLst     
      |> List.iter (fun t -> cb.Items.Add(t) |> ignore)
      //ドロップダウンリストの最初の数を初期値にする
      cb.SelectedIndex <- 0
      //表示を右寄せにする
      cb.RightToLeft <- RightToLeft.Yes
 
      //テキスト入力した場合の値の妥当性の検証をvalidatingイベントに加える
      cb.Validating.Add(fun e -> 
        if cb.SelectedIndex < 0 then
                let (isParseSuccess,_) = (System.Int32.TryParse (cb.Text)) 
                if isParseSuccess = false then
                                    
                    MessageBox.Show( "整数を入力してください。","注意",MessageBoxButtons.OK) 
                    |> ignore
                                    
                    e.Cancel <- true
        )
 
コンボボックスから入力or選択されたものをint型の値として取り出す関数も定義しておきます。
 
let getCombValueAsInt (cb:ComboBox) =
        let (isParseSuccess,intVal) = System.Int32.TryParse (cb.Text)
        if isParseSuccess = false then
            failwith "コンボボックス内の値が不正です。" //initComboForInt を使っている限りは起こらないはず
        else
            intVal
 
ではこれらを使って足し算プログラムを作成してみます。下のようなフォームで二つのコンボボックスで、値を入力または選択してボタンを押すと結果が右端のラベルに表示されるという簡単なプログラムです。
 
(実行例)コンボボックスでは、値を選択することも入力することもできる。int型に変換できないものが入力されたときはMessegeBoxが表示される。 
 
818-6.jpg  
 
818-7.jpg 
 
ソース
 
open System
open System.Windows.Forms
open System.Drawing
 
 
let initComboForInt (cb:ComboBox) (intLst :list<int>)=
   //ドロップダウンリストの要素は一つ以上で設定すること
   if List.length intLst = 0 then
      failwith "引数のリストの要素が空です"
   else  
      //ドロップダウンリストへの要素の追加
      intLst     
      |> List.iter (fun t -> cb.Items.Add(t) |> ignore)
      //ドロップダウンリストの最初の数を初期値にする
      cb.SelectedIndex <- 0
      //表示を右寄せにする
      cb.RightToLeft <- RightToLeft.Yes
 
      //テキスト入力した場合の値の妥当性の検証
      cb.Validating.Add(fun e -> 
        if cb.SelectedIndex < 0 then
                let (isParseSuccess,_) = (System.Int32.TryParse (cb.Text)) 
                if isParseSuccess = false then
                                    
                    MessageBox.Show( "整数を入力してください。","注意",MessageBoxButtons.OK) 
                    |> ignore
                                    
                    e.Cancel <- true
        )
 
let getCombValueAsInt (cb:ComboBox) =
        let (isParseSuccess,intVal) = System.Int32.TryParse (cb.Text)
        if isParseSuccess = false then
                failwith "コンボボックス内の値が不正です。" //initComboForInt を使っている限りは起こらないはず
        intVal
 
let mainForm = new Form(Width = 520, Height = 100, Text = "MyCalcWithComboBox Window")
 
 
let myComboBox01 = new ComboBox(Location = new Point(10,10))
let myComboBox02 = new ComboBox(Location = new Point(150,10))
let myButton = new Button(Location = new Point(290,10),Text = "=")
let myLabel = new Label(Location = new Point(350,10),TextAlign = ContentAlignment.MiddleRight,Width = 100)
 
initComboForInt myComboBox01 [0;1;2;3]
initComboForInt myComboBox02 [0;1;2;3]
 
myButton.Click.Add(fun _ ->  let intVal01 = getCombValueAsInt (myComboBox01)
                             let intVal02 = getCombValueAsInt (myComboBox02)
                             myLabel.Text <- (intVal01 + intVal02).ToString()
                   )
 
mainForm.Controls.Add(myComboBox01)
mainForm.Controls.Add(myComboBox02)
mainForm.Controls.Add(myButton)
mainForm.Controls.Add(myLabel)
 
mainForm.Show() |> ignore
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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