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