2014-01-08 1 views
0

У меня есть перечисление:Изменение переменной во время выполнения

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, в не слишком-overkill образом?

TL; вопрос с бонусом DR: могу ли я легко сделать работу с прямоугольником, как в MSPaint?

+0

Почему вы не используете 'Application.Run (new form())'? Кроме того, попробуйте поставить printf в событиях –

+0

Потому что я не знал о его существовании. Спасибо :) Кроме того, я поставил следующее, чтобы проверить, что события сделали что-то: rectangleButton.Click.Add (fun (x) -> rectangleButton.Text <- "test"). И они изменили buttontext –

ответ

1

Так что я заметил проблему:

когда вы

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

Внутри лямбда-х не изменится. Вы, вероятно, хотите, чтобы либо избавиться от let x = ... перед лямбда или использовать реф ячейку, как это:

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()) 
+0

Я изменил selectedTool на вызов ref и назначил свои переменные с: = вместо этого, и он отлично работает! Но я не смог оттянуть матч. Это то, что я получил до сих пор: 'let mouseEvent = (newline) form.MouseDown = (новая строка) match selectedTool with (newline) | Ellipse -> Event.add (fun (evArgs) -> g.G.Draw (перо, x, y, w, h)) (новая строка) | Прямоугольник -> g.G.Draw (перо, x, y, w, h) ' Ни одна из вышеперечисленных строк не будет работать. Я отмечу как ответ, но буду очень рад, если вы поможете мне в матче. Редактировать: добавлена ​​(новая строка) и код кода для уточнения –

+0

@PontusMagnusson - см. Обновленный ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^