أحداث (F#)

أحداث تمكين you إلى associate دالة calls مع مستخدم الاجراءات و are important في GUI programming. أحداث can also be triggered بواسطة your applications أو بواسطة the operating النظام.

معالجة الأحداث

When you استخدم a GUI مكتبة مثل Windows Forms أو Windows Presentation Foundation (WPF), much of the تعليمات برمجية في your تطبيق runs في استجابة إلى أحداث that are predefined بواسطة the مكتبة. These predefined أحداث are الأعضاء of GUI فئات such كـ forms و عناصر التحكم. You can إضافة مخصص سلوك إلى a preexisting حدث, such كـ a زر انقر, بواسطة referencing the specific named حدث of interest (for مثال, the Click حدث of the Form فئة) و invoking the Add أسلوب, كـ shown في the following تعليمات برمجية.

open System.Windows.Forms

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

form.Click.Add(fun evArgs -> System.Console.Beep())
Application.Run(form)

The نوع of the Add أسلوب هو ('a -> unit) -> unit. Therefore, the معالج الأحداث أسلوب takes واحد معلمة, typically the حدث الوسيطات, و إرجاع unit. هو موضح في المثال السابق حدث معالج كتعبير لامدا. The معالج الأحداث can also be a دالة القيمة, كـ في the following تعليمات برمجية مثال. The following تعليمات برمجية مثال also shows the استخدم of the معالج الأحداث معلمات, which provide معلومات specific إلى the نوع of حدث. For a MouseMove حدث, the النظام passes a MouseEventArgs كائن, which يحتوي على the X و Y موضع of the مؤشر.

open System.Windows.Forms

let Beep evArgs =
    System.Console.Beep( )  
    

let form = new Form(Text = "F# Windows Form",
                    Visible = true,
                    TopMost = true)
                        
let MouseMoveEventHandler (evArgs : System.Windows.Forms.MouseEventArgs) =
    form.Text <- System.String.Format("{0},{1}", evArgs.X, evArgs.Y)

form.Click.Add(Beep)
form.MouseMove.Add(MouseMoveEventHandler)
Application.Run(form)

Creating مخصص أحداث

There are الثاني أساسى أنواع of أحداث that you can define في F# البرامج, و كلاهما can be exposed كـ قياسي .NET Framework أحداث إلى callers في لغات غير ذلك. The أول نوع of حدث هو the DelegateEvent. DelegateEventيطبقIDelegateEvent. تكون هذه الأحداث مناسبة ل interoperating مع غير ذلك اللغات، ولكن لا توفر وظائف إضافى من الأحداث ب #.

نوع الحدث الأخرى هو الممثلة F#‎ حدث الفئة الذي يقوم بتطبيق واجهة من IEvent. IEvent is itself an interface that combines the functionality of two other interfaces, IObservable and IDelegateEvent. ولذلك، Events وجود الوظيفة DelegateEvents، بالإضافة إلى وظيفة إضافى من IObservable، مما يعني أن يدعم F# أحداث تصفية الأحداث واستخدام F# أول-فئة الدالات والتعبيرات لامدا إلى معالجات حدث. Th هو وظيفة هو المتوفرة في وحدة نمطية? للأحداث.

إنشاء حدث على فئة مثل تصرفات فقط أي غير ذلك.NET Framework الحدث، إضافة إلى الفئة letربط الذي يعرف DelegateEventكحقل في class. يجب تحديد نوع معالج الأحداث كـ وسيطة "نوع". يجب أيضا تعريف أعضاء حدث الذي يستهدف الحدث كـ حدث CLI. يجب أن يكون هذا العضو السمة CLIEvent. هو تعريفها كخاصية والتنفيذ الخاص به هو استدعاء Publهوh خاصية حدث فقط. The following تعليمات برمجية مثال illustrates this.

open System.Collections.Generic

type MyClassWithCLIEvent(data) =

    let event1 = new DelegateEvent<System.AssemblyLoadEventHandler>()

    [<CLIEvent>]
    member this.Event1 = event1.Publish

    member this.Data = data

    // A handler method.
    member this.Event1Handler (sender:obj) (eventArgs:System.EventArgs) =
        let myClassObject = sender :?> MyClassWithCLIEvent
        printfn "Event1 occurred! Object data: %s" (myClassObject.Data)

    member this.TestEvent() = event1.Trigger([| this; System.EventArgs.Empty |])

let classWithEvent = new MyClassWithCLIEvent("Hello World!")
classWithEvent.Event1.AddHandler(System.AssemblyLoadEventHandler(classWithEvent.Event1Handler))
classWithEvent.TestEvent()

الإخراج هو كما يلي.

Event1 occurred! Object data: Hello World!

الوظائف الإضافية المتوفرة بواسطة Eventوحدة نمطية? هو موضح هنا. يلي تعليمات برمجية مثال يوضح استخدام أساسى ل Event.createإنشاء حدث وأسلوب مشغل، قم بإضافة معالجات أحداث الثاني في شكل لامدا التعبيرات، وثم تشغيل الحدث لتنفيذ كل من التعبيرات لامدا.

type MyType() =
    let myEvent = new Event<_>()

    member this.AddHandlers() =
       Event.add (fun string1 -> printfn "%s" string1) myEvent.Publish
       Event.add (fun string1 -> printfn "Given a value: %s" string1) myEvent.Publish

    member this.Trigger(message) =
       myEvent.Trigger(message)

let myMyType = MyType()
myMyType.AddHandlers()
myMyType.Trigger("Event occurred.")

إخراج التعليمة البرمجية السابقة هو كما يلي.

Event occurred.
Given a value: Event occurred.

معالجة دفق حدث

بدلاً من مجرد إضافة معالج حدث لحدث ما باستخدام Event.add دالة، يمكنك استخدام الدالات في Eventوحدة نمطية? إلى معالجة تدفق للأحداث بشدة cusإلىmized طرق. إلى للقيام بذلك، يمكنك استخدام توجيه الإخراج إعادة توجيه مكالمة ( |>) إلى gether بحدث كالقيمة الأولى في سلسلة من استدعاءات دالة، و Eventوظائف وحدة نمطية? المكالمات الدالة التالية.

يوضح مثال التعليمة البرمجية التالية كيف يتم إعداد أحد أحداث التي المعالج هو استدعاء فقط في ظل ظروف معينة.

form.MouseMove
    |> Event.filter ( fun evArgs -> evArgs.X > 100 && evArgs.Y > 100)
    |> Event.add ( fun evArgs ->
        form.BackColor <- System.Drawing.Color.FromArgb(
            evArgs.X, evArgs.Y, evArgs.X ^^^ evArgs.Y) )

وحدة نمطية? Observable يحتوي تشغيل وظائف مماثلة تعمل تشغيل الكائنات observable. تشبه الالكائنات observable إلى الأحداث ولكن فقط بشكل نشط الاشتراك في إلى الأحداث إذا كانت نفسها هي التي يتم الاشتراك في إلى.

راجع أيضًا:

المرجع

التعبيرات لامدا: الترفيه كلمة أساسية (F#)

المبادئ

الأعضاء (F#)

أحداث و مفوضون

موارد أخرى

الوحدة النمطية Control.Event (F #)

Control.Event <'T> فئة (F #)

Control.Event <'Delegate,'Args> فئة (F #)