السلام عليكم ورحمة الله
Callback بشكل عام هي إعادة توجيه تعليمات تم تمريرها من خلال المعالم (Parameters) إلى تعليمات أخرى
طالع:
ومن أشهر الأمثلة على ذلك دوال إعادة الاستدعاء Callback Functions
وهو ما سأقتصر عليه هنا، لذلك قد يبدو العنوان أوسع من الموضوع...
هذا النوع من الاستدعاء له استخدامات كثيرة
توابع Windows API تستخدم مناهج Callback بإفراط
أحيانا لإعادة بيانات وأحيانا أخرى للأحداث
يمكن غالبا محاكاتها بطرق أخرى
ما الفائدة من استخدامها؟
- مرونة أكثر للكود، إعادة الاستخدام وتسهيل الصيانة
- أيضا استخدام شائع الاستدعاء التكراري (أو العودية) Recursivity
لتبسيط المسألة:
لديك تابع يستقبل كمعلمات نص string وعدد صحيح Integer
هل شعرت يوما أنك ترغب في تمرير إجراء ضمن المعلمات؟
هنا ستستخدم Callback procedure
لن نقوم باستدعاء دوال API في هذا المثال
بل سنحاول كتابة أبسط مثال Callback من صنعنا كالآتي:
1- أنشئ نمط للإجراء الذي نود تمريره:
في العبارة السابقة أنشأنا نمط أسميناه TMyProc
في لغات البرمجة كتابة منهج (دالة أو إجراء) بالشكل:
تدعى بالإمضاء Signature (أو رأس المنهج Header أحيانا):
2- نقوم بإنشاء بعض الإجراءات التي سنمررها كأنها متغيرات:
3- هذا الإجراء لا يستقبل متغيرات string أو Integer بل سيستقبل نمطنا الجديد TMyProc
4- الآن لنقم باستدعاء الإجراء السابق من خلال زر نكتب عند النقر عليه:
هذا مثال بسيط لتوضيح مبدأ العمل، لذلك فهو لا يوضح الفائدة من الفكرة
* تخيل لو كان الإجراء CallMyProc يقوم بتعليمات كثيرة لا علاقة لها بما خارج الإجراء
وأننا بحاجة إلى استدعاء أحد الإجراءات (كل مرة حسب الحالة) لها نفس الإمضاء
هل سنقوم بنسخ ولصق الكود في كل مرة؟
* حالة أخرى: لدينا دالة تقوم بتعليمات تستغرق وقتا
يرغب من يستدعيها أن يعرف أين وصلت بها الحال (تقدم العملية، بـ TProgressBar مثلا)
في كلا الحالتين يمكننا استخدام CallBack Function
مثال مشابه في المرفق لا يفيد في شيء هو الآخر
غير أنه يستخدم Function لإعادة إشعار تقدم العملية، والمؤشرات لمرونة أكثر
مثال Recursive عند استعراض الملفات:
مثال آخر API
بالتوفيق.
Callback بشكل عام هي إعادة توجيه تعليمات تم تمريرها من خلال المعالم (Parameters) إلى تعليمات أخرى
طالع:
كود :
http://en.wikipedia.org/wiki/Callback_(computer_programming)ومن أشهر الأمثلة على ذلك دوال إعادة الاستدعاء Callback Functions
وهو ما سأقتصر عليه هنا، لذلك قد يبدو العنوان أوسع من الموضوع...
هذا النوع من الاستدعاء له استخدامات كثيرة
توابع Windows API تستخدم مناهج Callback بإفراط
أحيانا لإعادة بيانات وأحيانا أخرى للأحداث
يمكن غالبا محاكاتها بطرق أخرى
ما الفائدة من استخدامها؟
- مرونة أكثر للكود، إعادة الاستخدام وتسهيل الصيانة
- أيضا استخدام شائع الاستدعاء التكراري (أو العودية) Recursivity
لتبسيط المسألة:
لديك تابع يستقبل كمعلمات نص string وعدد صحيح Integer
كود :
procedure MyProcedure(S: string; I: Integer);PHP كود :
procedure MyProcedure(S: string; I: Integer; AProcedure: TMyProcedure);
لن نقوم باستدعاء دوال API في هذا المثال
بل سنحاول كتابة أبسط مثال Callback من صنعنا كالآتي:
1- أنشئ نمط للإجراء الذي نود تمريره:
PHP كود :
type
TMyProc = procedure(S: string);
في لغات البرمجة كتابة منهج (دالة أو إجراء) بالشكل:
كود :
procedure(S: string)كود :
http://en.wikipedia.org/wiki/Type_signaturePHP كود :
procedure Proc1(S: string);
begin
ShowMessage(S+'1');
end;
procedure Proc2(S: string);
begin
ShowMessage(S+'2');
end;
PHP كود :
procedure CallMyProc(MyProc: TMyProc);
begin
MyProc('Call: Proc');
end;
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
begin
CallMyProc(Proc1);
CallMyProc(Proc2);
end;
* تخيل لو كان الإجراء CallMyProc يقوم بتعليمات كثيرة لا علاقة لها بما خارج الإجراء
وأننا بحاجة إلى استدعاء أحد الإجراءات (كل مرة حسب الحالة) لها نفس الإمضاء
هل سنقوم بنسخ ولصق الكود في كل مرة؟
* حالة أخرى: لدينا دالة تقوم بتعليمات تستغرق وقتا
يرغب من يستدعيها أن يعرف أين وصلت بها الحال (تقدم العملية، بـ TProgressBar مثلا)
في كلا الحالتين يمكننا استخدام CallBack Function
مثال مشابه في المرفق لا يفيد في شيء هو الآخر
غير أنه يستخدم Function لإعادة إشعار تقدم العملية، والمؤشرات لمرونة أكثر

مثال Recursive عند استعراض الملفات:
كود :
http://www.delphi-central.com/callback.aspxكود :
http://delphi.about.com/od/windowsshellapi/a/callback_delphi.htmبالتوفيق.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...


![[-]](https://delphi4arab.net/forum/D4A2020/collapse.png)