在运行时更改变量

时间:2014-01-08 03:00:46

标签: forms events f# mutable

我有一个枚举:

type Tool = 
    | Rectangle = 0
    | Circle = 1

用于保存枚举值的变量:

let mutable selectedTool : Tool = Tool.Rectangle

我有两个按钮:

let btn (location:Point) (size:Size) =
    let bt = new Button()
    do bt.Location <- location
    do bt.Size <- size
    bt
// These badboys right here:
let rectangleButton = btn (Point(0, 0)) (Size(50,50))
let ellipseButton = btn (Point(50, 0)) (Size(50,50))

他们每人都有一个事件连接到他们:

let btnRectEvent = rectangleButton.Click.Add(fun(x) -> selectedTool <-Tool.Rectangle)
let btnElliEvent = ellipseButton.Click.Add(fun(x) -> selectedTool <- Tool.Circle)

我希望我的事件能够更改selectedTool变量的值。 目前,它不起作用。
然后我在我的绘图区域记录我的MouseDown事件以使用此事件绘制形状:

let mouseEvent =
    let x = selectedTool
    form.MouseDown
    |> Event.add ( fun (evArgs1) -> 
            if x = Tool.Circle then
                graphics.Graphics.DrawEllipse(whitePen, evArgs1.X, evArgs1.Y, 15, 15)
            else 
                graphics.Graphics.DrawRectangle(whitePen, evArgs1.X, evArgs1.Y, 15, 15)
            form.Refresh())

表单运行如下:

form.Controls.Add(rectangleButton)
form.Controls.Add(ellipseButton)

form.Show()
while form.Created do
    Application.DoEvents()

奖金问题但不需要回答:
是否有可能在按钮上捕捉点击事件,等待绘图区域上的mousedown事件,放置我的形状的第一个角落,当我移动鼠标时预览形状,并设置第二个角落在mouseUp上,以一种不太过分的方式?

TL; DR红利问题:我可以像在MSPaint中一样轻松地进行矩形绘制工作吗?

1 个答案:

答案 0 :(得分:1)

所以我发现了这个问题:

当你做

let x = selectedTool
form.MouseDown
|> Event.add ( fun (evArgs1) -> 
    Something goes here

lambda x内部不会改变。您可能想要在lambda之前删除let x = ...或使用这样的ref单元格:

let selectedTool  = ref Rectangle

然后你用

分配
selectedTool := Circle

并使用

获取值
if (!selectedTool) = Circle

虽然比赛会更常见 - 比如说

form.MouseDown
|> Event.add ( fun (evArgs1) -> 
    match (!selectedTool) with
    |Circle -> graphics.Graphics.DrawEllipse(whitePen, evArgs1.X, evArgs1.Y, 15, 15)
    |Rectangle -> graphics.Graphics.DrawRectangle(whitePen, evArgs1.X, evArgs1.Y, 15,15)
    form.Refresh())