الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كلام عن المفوضات و الأحداث و العلاقة بينهم

بدأه وائل عبد الرحمن في 17 أبريل 2010 · 3 رد · 1,454 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

مقدمة

فى كثير من الأحيان نحتاج للخروج من تسلسل تنفيذ الأوامر وتنفيذ أمر أخر ثم العودة الى الموضع الأخير الذى تركته فى تنفيذ سلسلة الأوامر مثال كما فى صفحات الأنترنت عند كتابة رسالة مثالا وتقوم بالضغط على أرسالها فأن البرنامج يقطع عمله و يتوقف ليظهر لك رسالة تخبرك بنجاح أو فشل أرسالها

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

أولا: المفوضات

هى عبارة عن مؤشر يشير الى مكان الدالة ويمكن أستدعائها بنفس الطريقة التى تستدعا بها الوسائل وعند أستدعاء المفوضات سيتم تنفيذ الوسيلة التى يشير أليها المفوض ويمكنك تغير الوسيلة التى يشير أليها المفوض ولذالك فأن الشفرة التى تستدعى المفوض يمكن أن تشغيل أكثر من وسيلة فى كل وقت يتم فيه تشغيله أو يمكن القول بأن طريقة لتمرير دالة كوسيط فى دالة أخرى 0

التصريح وأستخدام الفوضات :

لكى يتم فهم المثال بشكل جيد نضرب مثال لو أنك مطلوب منك عمل برنامج لتحكم فى مصنع مكون من عدد من الألات ومطلوب عمل برنامج لتحكم فى كل ألة منفردة و إيقاف جميع الألات مرة واحدة أذا لزم الأمر

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

والقاعدة لتصريح عن المفوضات هى

accessibility delegate return delegatename(parameterslist)

• public static type operator unary(classtype operand)

• public static type operator binary(type lhsoperand, type rhsoperand)

1- كتابة معرفات الوصول ( public ,privet,virtuel)

2- كتابة كلمة delegate

3- كتابة نوع الأرجاع ( void ,int,duble,string

4- كتابة أسم المفوض

5- كتابة العوامل أو عدم كتابتها

مثال

Pubic delegate void ArabOnly (string MISER, string LOBNAN);

Pubic delegate string ArabOnly (string MISER, string LOBNAN);

using System;

namespace Donis.CSharpBook{

public class Starter{

public static void Main(){

ZClass obj1=new ZClass(5,10);

ZClass obj2=new ZClass(15,20);

ZClass obj3=obj1+obj2;

Console.WriteLine(obj3.Total);

}

}

class ZClass {

public ZClass(int _fielda, int _fieldb) {

fielda=_fielda;

fieldb=_fieldb;

}

public static ZClass operator+(ZClass lhs, ZClass rhs) {

return new ZClass(lhs.fielda+rhs.fielda,

lhs.fieldb+rhs.fieldb);

}

public int Total {

get {

return fielda+fieldb;

}

}

protected int fielda, fieldb;

}

}

ولعمل كائن من المفوضات

1. DelegateClass obj=new DelegateClass(MethodA);

2. DelegateClass obj2=MethodA; // implicit

الأحداث : فى أحيان كثيرة نحتاج من المفوضات أن تعمل تلقائيا عند حدوث شيأ معين و هذا هو الهدف من الكلام التالى 0 فالحدث هو عبارة عن فعل معين تقوم به الفئة أو الكائن ليثير فئة أو كائن أخر لفعل محدد

وأقول لتقريب الفهم (هذا الكلام من عندى و قد يكون صوابا أو خطأ وهو أن الحدث فى الحقيقة رد فعل لشىء يقوم به المستخدم للبرنامج )مثل الضغط على زر معين وهذا حدث أو أمر فى البرنامج) 0

