次の方法で共有


Event.split<'T,'U1,'U2,'Del> 関数 (F#)

イベント引数に関数を適用すると Choice1Of2 が返る場合は、元のイベントを待機して 1 番目の結果イベントをトリガーする新しいイベントを返し、Choice2Of2 が返る場合は 2 番目のイベントをトリガーする新しいイベントを返します。

名前空間/モジュール パス: Microsoft.FSharp.Control.Event

アセンブリ: FSharp.Core (FSharp.Core.dll 内)

// Signature:
Event.split : ('T -> Choice<'U1,'U2>) -> IEvent<'Del,'T> -> IEvent<'U1> * IEvent<'U2> (requires delegate)

// Usage:
Event.split splitter sourceEvent

パラメーター

  • splitter
    型: 'T -> Choice<'U1,'U2>

    イベント値を 2 つの型の一方に変換する関数 (通常はアクティブ パターン レコグナイザー)。

  • sourceEvent
    型: IEvent<'Del,'T>

    入力イベント。

戻り値

イベントのタプル。 splitter が Choice1of1 と評価されると常に 1 番目のイベントが発生し、splitter が Choice2of2 と評価されると常に 2 番目のイベントが発生します。

解説

この関数は、コンパイルされたアセンブリでは Split という名前です。 F# 以外の言語から、またはリフレクションを使用してこの関数にアクセスする場合は、この名前を使用します。

使用例

Event.split 関数を使用してフォーム上のコントロールを移動する機能を実装する方法を次のコードに示します。 splitter 関数は、マウス ボタンの状態を表すアクティブ パターン レコグナイザー (|Down|Up|) です。 マウス ポインターがボタン上にあるときにユーザーがマウス ボタンを押しながらマウスを動かすと、ボタンが移動します。 使用されるマウス ボタンに応じて、移動中のボタンの色を変更するコードもあります。 このテストでは、マウス ボタンごとに異なる色を使用します。 マウス ボタンが押されていないときに使用するもう 1 つのイベント経路では、ボタンを離すとボタンの色が元に戻ります。

open System.Windows.Forms
open System.Drawing
open Microsoft.FSharp.Core

let form = new Form(Text = "F# Windows Form",
                    Visible = true,
                    TopMost = true)

let button = new Button(Text = "Button",
                        Visible = true,
                        Left = 100,
                        Width = 50,
                        Top = 100,
                        Height = 20)

form.Controls.Add(button)
let originalColor = button.BackColor
let mutable xOff, yOff = (0, 0)

let (|Down|Up|) (evArgs:MouseEventArgs) =
    match evArgs.Button with
    | MouseButtons.Left 
    | MouseButtons.Right 
    | MouseButtons.Middle -> Down(evArgs)
    | _ -> Up

button.MouseDown 
|> Event.add(fun evArgs ->
    xOff <- evArgs.X
    yOff <- evArgs.Y)

form.MouseMove
|> Event.map (fun evArgs -> (evArgs.X, evArgs.Y))
|> Event.add (fun (x, y) -> form.Text <- sprintf "(%d, %d)" x y)

let (dragButton, noDragButton) = Event.split (|Down|Up|) button.MouseMove

// Move the button, and change its color if the user uses the 
// right or middle mouse button.
dragButton |> Event.add ( fun evArgs ->
    match evArgs.Button with
    | MouseButtons.Left ->
        button.BackColor <- originalColor
    | MouseButtons.Right ->
        button.BackColor <- Color.Red
    | MouseButtons.Middle ->
        button.BackColor <- Color.Blue
    | _ -> ()
    button.Left <- button.Left + evArgs.X - xOff
    button.Top <- button.Top + evArgs.Y - yOff
    button.Refresh())

// Restore the button's original color when the mouse is moved after 
// the release of the button.
noDragButton |> Event.add ( fun () -> 
    button.BackColor <- originalColor)

プラットフォーム

Windows 8、Windows 7、Windows Server 2012 で Windows Server 2008 R2

バージョン情報

F# コア ライブラリのバージョン

サポート: ポータブル 2.0、4.0

参照

関連項目

Control.Event モジュール (F#)

Microsoft.FSharp.Control 名前空間 (F#)