الأحد، 12 يناير 2014

برمجة متقدمة سي شارب الأحداث C# - Events

برمجة متقدمة سي شارب الأحداث C# - Events

ماهي الاحداث؟

الاحداث هي تفاعل المستخدم مع الحاسوب أو البرنامج. فالضغط على لوحة المفاتيح يسمى بحدث الضغط . تحريك الفارة يسمى بحدث تحريك الفارة.فاي شيء من العتاد الحاسوبي الذي يمكن للمستخدم التفاعل معه ومع برنامج يسمى بالاحداث لانه نتيجة ذلك يتم وقوع الحدث وعلى سبيل المثال في حدث الضغط على مفاتيح لوحة المفاتيح نجد ان المستخدم قام بالحدث وهو الضغط وهناك حدث عكسه وهو رفع الضغط عن المفاتيح.
برمجة متقدمة سي شارب الأحداث C# - Events


استخدام التفويض مع الاحداث

يصرح عن الاحداث وتطلق من الفئة بالتعاون مع مقبض الحدث event handler باستخدام التفويض اما من داخل الفئة نفسها او فئات اخرى.

 الفئة التي تحتوي على الحدث تستخدم لنشر الحدث تسمى بالفئة الناشرة publisher class. والفئة التي تستخدم الحدث تسمى بالفئة المشتركة subscriber. الاحداث تستخدم النموذج الناشر المشترك. 

الناشر عبارة عن كائن يحتوي على الاحداث والتفويضات. تفويض الحدث المساعد ايضا يعرف داخل الكائن. الفئة الناشرة تستدعي الحدث وتعلم الكائنات الاخرى.
المشترك عبارة عن كائن يستقبل الحدث وهو يزود بمقبض الحدث . التفويض في كائن الناشر يقوم باستدعاء مقبض الحدث من كائن المشترك.

الاعلان أو التصريح عن الاحداث

للتصريح عن الاحداث اولا يجب التصريح عن التفويض ونوعه والباراميتر الذي يمرره اي بمعنى يطابق الحدث او الاحداث.

التصريح عن التفويض للحدث.


public delegate void BoilerLogHandler(string status);

التصريح عن الاحداث باستخدام الكلمة المحجوزة event

//تعريف حدث مبني على التفويض السابق
public event BoilerLogHandler BoilerEventLog;

مثال الاول على الاحداث

using System;
namespace SimpleEvent
{
   using System;

   public class EventTest
   {
      private int value;

      public delegate void NumManipulationHandler();

      public event NumManipulationHandler ChangeNum;

      protected virtual void OnNumChanged()
      {
         if (ChangeNum != null)
         {
            ChangeNum();
         }
         else
         {
            Console.WriteLine("Event fired!");
         }

      }
      public EventTest(int n )
      {
         SetValue(n);
      }
      public void SetValue(int n)
      {
         if (value != n)
         {
            value = n;
            OnNumChanged();
         }
      }
   }
   public class MainClass
   {
      public static void Main()
      {
         EventTest e = new EventTest(5);
         e.SetValue(7);
         e.SetValue(11);
         Console.ReadKey();
      }
   }
}

ناتج مثال الاول على الاحداث

Event Fired!
Event Fired!
Event Fired!


مثال الثاني على الاحداث

using System;
using System.IO;

namespace BoilerEventAppl
{

   // boiler class
   class Boiler
   {
      private int temp;
      private int pressure;
      public Boiler(int t, int p)
      {
         temp = t;
         pressure = p;
      }

      public int getTemp()
      {
         return temp;
      }
      public int getPressure()
      {
         return pressure;
      }
   }
   // event publisher
   class DelegateBoilerEvent
   {
      public delegate void BoilerLogHandler(string status);

      //Defining event based on the above delegate
      public event BoilerLogHandler BoilerEventLog;

      public void LogProcess()
      {
         string remarks = "O. K";
         Boiler b = new Boiler(100, 12);
         int t = b.getTemp();
         int p = b.getPressure();
         if(t > 150 || t < 80 || p < 12 || p > 15)
         {
            remarks = "Need Maintenance";
         }
         OnBoilerEventLog("Logging Info:\n");
         OnBoilerEventLog("Temparature " + t + "\nPressure: " + p);
         OnBoilerEventLog("\nMessage: " + remarks);
      }

      protected void OnBoilerEventLog(string message)
      {
         if (BoilerEventLog != null)
         {
            BoilerEventLog(message);
         }
      }
   }
   // this class keeps a provision for writing into the log file
   class BoilerInfoLogger
   {
      FileStream fs;
      StreamWriter sw;
      public BoilerInfoLogger(string filename)
      {
         fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
      }
      public void Logger(string info)
      {
         sw.WriteLine(info);
      }
      public void Close()
      {
         sw.Close();
         fs.Close();
      }
   }
   // The event subscriber
   public class RecordBoilerInfo
   {
      static void Logger(string info)
      {
         Console.WriteLine(info);
      }//end of Logger

      static void Main(string[] args)
      {
         BoilerInfoLogger filelog = new BoilerInfoLogger("e:\\boiler.txt");
         DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();
         boilerEvent.BoilerEventLog += new 
         DelegateBoilerEvent.BoilerLogHandler(Logger);
         boilerEvent.BoilerEventLog += new 
         DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);
         boilerEvent.LogProcess();
         Console.ReadLine();
         filelog.Close();
      }//end of main

   }//end of RecordBoilerInfo
}

ناتج مثال الحدث

Logging info:

Temperature 100
Pressure 12

Message: O. K


Ahmed Ata Almahallawi
Freelancer
IT Help Desk,
SEO experience,PHP,C#,ASPX,SQL
Al alami st
gaza -jabaliaGaza Strip
Palestine
DOB: 05/10/1984
by +Ahmed Almahallawi 
12/1/2014

التسميات: