![]() |
|
إعادة الاستدعاء Callback - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13) +--- الموضوع : إعادة الاستدعاء Callback (/showthread.php?tid=3961) |
إعادة الاستدعاء Callback - kachwahed - 06-03-2012 السلام عليكم ورحمة الله 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في لغات البرمجة كتابة منهج (دالة أو إجراء) بالشكل: كود : procedure(S: string)كود : http://en.wikipedia.org/wiki/Type_signaturePHP كود : procedure Proc1(S: string);PHP كود : procedure CallMyProc(MyProc: TMyProc);PHP كود : procedure TForm1.Button1Click(Sender: TObject);* تخيل لو كان الإجراء CallMyProc يقوم بتعليمات كثيرة لا علاقة لها بما خارج الإجراء وأننا بحاجة إلى استدعاء أحد الإجراءات (كل مرة حسب الحالة) لها نفس الإمضاء هل سنقوم بنسخ ولصق الكود في كل مرة؟ * حالة أخرى: لدينا دالة تقوم بتعليمات تستغرق وقتا يرغب من يستدعيها أن يعرف أين وصلت بها الحال (تقدم العملية، بـ TProgressBar مثلا) في كلا الحالتين يمكننا استخدام CallBack Function مثال مشابه في المرفق لا يفيد في شيء هو الآخر غير أنه يستخدم Function لإعادة إشعار تقدم العملية، والمؤشرات لمرونة أكثر ![]() مثال Recursive عند استعراض الملفات: كود : http://www.delphi-central.com/callback.aspxكود : http://delphi.about.com/od/windowsshellapi/a/callback_delphi.htmبالتوفيق. إعادة الاستدعاء Callback - hanipino - 06-03-2012 و عليكم السلام و رحمة الله العملية شبية نوعا ما ب هاكذا اجراءت : ![]() PHP كود : function add(a, b: Integer): Integer; stdcall;إعادة الاستدعاء Callback - kachwahed - 07-03-2012 فعلا أخي hanipino أو توجيه pascal، ومباشرة ![]() PHP كود : ShowMessage(IntToStr(D4(@Add, 5, 15))); PHP كود : typeالثاني هو نمط لإجراء تابع لغرض يحمل نص string كمعلمة وبالتالي: PHP كود : procedure MyProc(S: string);ويمكن استخدام الإجراء الثاني MyObjProc بصفته TMyObjProc لأنه متعلق بغرض (TForm1 في مثالنا) ولا يمكن العكس، فهما يمثلان إمضاءين مختلفين. إعادة الاستدعاء Callback - kachwahed - 09-03-2012 مثال آخر: أفضل أحيانا من الفحص في كل مرة، أو case..of خاصة من وجود الكثير من الحالات PHP كود : varو TProcedure = procedure في SysUtils لا داعي لإعادة تعريفها إلا عند القلق بشأن الحجم بالمناسبة TMemIniFile مستقلة عن API بخلاف TIniFile. |