20-09-15, 04:13 AM
(آخر تعديل لهذه المشاركة : 20-09-15, 04:26 AM {2} بواسطة الشاكي لله.)
ليس هكذا يتم استخدام ال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
فكما رايت الdelegate جعلتنا نستدعي دالة معينة في application اخر ، وهذا الغرض الاساسي من الdelegate
---------------------------------
في النهاية مثال بالاكواد للجملة المفيدة الي فوق
ملف dll يحتوي على دالة startArchive التي تقوم بضغط الملفات :-
الان في الapplication (سواء console او winform او اي شيئ اخر) سنقوم باستدعاء الدالة StartArchive من الdll وعندما تنتهي سيتم استدعاء دالتنا ArchivingCompleted:
خلاص الكود مبسط ومفهوم 1000 بالمئة اعتقد .
---
طبعا لاحقا تطور مفهوم الdelegate اكثر وظهر عندنا مفهوم الevent (الاحداث)
تقدر تطلع على الفرق بينهم في قوقل (delegate vs events )
تحياتي والا اللقاء في محو الامية 3 خخخخ
ال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

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

ملف 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 sender, EventArgs 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 خخخخ

