منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
محو الأمية_2 About Delegate - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة السي شارب C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=175)
+--- قسم : قسم اسئلة C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=176)
+--- الموضوع : محو الأمية_2 About Delegate (/showthread.php?tid=13288)



محو الأمية_2 About Delegate - أبو عمر - 19-09-15

السلام عليكم
ما الفرق بين
PHP كود :
using System;
using System.Collections.Generic;


    class Program
    
{
        static void Main()
        {
            string gg =("Hello from Marsowl");
            Console.WriteLine(gg); 

 Console
.ReadLine();
        }
             public static void Marsowl(string strMessage)
             {
                 Console.WriteLine(strMessage);
            
                 
}
    

Exclamation
,
بين استخدام الفنكشن Delegate 
PHP كود :
using System;
using System.Collections.Generic;
public 
delegate void MarsowlfunctionDelegate(string Message);

    class Program
    
{
        static void Main()
        {
MarsowlfunctionDelegate name =new MarsowlfunctionDelegate(Marsowl);
Console.WriteLine("Hello From Marsowl");
 Console.ReadLine();
        }
             public static void Marsowl(string strMessage)
             {
                 Console.WriteLine(strMessage);
            
                 
}
    


النتسجة في الحالتين
Hello from Marsowl
مع العلم ان النتيجة هي اياها وبنظرة فيزيائية للكود الاول اسرع
اللي فهمته من مقطع فيديو انها مثل صمام امان 
استحملوني شوي بس




RE: محو الأمية_2 About Delegate - الشاكي لله - 20-09-15

ليس هكذا يتم استخدام الdelegate  

الdelegate هو مايسمى بالمصطلح القديم (call back)
بمعنى "اتصل فيني لما تكمل شغلك"

الان متى نستخدم الdelegate ؟



مثال: قمت بانشاء ملف dll منفصل عن برنامجك ، وهذا ملف الdll يقوم بضغط الملفات (archiving)
بالطبع عملية ضغط الملفات تاخذ وقت صح ؟

الان ، انت في حاجة الى برنامج (application) ليقوم باستدعاء دوال ملف الdll
لنفرض انه في ملف الdll توجد دالة باسم  StartArchive

بالطبع يمكنك اضافة مرجع واستدعاء الدالة مباشرة
الدالة ستتنفذ وستاخذ وقت ، ولكن عندما تنتهي من عملية ضغط الملفات ـ، من سيخبرك  انها انتهت من عملها ؟؟
يعني لنفرض انك تريد اظهار msgbox بعد عملية الانتهاء من الضغط ، ولكن لا يمكنك معرفة متى ستنتهي الدالة StartArchive من عملها !



هنا يمكنك استخدام الdelegate ليقوم باعلامك ان الدالة StartArchive انتهت من عملها
كيف يقوم باعلامك ؟؟ الdelegate ببساطة ماهو الا مؤشر لدالة موجودة في الرام ، طبعا مشكلة مبرمجي البيسك انهم مايعرفون ويش هو المؤشر ، ولكن بمعنى اخر ، الdelegate هو object تقوم بااعطائه اسم دالة معينة مثلا (ArchivingCompleted) ، ثم تقوم بتمرير هذا الdelegate الى الدالة StartArchive  التي ستأخذ وقتها في ضغط الملفات وعندما تنتهي من عملية الضغط ، ستقوم الدالة (الي هي StartArchive  ) باستدعاء الدالة ArchivingCompleted الموجودة في الapplication ، وطبعا تم ذلك بسبب عملية الdelegate Smile

فكما رايت الdelegate جعلتنا نستدعي دالة معينة في application اخر ، وهذا الغرض الاساسي من الdelegate


---------------------------------


في النهاية مثال بالاكواد للجملة المفيدة الي فوق Smile




ملف dll يحتوي على دالة startArchive التي تقوم بضغط الملفات :-

PHP كود :
class Vb4arbRAR
{
    
//delegate
    
public delegate void MethodHandler();


    public 
void StartArchiving(MethodHandler functionToCall)
    {
        
//...... some work
        //...... some work

        //..... now we are compelete Archiving work , and we need to call function in another place
        //easily we do this :
        
functionToCall.Invoke();
    }





الان في الapplication (سواء console او winform او اي شيئ اخر) سنقوم باستدعاء الدالة StartArchive من الdll وعندما تنتهي سيتم استدعاء دالتنا ArchivingCompleted:
PHP كود :
public partial class Form1 Form
    
{
        public 
Form1()
        {
            
InitializeComponent();
        }

        private 
void button1_Click(object senderEventArgs e)
        {
            
//method to call when finish
            
Vb4arbRAR.MethodHandler methodPointer = new Vb4arbRAR.MethodHandler(ArchivingCompleted);

            
//start Archiving and pass the pointer
            
Vb4arbRAR rar = new Vb4arbRAR();
            
rar.StartArchiving(methodPointer);
        }

        
        
void ArchivingCompleted()
        {
            
MessageBox.Show("تمت عملية الضغط بنجاح");
        }

    } 


خلاص الكود مبسط ومفهوم 1000 بالمئة اعتقد .

---


طبعا لاحقا تطور مفهوم الdelegate اكثر وظهر عندنا مفهوم الevent (الاحداث)
تقدر تطلع على الفرق بينهم في قوقل (delegate vs events )


تحياتي والا اللقاء في محو الامية 3 خخخخ


RE: محو الأمية_2 About Delegate - أبو عمر - 20-09-15

يعطيك العافية شرح جدا ممتاز
واعذرني انا لازلت في console write read
اصحاب البيسك كانوا يستعينون بدوال API
في مثل المثال اللي ذكرته
ما اخفي عليك محرر الشارب متعب بحساسيته لحالة الحروف
اشكر لك مرورك
ولا تحرمني ملاحظاتك


RE: محو الأمية_2 About Delegate - الشاكي لله - 20-09-15

^
اللغة نفسها صممت حساسة لحالة الاحرف ـ فلا حيلة المحرر