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

شرح الكائن Delegate وكيفية الاستفادة منه في البرمجة المتقدمة

بدأه akramKamal في 2 أبريل 2009 · 10 رد · 9,687 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

delegate <The method return data type > < object name> (<method parameters>);

مثال على ذلك :

delegate void myDelegate(int parm1, int parm2);

بعد أن تعرفنا على كيفية الإعلان عن هذا الكائن نأتي لاستخداماته وهي كالتالي :

الاستخدام الأول : مؤشر على ميثود معينة ذات صفات محددة

مثلا تريد ميثود من نوع int وتأخذ متغيرين من نوع int فما عليك إلا أن تعرف هذه الميثود كالتالي

delegate int myMethod(int parm1,int parm2);

يوجد مشروع في المرفقات به ما قمنا بشرحه

مثال كاملة على ذلك :

هذا المثال يقوم بتنقيح الأرقام السالبة عن الأرقام الموجبة

	   delegate bool IsAccepted(int number); //الاعلان عن الكائن delegate
		int[] Inputnumbers = { 1, 0, -9, -6, 3, 6,   -7, 4, -55, 2 };
		int[] AcceptedNumbers(int[] numbers,IsAccepted method)
		{
			List<int> Accepted=new List<int>();
			foreach (int number in numbers)
				if (method.Invoke(number)) Accepted.Add(number);
			return Accepted.ToArray();
		}
		bool IsPositiveNumber(int number)
		{
			return number > 0;
		}
		bool IsNegativeNumber(int number)
		{
			return number < 0;
		}
				int[] GetPositiveNumbers()
		{
			int[] positiveNumbers = AcceptedNumbers(Inputnumbers,   
			IsPositiveNumber); //لاحظ كيف أن الميثود أصبحت باراميتر
			return positiveNumbers;
		}
		int[] GetNegativeNumbers()
		{
			int[] negativeNumbers = AcceptedNumbers(Inputnumbers,	 
			IsNegativeNumber); //لاحظ كيف أن الميثود أصبحت باراميتر
			return negativeNumbers;
		}

لاحظ أننا بدلنا فقط الباراميتر الثاني وحصلنا على نتائج مختلفة وذلك لأن الميثود AcceptedNumbers تقوم باستدعاء الميثود المدخلة في الباراميتر الثاني لكل عنصر في المصفوفة Inputnumbers فإذا كان ناتج الميثود true تقوم بإضافة العنصر إلى ال List وإذا كان الناتج false تقوم بتجاهل هذا العنصر.

قد تقول لماذا أعمل كل ذلك فكان بإمكاني تنفيذ هذا الكود بطرق معروفة سابقا

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

1. قد لا تكون أنت الذي سيحدد هل هذا العنصر مطلوب أو لا.

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

الى هنا نكون أنهينا الاستخدام الاول للكائن delegate

اذا رأيت اهنمام بالموضوع سأكمل استخدامات هذا الكائن وهي مفيدة جدا

TestDelegate.rar

تم تعديل هذه المشاركة بواسطة akramKamal في 2 أبريل 2009 في 14:53

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#2

مدخل حلو وبسيط للـ delegate ، وسيفيد الكثير,,,

شكر اخي وجزاك الله كل خير .

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#3

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

سنكمل ما بدأناه ان شاء الله في استخدامات الكائن delegate

الاستخدام الثاني : مؤشر على أكثر من ميثود في نفس الوقت

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

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

للإعلان عن ذلك فهو كما سبق مثل الإعلان عن ال delegate

ولكن تقوم بتعريف متغير من هذا الكائن الذي أنشأته , مثال :

delegate void DoOperation(int number);
		static DoOperation Methods; // متغير من نوع الكائن delegate
		static void Method1(int number)
		{
			MessageBox.Show("Method1 Invoked");
		}
		static void Method2(int number)
		{
			MessageBox.Show("Method2 Invoked");
		}
		static void Method3(int number)
		{
			MessageBox.Show("Method3 Invoked");
		}
		static void Main()
		{
			Methods += Method1;
			Methods += Method2;
			Methods += Method3;
			Methods.Invoke(10);
		}

ستلاحظ بعد تنفيذ هذا الكود أن ال 3 رسائل ستظهر دليلا على أن ال 3 ميثود استدعيتهم بجملة واحدة وهي

Methods.Invoke(10);

انتظرونا للاستخدام الثالث وهو عمل أحداث خاصة بك

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#4

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

سنكمل استخدامات الكائن delegate

الاستخدام الثالث : لعمل أحداث خاصة بك

إذا كنت قد عملت برنامج Windows Application سابقا فأنت تعرف أحداث الفورم مثل حدث load وحدث Mouse Move وأحداث أخرى كثيرة

فألان أصبح بإمكانك أن تعمل لبرنامجك حدث خاص بك , مثال عمل حدث Mouse Drag

أولا هذا الحدث سينطلق عند الضغط على الفورم وتحريك مؤشر الماوس في نفس الوقت , لاحظ أنه مكون من ثلاث أحداث

1. حدث Mouse Down

2. حدث Mouse Up

3. حدث Mouse move

الإعلان عن حدث مثل الإعلان عن متغير من نوع delegate ولكن بإضافة الكلمة المحجوزة Event

مثال كامل على ذلك :

هذا المثال لجعل الفورم متحرك من أي نقطة

قم بإنشاء مشروع جديد وأضف هذا الكود وشغل البرنامج

