スポンサーサイト

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

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

今回はNumericUpDownを紹介します。
これは下のような部品で、ブラウザでインターネットショッピングをするときに数量を指定するときに使われるのと同じようなものです。 
 
810-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
 
まずNumericUpDownを使用上の注意点としては、保持する値がDecimal 値型であるということです。
decimal 値型は、正の 79,228,162,514,264,337,593,543,950,335 から負の 79,228,162,514,264,337,593,543,950,335 までの範囲の 10 進数を表します。
decimal型は末尾にMをつけて表します。
 
> let a = 23M;;
val a : decimal = 23M
 
int32型をdecimal型に変換するには次のようにします。
 
> decimal 27;;
val it : decimal = 27M
 
逆は次のようになります。(大きすぎる値では例外が発生します。)
 
> int 29M;;
val it : int = 29
 
一つインスタンスを生成してみます。
 
> let myNUD = new NumericUpDown();;
 
val myNUD : NumericUpDown =
  System.Windows.Forms.NumericUpDown, Minimum = 0, Maximum = 100
  
フォームにのっけておきます。
> mainForm.Controls.Add(myNUD);;
val it : unit = ()
 
> myNUD;;
 
とすることでデフォルト時のプロパティをみることができます。
val it : NumericUpDown =
  System.Windows.Forms.NumericUpDown, Minimum = 0, Maximum = 100
    {Accelerations = seq [];
     AccessibilityObject = ControlAccessibleObject: Owner = System.Windows.Forms.NumericUpDown, Minimum = 0, Maximum = 100;
    中略
     Visible = true;
     Width = 120;
     WindowTarget = System.Windows.Forms.Control+ControlNativeWindow;}

ということでデフォルトでは最小値(プロパティ名Minimum)が0M,最第値(プロパティ名Minimum)が100Mです。
 
値を設定するのには、Valueプロパティを利用します。(この値は最小値以上、最大値以下であることが必要です。)
 
> myNUD.Value <- 55M;;
val it : unit = ()
 
これでウィンドウ上のNumericUpDownに表示される値が変化したことと思います。
 
NumericUpDownのイベントで圧倒的によく使用されるのが、ValueChangedで、これは値が変更された時に発火されます。
 
では、簡単な足し算テストプログラムを作成してみます。ラベルが2つをNumericUpDownが1つウィンドウフォームに乗っけて、ラベルに表示される2つの数をNumericUpDownに入力し正解なら、新しい問題を出題し、不正解なら再入力を促すというものです。
簡易の数値入力用コントロールとしてNumericUpDownを使用するという、少々邪道なプログラムですが、あくまでサンプルとしてご覧ください。
 
(実行例) 
 
810-2.jpg  
 
(ソース)
open System
open System.Windows.Forms
open System.Drawing
 
let rnd = new Random()
let NumMax = 18 //問題中の最大数(これより大きい数は出題されない)
 
let mutable cur_ans = 0M  //現在の出題中の問題の答
 
let setLabelAndNewProblem (lb1:Label,lb2:Label) ()  =
    let x1 = rnd.Next(NumMax)+1 //+1は0を出題しないため
    let x2 = rnd.Next(NumMax)+1
    lb1.Text <- x1.ToString()
    lb2.Text <- x2.ToString() 
    cur_ans  <- decimal(x1+x2) //cur_ansに答えもセットされる
 
let setValue0AndSelect (nup:NumericUpDown) =
    nup.Value <- 0M //正解しようがしまいが0に設定
    nup.Select(0,1) //0を選択状態に, Select(開始位置、文字数)    
 
let mainForm = new Form(Width = 280, Height = 145, Text = "MyNumericUpDownr Window")
mainForm.Show() |> ignore
 
let myLabel1 = new Label(Location = new Point(30,10),TextAlign = ContentAlignment.MiddleRight)
let myLabel2 = new Label(Location = new Point(30,30),TextAlign = ContentAlignment.MiddleRight)
let setNewProblem  = setLabelAndNewProblem (myLabel1,myLabel2)//部分適用を使ってラベルを固定,unit->unit型の関数となる
let myNumericUpDown = new NumericUpDown(Location = new Point(30,70),TextAlign = HorizontalAlignment.Right,
                                        Minimum = -1000000M,
                                        Maximum =  1000000M
                                        )
myNumericUpDown.ValueChanged.AddHandler(fun sender _ ->
                                          let myNUD = (sender :?> NumericUpDown)
                                          if myNUD.Value = cur_ans then //正解なら新しい問題をセット
                                              setNewProblem()
                                          setValue0AndSelect myNumericUpDown                                       )
mainForm.Controls.Add(myLabel1)
mainForm.Controls.Add(myLabel2)
mainForm.Controls.Add(myNumericUpDown)
setNewProblem()
setValue0AndSelect myNumericUpDown  
myNumericUpDown.Select() //フォーカスをmyNumericUpDown にあてる  
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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