سؤال ماهى فائدة الأحداث ؟ البرنامج بدون الأحداث كسقوط ناطحة سحاب فوق رأسك بدون صوت وبتالى لان تستطيع أخذ الحذر و محاولت النجاة وهنا نقول أن من أهم أسبب أستخدام الأحداث هى إعطأ مستخدم البرنامج الحرية فى العمل مع البرنامج وأختيار طريقة التعامل معه وللعلم جميع أدوات التحكم فى بيئة النوافذ أو الويندوز ترفع أحداث ومن هذا الكلام نجد أن العملية مقسمة الى جزئين وقوع الحدث والأمر الثانى هو التعامل معه مثل وقع حدث العطش التعامل معه من خلال شرب الماء0

...

كيفية التصريح به : يجب التنبيه هنا على و جوب التصريح عن مفوض قبل التصريح عن الحدث وهذا أمر منطقى سيتم شرحه لاحقل و صيغ التصريح عن الحدث هى :

accessibility event delegatename eventname

معرفات الوصول قد تكون من الأنواع public أو protectedأو Protected

وهنا معلومة مهمة جدا : وهى ليس معنا أنا الحدث من نوع العام public فأنه يمكن الوصل إليه من خارج الفئة كلا هذا غير صحيح بل لايمكن الوصول إلى الحدث إلا من داخل الفئة الخاصة به فقط و التى فى المثال السابق homeAlarm0

مثال :

public delegate void DelegateClass();

publicaevent DelegateClass MyEvent;

وصيغة تعريف المفوضات الموجودة فى أدوات التحكم فى العمل تحت بيئة النوافذ أو الويندوز لأستخدمها فى الأحداث تكون بالصيغة الأتية

delegate void MoveEventHandler(object source, MoveEventArgs e);

و المقصود بالوسيط الأول هو مصدر الحدث و الوسيط الثانى هى بينات عن الحدث وهو مشتق من System.EventArgs

مثال

public delegate void EventHandler(object sender, Event e);

public class Button: Control

{

public event EventHandler Click;

public void Reset() {

Click = null;

}

}

معالجة الأحداث : Event Handler هو المفوض الذى يستدعى الدالة المطلوبة عند أطلاق الحدث0و العلاقة بين الأحداث و المفوضات أشرحها بالمثال التالى لو عندنا برنامج أنذار ضد الحريق فيه دالة لغلق محابس الغاز و مفوض يقوم بأستدعاء الدالة الغلق فعند حدوث حريق فهذا هو الحدث و لكن مافئدة معرفة أنه حدث حريق إذ لم يتمكن من التعمل معه و بتالى لابد من وجود المرحلة الثانية و هى معالجة الحدث الذى يقوم بأستدعاء المفوض و الذى يقوم بأستدعاء دالة غلق محابس الغاز ويتم رفع الحدث مثل المفوضات بالضبط بوضعه داخل دالة و يلاحظ أن المفوض المخصص للحدث الموجودة فى بيئة النوافذ يكون فى الغالب من نوع void و أليك مثال على هذا الكلام 0

class homeAlarm

{

public delegate void StopGaseValve;

public event StopGaseValveDelegate HomeBerned;

...

private void Notify()

{

if (this.HomeBerned != null)

{

this.HomeBerned();

}

}

يمكن أيضا أستخدام التحميل الزائد للعوامل =+ و =- و.000مثل المفوضات تماما0وإليك مثال

mainForm.MouseMove += new MouseEventHandler(OnMouseMove);

ولنا عودة أخرى الى الأحدث عند الكلام عن أدوات التحكم فى بيئة النوافذ

ملاحظة قد يحدث بعض عدم الترتيب فى الأكواد و التنسييق بسبب مشكلة فى المنتدى و أرجو من المشريفين متابعة الأمر لآأستطيع تكبير الخط أو أستخدام أى أداة من أدوات التنسيق

المراجع : ,

C# in a Nutshell, 2nd Edition

visual C# 2008 step by step ,

Microsoft Visual CSharp .NET 2002

.programming.microsoft.visual.c.sharp.2005

#2

22 مشاهدة و لا يوجد رد بلأيجاب أو بالسلب

#3

السلام عليكم,

شرح ممتاز , بس ياليت تكتب الأكود داخل مربع خاص عشان يصير مفهوم ..

118650.jpg
#4

جزاك الله خيرا المرة القادمة بإذن الله سيتم ماطلبت

مواضيع مشابهة