public partial class TestEvent : Form
	{
		public delegate void MousedragEvent(object Sender,  
		 MouseEventArgs e,Point StartDraging);
	   /// <summary>
		/// MouseEventHandler is adelegate data type
		/// </summary>
	 public event MousedragEvent MouseDrag;//Remark the keyword event
		public TestEvent()
		{
			InitializeComponent();
			this.MouseDown += new 
			MouseEventHandler(TestEvent_MouseDown);
			this.MouseUp += new MouseEventHandler(TestEvent_MouseUp);
			this.MouseMove += new	  
			 MouseEventHandler(TestEvent_MouseMove);
			MouseDrag += new MousedragEvent(TestEvent_MouseDrag);
		}

		void TestEvent_MouseDrag(object Sender, MouseEventArgs e, 
		Point StartDraging)
		{
			this.Left += e.X - StartDraging.X;
			this.Top += e.Y - StartDraging.Y;
		}
		private bool IsPressed;
		private Point StartDraging;
		private void TestEvent_MouseDown(object sender, 
		MouseEventArgs e)
		{
			StartDraging = e.Location;
			IsPressed = true;
		}

		private void TestEvent_MouseUp(object sender, MouseEventArgs 
		e)
		{
			IsPressed = false;
		}
		static void Main()
		{
			Application.Run(new TestEvent());
		}	   





		private void TestEvent_MouseMove(object sender,   
		MouseEventArgs e)
		{
			if (IsPressed)//We sure that the mouse is pressed
			{
				if (MouseDrag != null)
				{
					MouseDrag.Invoke(sender, e, StartDraging);  
					//Invoke the drag event
				}
			}
		}
}

في المرفقات مشروع يوضح هذا الاستخدام

الدرس القادم ان شاء الله سيكون عن Property indexing

TestDelegate.rar

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#5

مشكووور على هذا الموضوع المهم أخيرا حفهمه

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

#6

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

قمت بكتابة هذا الدرس كملف word وهو منسق وملون وأفضل في القراءة

الملف في المرفقات

أرجو أن تعلموني اذا كانت الدروس مقبولة او لا وذلك لأني أنوي بالاستمرار في دروس متقدمة اكثر

فاذا كان الشرح غير مفهوم فالرجاء اعلامي بذلك

Lec1_Delegate.rar

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#7

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

شكرا جزيلا علي هذه المبادرة الجميلة

بس انا طول عمري عندي عقدة من ال deleget <_<

بس هل شركات البرمجة بتستخدمه؟؟؟

وياريت مثال لحاجة باستخدامه ومن غير استخدامه عشان يبان الفرق

#8

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

ال delegate له استخدامات عظيمة منها

1. أحيانا نحتاج الى أداء أكثر من عملية لكل عنصر في مصفوفة معينة فكان الحل التقليدي هو بجملة for في كل مرة , المثال التالي يوضح المطلوب

	class Program
	{
	   static List<int> list = new List<int>();
		static void Main(string[] args)
		{
			list.AddRange(new int[] {0,1,2,-5,-6,7 });
		}
		bool isPositive(int number)
		{
			return number > 0;
		}
		bool isNegative(int number)
		{
			return number < 0;
		}
		int[] AllPositive1()
		{
			return list.FindAll(isPositive).ToArray();
		}
		int[] AllPositive2()
		{
			List<int> positive = new List<int>();
			foreach (int number in list)
			{
				if (isPositive(number)) positive.Add(number);
			}
			return positive.ToArray();
		}
		int[] AllNegative1()
		{
			return list.FindAll(isNegative).ToArray();
		}
		int[] AllNegative2()
		{
			List<int> negative = new List<int>();
			foreach (int number in list)
			{
				if (isNegative(number)) negative.Add(number);
			}
			return negative.ToArray();
		}
	}

في الميثود ذات الرقم 2 قمنا بتكرير جملة for في كل ميثود أما الميثود ذات الرقم 1 فقد قمنا بتغير الشرط

2. أيضا ال delegate يستخدم في عمل الأحداث وأظنه المدخل الوحيد لذلك

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

ولهذا الكائن استخدامات كثيرة ومفيدة جدا

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#9

اخيرا ياساتر كانت معقدانى فى حياتى بس اعتقد انه شرح جيد

بالنسبه للأخ الذى يسأل عن استخدامها فى الشركات نعم تستخدم ولكن فى حالات شديده الندره

اتمنى من الاخ كاتب الموضوع ان يستمر فى كتابه سلسله مواضيعه المتقدمه عن الوت نت فهى مفيده للغايه

#10

بســم الله الـرحمــن الرحيــم

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

شكراً لك اخي الكريم

على هذا الموضوع القيم بس سؤال صغير..ما هي نسخة الدوت نت الشغال عليها

واذا في مجال شرح المواضيع التالية

events و threading و collections

core application

socket programming

ومشكووووور جدا على جهدك الكريم وربنا يوفقك بحياتك من كل النواحي

#11

احد الإستخدمات المهمه جدا للـ Delegates التى لن تجد لها بديل عند التعامل مع اداوت الـ .Net من خلال Thread اخر غير الـ Thread الرئيسى للبرنامج هى عن طريق استخدامك للدوال BeginInvoke و EndInvoke او Inovke و التى يتم استدعائها من خلال الأداه التى تريدها ان تقوم بعمليه عليها من الـ Thread الأخر.

جارى تحضير مثال.

مدونتي: C++ Tips and Tricks

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