تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Delegate Function
#1
أثناء قراءتي في الرابط التالي و الخاص بموقع مايكروسوفت

الرابـــــــــــــــــــــــــط

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

لذلك و حين قرأت الموضوع في موقع مايكروسوفت قررت مشاركتكم بعضا من الأفكار التي قد توضح الكيفية في كتابة و استخدام Delegate Function في اي مشروع

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

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

و إسمحوا لي أن أعيد كتابة المثال الخاص بمايكروسوفت بشكل مختلف

كيف نقوم بتعريف Delegate Function
الكيفية التي تحتاجها لإستدعاء اي Delegate Function هي التي تحدد نوعيتها من حيث ان تكون عبارة عن Public أو Friend او Protected او حتي Private

بشكل مبدئي الأفضل استخدامها علي صورة Public Function حتي يتثني لك استدعاؤها من اي مكان وثم بعد ذلك نمرر لها اي متغيرات تريدها و تسترجع منها اي قيمة تريدها

و الكود التالي يوضح شكل الدالة

PHP كود :
Public Delegate Function CompareCallBack(As IntegerAs Integer) As Boolean 

لتوضيح الدالة أعلاه هي عبارة عن دالة سنمرر لها متغيران رقميان لا نعلم قيمتهما أي  أن القيم الخاصة بهم قد تكون اي رقم و من ثم نقارن بين القيمتان و نسترجع متغير عبارة عن Boolean
الأمر الجميل في Delegates بشكل عام انها تسمح لك بتمريرها الي اي كلاس و تسمح لك بتعريفها من خلال استخدم Sub New

واسمحوا لي أن  أستمر علي نفس نهج المثال الخاص بمايكروسوفت مع التعديل عليه قليلا
و من ثم سنكتب الكلاس التالي

PHP كود :
Public Class OrderingCallBack

    Private _callBack 
As CompareCallBack

    Public Sub 
New(callBack As CompareCallBack)
 
       _callBack callBack
    End Sub

    Public 
Function GetCallBackResult(As IntegerAs Integer) As Boolean
        Return _callBack
(xy)
 
   End Function

End Class 

كما ذكرت فإن الأمر الرائع في Delegates انه يمكن تمريرها كمتغير إلي أي كلاس كما هو واضح في الكلاس أعلاه
الكود التالي يوضح كيفية تعريف Delegate Function ثم تمريرها للكلاس  و العودة بالنتائج


PHP كود :
Public Class Form1

    
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Integer = 10
        Dim y As Integer = 8

        Dim greaterCallBack As New OrderingCallBack(Function(m, n) m > n)
        Dim result As Boolean = greaterCallBack.GetCallBackResult(x, y)
        Me.Text = result

    End Sub
End Class 
     
أو يمكن كتابة الكود علي الشكل التالي

PHP كود :
Public Class Form1

    
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Integer = 10
        Dim y As Integer = 8
        Dim greaterCallBack As New OrderingCallBack(Function(m, n) m > n)
        Dim result As Boolean = greaterCallBack.GetCallBackResult(x, y)

        Me.Text = result

    End Sub
    Private Function GreaterThan(x As Integer, y As Integer) As Boolean
        Return x > y
    End Function

End Class 

السؤال الأهم هل أنا أصلا في حاجة لكتابة الكلاس أعلاه و لماذا لا استخدم Delegate Function مباشرة
عموما نحن لا نحتاج للكلاس و يمكننا استخدام Delegate Function مباشرة عن طريق تمرير القيم الي Invoke
و الكود التالي يوضح ذلك

PHP كود :
Public Class Form1

    
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Integer = 10
        Dim y As Integer = 8
        Dim greaterCallBack As CompareCallBack = (Function(m, n) m > n)
        Dim result As Boolean = greaterCallBack.Invoke(x, y)

        Me.Text = result

    End Sub

End Class

Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean 

أو يمكن كتابة الكود كالتالي

PHP كود :
Public Class Form1

    
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Integer = 10
        Dim y As Integer = 8
        Dim greaterCallBack As CompareCallBack = AddressOf GreaterThan
        Dim result As Boolean = greaterCallBack.Invoke(x, y)

        Me.Text = result

    End Sub
    Private Function GreaterThan(x As Integer, y As Integer) As Boolean
        Return x > y
    End Function

End Class

Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean 

أو يمكن كتابة الكود كالتالي أيضا

PHP كود :
Public Class Form1

    
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Integer = 10
        Dim y As Integer = 8
        Dim greaterCallBack As CompareCallBack = New CompareCallBack(AddressOf GreaterThan)

        Dim result As Boolean = greaterCallBack.Invoke(x, y)

        Me.Text = result

    End Sub
    Private Function GreaterThan(x As Integer, y As Integer) As Boolean
        Return x > y
    End Function

End Class

Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean 

