我正在做一个名为“2dShapeEditor”的项目,您应该可以在表单上创建,单击和拖动不同类型的形状。在我现在的项目阶段,我需要确定我的目标矩形是什么类型的。它被初始化为“选项”,但可以通过“点击”更改到单击的特定矩形。
然后我将我的移动方法应用于此矩形,使其随鼠标移动。
我的类型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语句。有什么建议吗?
答案 0 :(得分:3)
'targetedRec'的推断类型是什么? (您可以通过将鼠标悬停在它上面并查看Intellisense工具提示来判断。)
根据您发布的内容,F#编译器只能将'targetedRec'的类型推断为'a option
- 也就是说,编译器知道它是一个选项(因为您已经分配了{{1}到它),但它不能告诉选项的类型参数应该是什么。然后,您在None
方法中看到错误,因为编译器无法确定Move
和x
字段属于哪种类型。
这很容易修复 - 只需在y
的声明中添加类型注释,就像这样:
targetedRec
仅此一项就可以解决问题,但您可以通过使用模式匹配而不是手动检查let mutable targetedRec : RectangleZ option = None
属性来清除Move
方法:
Value