2014-01-08 114 views
2

我想用正方形對象列表在窗體上繪製正方形。在窗體上繪製正方形

let listOfSquares = ResizeArray() 

type square(x : float, y : float) = 
    let x = x 
    let y = y 
    let length = 50 
    let height = 50 

我使用下拉菜單來創建上點擊一個正方形,然後我還有一個菜單按鈕,無效的形式

let square = create.DropDownItems.Add("Square") 
let invalidate = file.DropDownItems.Add("Invalidate") 
square.Click.Add(fun _ -> listOfSquares.Add(new square(50.0, 50.0))) 
invalidate.Click.Add(fun _ -> form.Invalidate()) 

我遇到的問題是,OnPaint方法不畫正方形,但每次你點擊菜單按鈕的方塊都會添加到列表中。

override form.OnPaint e = 
    let g = e.Graphics 
    for square in listOfSquares do 
    g.FillRectangle(Brushes.Aqua, 300, 150, 48, 48); 

我試圖手動值添加到列表中,然後運行像下面

override form.OnPaint e = 
    listOfSquares.Add(50,50) 

    let g = e.Graphics 
    for square in listOfSquares do 
    g.FillRectangle(Brushes.Aqua, 300, 150, 48, 48); 

其中一期工程,我相信這個問題是在form.invalidate的程序,但即時通訊相當新的F#我無法找到問題。

+1

在這段代碼中,你實際上從來沒有在循環中使用'square'。 –

+0

此外,你應該縮進你的for循環的正文('g.fillrectangle'應該縮進四個空格) –

回答

2

首先,您需要添加一種方法來從您的方形類型中拉出屬性。我個人只使用這裏記錄:

type Square = { X : int; Y : int; Length : int; Height: int } 

有了這個,你點擊處理程序將需要:

square.Click.Add(fun _ -> listOfSquares.Add({ X = 50; Y = 50 ; Width = 50; Height = 50))) 

OnPaint方法需要實際繪製正方形:

override form.OnPaint e = 
    let g = e.Graphics 
    for square in listOfSquares do 
    g.FillRectangle(Brushes.Aqua, square.X, square.Y, square.Length, square.Height); 

請注意,這將在同一位置添加所有方塊,因此它們將被堆疊。當然,您會想要更改邏輯,以便每次都將其置於唯一的位置(更改X和Y)。


編輯:

經過進一步調查,這個問題實際上是,有一個額外的讓錯誤的範圍,這是導致事件處理程序添加到錯誤集合listOfSquares結合。這意味着OnPaint覆蓋與事件處理程序的不同ResizeArray有效。

+0

這個OnPaint仍然doesent畫,當我點擊square.Click並使其無效。之前我已經嘗試刷新,但它確實有所作爲。 – Bobson

+0

@ user2165793如果你在那裏放置一個斷點,它會被擊中嗎? –

+0

它確實在listOfSquares中爲正方形而行,但不是g.FillRectangle(Brushes.Aqua,square.X,square.Y,square.Length,square.Height) – Bobson