1

フォーム上でさまざまな種類の形状を作成、クリック、ドラッグできる「2dShapeEditor」というプロジェクトを行っています。私が現在いるプロジェクトの段階で、対象の四角形がどのようなタイプであるかを判断する必要があります。「オプション」として初期化されますが、クリックされた特定の長方形に「最もヒットした」変更を行うことができます。

次に、この四角形に 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()」メソッドは、「このプログラム ポイントより前の情報に基づいて不定型のオブジェクトを検索します。オブジェクトの型を制約するために、このプログラムの前に型注釈が必要になる場合があります。これにより、ルックアップが解決されます。」

そして、はい、コンパイラは何が間違っているのか、それを修正する方法のヒントを与えてくれます。私はマッチングを試みました。TargetedRec の Option タイプを削除し、それを "RectangleZ" のタイプとして配置すると、if ステートメントを空白のままにできないため、多くのプロジェクトが失敗します。助言がありますか?

4

1 に答える 1

3

「targetedRec」で推測される型は何ですか? (マウスをその上に置いて、Intellisense ツールチップを見るとわかります。)

あなたが投稿したものから、F# コンパイラは 'targetedRec' の型を推測することしかできません。'a optionつまり、コンパイラはそれがオプションであることを認識しています (割り当てられNoneているため)。オプションの型パラメータは想定されています。次に、コンパイラがフィールドとフィールドが属するMove型を判別できないため、メソッドにエラーが表示されます。xy

ただし、これは非常に簡単に修正できます。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 に答える