1

我正在做一个名为“2dShapeEditor”的项目,您应该能够在表单上创建、单击和拖动不同类型的形状。在我现在所处的项目阶段,我需要确定我的目标矩形是哪种类型。它被初始化为“选项”,但可以通过“hittest”更改单击的特定矩形。

然后,我将我的 move 方法应用到这个矩形,使其随鼠标移动。

我的类型 RectangleZ

type RectangleZ(x:int, y:int)= 
  let mutable thisx = x
  let mutable thisy = y
  let mutable thiswidth = 50
  let mutable thisheight = 20
  let brush = new SolidBrush(Color.Black)
  member obj.x with get () = thisx and set x = thisx <- x
  member obj.y with get () = thisy and set y = thisy <- y
  member obj.width with get () = thiswidth and set width = thiswidth <- width
  member obj.height with get () = thisheight and set height = thisheight <- height
  member obj.thisColor = Color.FromArgb(167, 198, 253)
  member obj.draw(paper:Graphics) = paper.FillRectangle(brush, thisx, thisy, 50, 20)
  member obj.ShapeType = "Rectangle"

我最热门的方法:

let rec getShape (e:MouseEventArgs) (inputl:List<RectangleZ>) = match inputl with 
                                                               |[] -> None
                                                               |s::tail->if(((e.X >= s.x) && (s.x <= (s.x + s.width))) && ((e.Y >= s.y) && (e.Y <= (s.y + s.height)))) then Some(s) else getShape e tail //Some(s)

我的目标矩形如下所示:

let mutable targetedRec = None 

我的“Move()”方法如下所示:

let Move (e:MouseEventArgs) = if(targetedRec = None) then None else targetedRec.Value.x <- e.X
                                                                    targetedRec.Value.y <- e.Y

“Move()”方法给了我错误:“基于此程序点之前的信息查找不确定类型的对象。在此程序之前可能需要类型注释来约束对象的类型。这可能允许查找要解决。”

是的,编译器提示我出了什么问题以及如何修复它,我尝试过匹配 if 语句,但我根本不明白什么是错误的以及如何修复它。如果我删除了targetedRec 的Option 类型并将其作为“RectangleZ”类型,我的很多项目都会失败,因为我不能留空if 语句。有什么建议么?

4

1 回答 1

3

'targetedRec' 推断出什么类型?(您可以通过将鼠标悬停在其上并查看 Intellisense 工具提示来判断。)

从您发布的内容来看,F# 编译器只能推断“targetedRec”的类型'a option——也就是说,编译器知道它是一个选项(因为你已经分配None给它),但它不能告诉它是什么该选项的类型参数应该是。然后,您会在Move方法中看到错误,因为编译器无法判断xandy字段属于什么类型。

不过,这很容易解决——只需在你的声明中添加一个类型注释targetedRec,如下所示:

let mutable targetedRec : RectangleZ option = None

仅此一项就可以解决问题,但是您也可以通过使用模式匹配而不是手动检查属性Move来稍微清理一下您的方法:Value

let Move (e : MouseEventArgs) =
    match targetedRec with
    | None -> ()
    | Some targetedRec ->
        targetedRec.x <- e.X
        targetedRec.y <- e.Y
于 2012-12-17T17:26:50.473 回答