スポンサーサイト

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

F#入門 Windowsアプリケーション編 Tree View(3)

Tree Viewはツリー構造(二分木やrose tree)を視覚的に表現するのにもってこいなので、今回は二分木を試しにTree Viewで視覚化してみます。
 
今回使用する簡単なASTはこちらで定義したものです。
 
まずは準備です。
 
> open System
open System.Windows.Forms
open System.Drawing
 
 
type Ast0 = 
    |Val of int 
    |Multi of Ast0 * Ast0 
    |Plus of Ast0 * Ast0 
    |Minus of Ast0 * Ast0 
 
let mainForm = new Form(ClientSize = new Size(500,350), Text = "MyAutoComplete Window")
mainForm.Show() |> ignore
 
let myTreeView = new TreeView(Width = 280,Height = 280,Location = new Point(10,10))
mainForm.Controls.Add (myTreeView)
 
let ExpressAst0InTreeView (in_t:Ast0) =
    let rec subEAITV t (node : TreeNode) =
        match t with
        | Val v ->
            node.Nodes.Add(new TreeNode(Text =v.ToString(),Tag = t)) |> ignore
        | Multi (l,r) ->
            let newNode = new TreeNode(Text ="*",Tag = t)
            node.Nodes.Add(newNode) |> ignore
            subEAITV l newNode
            subEAITV r newNode
        | Plus (l,r) ->
            let newNode = new TreeNode(Text ="+",Tag = t)
            node.Nodes.Add(newNode) |> ignore
            subEAITV l newNode
            subEAITV r newNode
        | Minus (l,r) ->
            let newNode = new TreeNode(Text ="-",Tag = t)
            node.Nodes.Add(newNode) |> ignore
            subEAITV l newNode
            subEAITV r newNode
    let root = new TreeNode(Text = "Root",Tag = in_t)
    subEAITV in_t root
    root ;;
 
type Ast0 =
  | Val of int
  | Multi of Ast0 * Ast0
  | Plus of Ast0 * Ast0
  | Minus of Ast0 * Ast0
val mainForm : Form = System.Windows.Forms.Form, Text: MyAutoComplete Window
val myTreeView : TreeView = System.Windows.Forms.TreeView, Nodes.Count: 0
val ExpressAst0InTreeView : Ast0 -> TreeNode
 
この状態で空のTreeViewが表示されます。
 
それではいくつかASTの例を定義しておきます。
 
> let ex1 = Plus(Val(1),Val(2)) 
let ex2 = Minus(Val(3),Val(5))
let ex3 = Multi(ex1,ex2)
let ex4 = Plus(Minus(Val(7),Val(1)),ex3);;
 
val ex1 : Ast0 = Plus (Val 1,Val 2)
val ex2 : Ast0 = Minus (Val 3,Val 5)
val ex3 : Ast0 = Multi (Plus (Val 1,Val 2),Minus (Val 3,Val 5))
val ex4 : Ast0 =
  Plus (Minus (Val 7,Val 1),Multi (Plus (Val 1,Val 2),Minus (Val 3,Val 5)))
 
まずは
ex1を表示してみます。
 
> myTreeView.Nodes.Add(ExpressAst0InTreeView ex1) |> ignore
myTreeView.ExpandAll();; 
 
824-1.jpg 
 
次にex2を表示してみます。
 
> myTreeView.Nodes.Clear()
myTreeView.Nodes.Add(ExpressAst0InTreeView ex2) |> ignore
myTreeView.ExpandAll();; 
 
824-2.jpg 
 
次にex3を表示してみます。
 
> myTreeView.Nodes.Clear()
myTreeView.Nodes.Add(ExpressAst0InTreeView ex3) |> ignore
myTreeView.ExpandAll();; 
 
824-3.jpg 
 
次にex4を表示してみます。
 
> myTreeView.Nodes.Clear()
myTreeView.Nodes.Add(ExpressAst0InTreeView ex4) |> ignore
myTreeView.ExpandAll();; 
 
824-4.jpg 
 
次にテキストボックスを追加して、ノードをクリックするとそのノード以下の部分木を計算した値を表示するようにしてみます。
 
まずはAST0を評価して値を計算するeValの定義です。
 
> let rec eVal exp  = 
    match exp with 
    |Val(v)  
        -> v 
    |Multi(right,left)  
        -> (eVal right) * (eVal left) 
    |Plus (right,left) 
        -> (eVal right) + (eVal left) 
    |Minus (right,left) 
        -> (eVal right) - (eVal left);;
 
val eVal : Ast0 -> int
 
テキストボックスを追加し、ツリーノードがクリックされたときに、そのノードのタグをAst0にキャストして、eValで計算し、テキストボックスに表示するようにします。
 
> let myTextBox = new TextBox(Text = "0",Size = new Size(30,15),
                            Location = new Point(310,100))
 
myTreeView.NodeMouseClick.Add(fun e -> let calcV = eVal (e.Node.Tag :?> Ast0) 
                                                                               myTextBox.Text <- calcV.ToString()) 
mainForm.Controls.Add(myTextBox);;
 
val myTextBox : TextBox = System.Windows.Forms.TextBox, Text: 0
 
(実行例) 
 
824-5.jpg 

824-6.jpg 

824-7.jpg
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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