2012-01-02 34 views
0

我有一個類型F#從返回函數返回值單位

type figure = 
{ 
    what : int; 
    position : Point; 
    size : Point; 
} 

,我想我的函數返回這種類型的,但因爲它是它要返回一個單元的事件() 如何我得到我的函數返回這種類型而不是單位?

let checkInput = 
drawArea.MouseClick.Add(fun args -> 
    if args.Button = MouseButtons.Left then 
     new figure { what = 0; position = new Point(args.X, args.Y); size = new Point(50, 50) }) 

任何幫助,在此,將不勝感激

+1

引用單元格的值什麼是你想準確地完成?即使可以讓你的函數返回一個數字並且仍然將它傳遞給'Add','Add'也不可能對返回值做任何事情,所以它將被忽略。 – sepp2k 2012-01-02 00:39:28

+0

@ sepp2k我想要做的是有一個函數,檢查mouseclick,然後從鼠標點擊的位置,並將其存儲到我的身影。然後將該圖返回到另一個功能。這並不是要傳遞給'添加' – OlssN 2012-01-02 01:13:49

+1

但是你將它傳遞給'添加'。如果你不想將它傳遞給'Add',那麼不要,你可以自由地返回你想要的東西。事情是:顯然你希望你的函數在鼠標點擊時被調用,而不是在你自己的代碼中手動調用它的特定時間。那麼你到底想把這個數字返回到哪裏呢? – sepp2k 2012-01-02 01:17:47

回答

1

在您的例子編譯器不知道如何處理新創建的人物做。圖需要存儲在某個地方或傳遞給一個函數。這是一個傳遞給函數的例子。當你點擊表格時,標題被更新到點擊的位置。

open System.Drawing 
open System.Windows.Forms 

type Figure = { 
    what : int; 
    position : Point; 
    size : Point; 
} 

let drawArea = new Form() 

let print figure = 
    drawArea.Text <- figure.position.ToString() 

drawArea.MouseClick.Add(fun args -> 
    if args.Button = MouseButtons.Left then 
     print { what = 0; position = Point(args.X, args.Y); size = Point(50) } 
) 

Application.Run(drawArea) 

在本例中,您需要在項目的引用下包含這兩個程序集。

System.Drawing 
System.Windows.Forms 
+0

這可以工作,爲什麼我沒有想到:(謝謝你先生 – OlssN 2012-01-02 19:32:29

0

這聽起來像是一個完美的理由使用一個參考單元 - 這樣

let fig = ref None 
let checkInput = 
drawArea.MouseClick.Add(fun args -> 
    if args.Button = MouseButtons.Left then 
     fig := Some(new figure { what = 0; position = new Point(args.X, args.Y); size = new Point(50, 50) })) 

然後,你可以檢查使用

match !fig with 
|Some(t) -> //do something 
|None -> //mouse hasn't been clicked 
+0

這似乎要走的路!謝謝! – OlssN 2012-01-02 19:31:56