أو كالتالي
وكما ذكرت مسبقا الجميل في Delegate Function أن لها Constructor اي أن لها Sub New
PHP كود :
Public Class Form1

    
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim x As Integer = 10
        Dim y As Integer = 8
        Dim greaterCallBack As CompareCallBack = New CompareCallBack(Function(m, n) m > n)

        Dim result As Boolean = greaterCallBack.Invoke(x, y)

        Me.Text = result

    End Sub
End Class

Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean 


أهم شئ في Delegate Function هو تعريفها بوضوح و إعطاؤها اسما مناسبا لا يتكرر من داخل الكود و ايضا ان نمرر لها المتغيرات الصحيحة او نمرر لها الدوال التي لها نفس Signature و المقصود هنا نمرر لها دوالا تشبهها في كل شئ و تختلف عنها في المسمي او يمكننا استخدام Lambada Function

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

PHP كود :
' Example: 01
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
Example02
Public Delegate Function AddCallBack(As IntegerAs Integer) As Integer
' Example: 03
Public Delegate Function ValidationCallBack(c As Control) As Boolean
Example04
Public Delegate Function ImageCallBack(bmp As Bitmap) As Bitmap
' Example: 05
Public Delegate Sub AdditionCallBack(x As Integer, y As Integer, ByRef z As Integer)
Example06
Public Delegate Sub AddionalCallBack(As IntegerAs IntegerByRef z As Integer)
' Example: 07
Public Delegate Function ArrayCallBack(values As String) As String() 

لأي استفسارات تتعلق بالموضوع يمكنكم كتابة اي سؤال ترغبون به
الرد }}}
#2
جزاك الله خيرا
ولي رجاء لو امكن بعد اذن حضرتك
ممكن مثال بشكل مختلف او اكبر شوية
الرد }}}
تم الشكر بواسطة:
#3
السلام عليكم

جزاكم الله خير أخي الكريم
الرد }}}
تم الشكر بواسطة: silverlight
#4
الأخ علي
طبعا ممكن أكتب لك أمثلة كثيرة
لكن ياريت تعطني فكرة عما يدور في رأسك
خاصة ان استخدام Delegate Function يشمل كل شئ و اي شئ
الرد }}}
تم الشكر بواسطة:
#5
يمكننى ان اتحكم فى برنامج اخر غير برنامجى من خلال هذة الدالة مثلا اغلاقها او اضافة جملة للتكست الموجود
مثلا كيف ذلك ؟؟
الرد }}}
تم الشكر بواسطة:
#6
تتحكم في برنامجك أنت نعم تقوم باستبدال كلمات و اضافة كلمات لأي كونترول مثل التكست بوكس مثلا داخل برنامجك نعم
لنفترض أن Delegate Function موجودة داخل ملف dll
نعم يمكن استدعاؤها من الملف و اغلاق برنامجك بشرط ان تكتب الدالة بأسلوب صح

تستطيع فقط ان تتحكم في برامج أنت من كتبها
أيضا هذه ليست دالة لكنها عبارة عن Pointer لشئ مجهول كما هو موجود في لغة C

هذا مثال لكيفية إغلاق الفورم باستخدام Delegates موجود في Assembly  مختلف

PHP كود :
Public Class Form1
    Private Sub Button1_Click
(sender As ObjectAs EventArgsHandles Button1.Click
        Dim closeForm 
As New RiverNile.Deleagtes.CloseForm(Sub(f)
 
                                                              f.Close()
 
                                                          End Sub)
 
       closeForm.Invoke(Me)
 
   End Sub
End 
Class

Namespace 
RiverNile
    Namespace Deleagtes
        Public Delegate Sub CloseForm
(As Form)
 
   End Namespace
End Namespace 
الرد }}}
تم الشكر بواسطة: WAEL ABED
#7
جزاكم الله الف الف خير أخي الكريم
هَٰٓؤُلَآءِ قَوْمُنَا ٱتَّخَذُوا۟ مِن دُونِهِۦٓ ءَالِهَةً لَّوْلَا يَأْتُونَ عَلَيْهِم بِسُلْطَٰنٍۭ بَيِّنٍ فَمَنْ أَظْلَمُ مِمَّنِ ٱفْتَرَىٰ عَلَى ٱللَّهِ كَذِبًا
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Convert Delegate to IntPtr & Viceversa silverlight 1 1,678 15-08-17, 04:54 PM
آخر رد: silverlight
  [كود] Concatenate List(Of T) with Func Delegate silverlight 0 1,827 28-01-16, 07:24 PM
آخر رد: silverlight
  [مقال] كلام في استخدام الدوال والروتينات function and sub سعود 4 5,980 04-05-14, 11:06 PM
آخر رد: Ali Wisam
  معلومة ::: Creating a User Function Library RaggiTech 0 1,911 06-10-12, 10:27 PM
آخر رد: RaggiTech
  Jump out of a Debug Function RaggiTech 0 1,538 01-10-12, 04:07 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم