issamdnn
09-03-2010, 08:20 AM
بسم الله الرحمن الرحيم
أعتذر عن التأخير بالدروس و ذلك بسبب الوعكة الصحية التي ألمت بي مؤخراً ونتابع بعون الله الدروة:
الدرس هو عن الأحداث وإنشاءها للمكونات والكائنات :
إنشاء الأحداث
الحدث( event)هو عبارة عن صلة بين حادثة في النظام (فعل قام به المستخدم أو تغيير في التركيز focus) وهو أيضاً عبارة عن كود برمجي للإستجابة لتلك الحادثة الحاصلة في النظام. إن كود الإستجابة هو معالج للحدث(event handler) عادة ما يكون مكتوب بواسطة مطور التطبيقات (المبرمج), إن الأحداث تمكن مطوري التطبيقات من تخصيص سلوك العناصر دون الحاجة لإحداث تغييرات في الأصناف بحد ذاتها. وهذا ما يعرف بعملية الأيفاد أو(delegation).
إن الأحداث لأكثر أفعال المستخدمين (مثل أفعال حركات الماوس والنقر عليها) تكون بالعادة منشأة ضمن كل العناصر القياسية, ولكن مع ذلك يمكن للمستخدم تعريف أحداث خاصة به . ولإجراء ذلك ينبغي الإطلاع على الدروس السابقة (حول إنشاء الخصائص) وذلك لأن للأحداث والخصائص نفس آلية التنفيذ وكذلك يتوجب فهم ما يلي:
ما هي الأحداث What are events :
الحدث عبارة عن تقنية لربط حادثة مع كود برمجي , وبشكل أكثر تحديداً فإن الأحداث عبارة عن مؤشرات مناهج(توابع وإجرائيات) تشير إلى منهج مثيل للصنف المحدد.
من وجهة نظر مطوري التطبيقات فإن الأحداث مجرد اسم يدل على حادثة في النظام يمكن ربطها مع كود معين , مثل الحدث OnClick فعلى سبيل المثال : فبشكل إفتراضي يقوم دلفي بتوليد معالج للحدث يدعى (Button1Click) في النموذج الذي يحتوي على الزر(button) ويقوم بربطه مع OnClick . فعندما تحصل عملية نقر على الزر فإن الزر يقوم بإستدعاء المنهج المربوط مع OnClick وفي مثالنا هذا هو المنهج Button1Click والشكل التالي يوضح تسلسل العملية :
http://www4.0zz0.com/2010/03/09/08/786566440.jpg
الأحداث هي مؤشرات مناهج Events are method pointers :
إن دلفي يستخدم مؤشرات المناهج لتنفيذ الأحداث. مؤشر المناهج عبارة عن مؤشر من نوع خاص يشير إلى منهج محدد ضمن مكون مثيل (instance object) , كمبرمج عناصر يمكنك أن تعالج مؤشر منهج ما كما لو كان (placeholder)(نائب), عندما يقوم كودك بإكتشاف حدوث حدث ما فإنه يقوم بإستدعاء المنهج المحدد من قبل المستخدم الخاص بهذا الحدث.
مؤشرات المناهج تعمل تماماً بشكل مماثل لأي نوع إجرائي (تعمل مثل الإجرائيات) لكنها تحافظ على وجود مؤشر خفي يشير إلى كائن .
إستدعاء معالج حدث click Calling the click-event handler :
على سبيل المثال : كافة عناصر التحكم تورث المنهج الديناميكي المدعو Click لمالجة أحداث الضغط (Click)على هذه العناصر :
procedure Click; dynamic;
إن التصريح عن المنهج Click يقوم بإستدعاء معالج حدث الضغط إن وجد , وذلك إذا كان المستخدم قد قام بتعيين معالج لحدث عنصر التحكم OnClick . إن الضغط على عنصر التحكم يتسبب بإستدعاء المنهج المعين لمعالجة هذا الحدث , وفي حال لم يتم تعيين معالج لهذا الحدث فإن لاشيء سيحصل.
الأحداث هي عبارة عن خصائص Events are properties:
تقوم العناصر بإستخدام خصائصها لتنفيذ أحداثها, على عكس الخصائص فإن الأحداث لا تستخدم مناهج للتصريح عن القسمين read و write وبدلاً من ذلك فإن خصائص الأحداث تستخدم حقول أصناف خاصة من نفس نوع الخاصية .
بالمناسبة فأن إسم الحقل عبارة عن أسم خاصية يبدأ بالحرف F . فعلى سبيل المثال : فإن مؤشر المنهج OnClick مخزن في الحقل FOnClick من النوع TNotifyEvent . والتصريح عن خاصية الحدث OnClick يبدو بالتالي كما يلي :
type
TControl = class(TComponent(
private
FOnClick: TNotifyEvent; // التصريح عن حقل لإمساك مؤشر المنهج
...
protected
property OnClick: TNotifyEvent read FOnClick write FOnClick;// لا نصرح عن مناهج للقراءة أو الكتابة
end;
ملاحظة هامة: الغاية من جعل الأحداث كالخصائص هو جعلها متوافرة ضمن مفتش الكائنات في دلفي وبالتالي تعيين معالجات لهذه الأحداث آثناء وقت التصميم .
أنواع الأحداث هي أنواع مؤشرات مناهج Event types are method-pointer types :
كافة مناهج معالجات الأحداث هي إجرائيات , ولكي تكون متطابقة مع النوع المعطى للحدث , فإن منهج معالج الحدث ينبغي أن يمتلك نفس عدد الوسطاء وبنفس ترتيب تمرير هذه الوسطاء .
أنواع معالجات الأحداث هي إجرائيات Event handler types are procedures :
على الرغم من أن المترجم يسمح لك بأن تقوم بالتصريح عن أنواع مؤشرات المناهج كتوابع (functions) لكن ينبغي عليك عدم فعل ذلك من أجل معالجة الأحداث وذلك لأن تابع فارغ (بدون وسطاء ) يعيد نتيجة غير معرفة , ولهذا السبب ينبغي أن تكون جميع أحداثك و معالجاتها المرتبطة بها إجرائيات وليست توابع .
على الرغم من كون معالج الحدث لا يمكن أن يكون تابع فأنه يمكنك الحصول على معلومات من (application developer’s code) حول إستخدام الوسطاء المسبوقة بعبارة var , قم بالتأكد من أنك قمت بتعيين قيمة موجودة (متوافرة) للوسيط قبل أن تقوم بإستدعاء المعالج(معالج الحدث).
كمثال على تمرير الوسطاء المسبوقة بعبارة ال var لمعالج الحدث هو الحدث OnKeyPress وهو من النوع TKeyPressEvent أن TKeyPressEvent يعرف بارمترين (وسيطين): الأول(Sender) لتحديد الكائن الذي قام بتوليد الحدث والوسيط الثاني(Key) لتحديد المفتاح الذي تم ضغطه :
type
TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;
عادة فإن الوسيط Key يحتوي على المحرف الذي قام المستخدم بضغطه .تحت ضروف خاصة , مستخدم العناصر ريما يريد تغيير المحارف , فعلى سبيل المثال إذا قام المستخدم بالضغط على محرف معين وأردنا أن تظهر المحارف بحالتها الكبيرة (uppercase) في المحرر (أي محرر نصوص ) في هذه الحالة فأننا نعرف المعالج التالي لحدث ضغط المفتاح :
procedure TForm1.Edit1KeyPressed(Sender: TObject; var Key: Char);
begin
Key := UpCase(Key);
End;
ملاحظة : يمكنك أن تستخدم الوسطاء المسبوقة ب var وذلك لكي تسمح للمستخدمين بتجاوز(override) المعالجة الإفتراضية للحدث.
أعتذر عن التأخير بالدروس و ذلك بسبب الوعكة الصحية التي ألمت بي مؤخراً ونتابع بعون الله الدروة:
الدرس هو عن الأحداث وإنشاءها للمكونات والكائنات :
إنشاء الأحداث
الحدث( event)هو عبارة عن صلة بين حادثة في النظام (فعل قام به المستخدم أو تغيير في التركيز focus) وهو أيضاً عبارة عن كود برمجي للإستجابة لتلك الحادثة الحاصلة في النظام. إن كود الإستجابة هو معالج للحدث(event handler) عادة ما يكون مكتوب بواسطة مطور التطبيقات (المبرمج), إن الأحداث تمكن مطوري التطبيقات من تخصيص سلوك العناصر دون الحاجة لإحداث تغييرات في الأصناف بحد ذاتها. وهذا ما يعرف بعملية الأيفاد أو(delegation).
إن الأحداث لأكثر أفعال المستخدمين (مثل أفعال حركات الماوس والنقر عليها) تكون بالعادة منشأة ضمن كل العناصر القياسية, ولكن مع ذلك يمكن للمستخدم تعريف أحداث خاصة به . ولإجراء ذلك ينبغي الإطلاع على الدروس السابقة (حول إنشاء الخصائص) وذلك لأن للأحداث والخصائص نفس آلية التنفيذ وكذلك يتوجب فهم ما يلي:
ما هي الأحداث What are events :
الحدث عبارة عن تقنية لربط حادثة مع كود برمجي , وبشكل أكثر تحديداً فإن الأحداث عبارة عن مؤشرات مناهج(توابع وإجرائيات) تشير إلى منهج مثيل للصنف المحدد.
من وجهة نظر مطوري التطبيقات فإن الأحداث مجرد اسم يدل على حادثة في النظام يمكن ربطها مع كود معين , مثل الحدث OnClick فعلى سبيل المثال : فبشكل إفتراضي يقوم دلفي بتوليد معالج للحدث يدعى (Button1Click) في النموذج الذي يحتوي على الزر(button) ويقوم بربطه مع OnClick . فعندما تحصل عملية نقر على الزر فإن الزر يقوم بإستدعاء المنهج المربوط مع OnClick وفي مثالنا هذا هو المنهج Button1Click والشكل التالي يوضح تسلسل العملية :
http://www4.0zz0.com/2010/03/09/08/786566440.jpg
الأحداث هي مؤشرات مناهج Events are method pointers :
إن دلفي يستخدم مؤشرات المناهج لتنفيذ الأحداث. مؤشر المناهج عبارة عن مؤشر من نوع خاص يشير إلى منهج محدد ضمن مكون مثيل (instance object) , كمبرمج عناصر يمكنك أن تعالج مؤشر منهج ما كما لو كان (placeholder)(نائب), عندما يقوم كودك بإكتشاف حدوث حدث ما فإنه يقوم بإستدعاء المنهج المحدد من قبل المستخدم الخاص بهذا الحدث.
مؤشرات المناهج تعمل تماماً بشكل مماثل لأي نوع إجرائي (تعمل مثل الإجرائيات) لكنها تحافظ على وجود مؤشر خفي يشير إلى كائن .
إستدعاء معالج حدث click Calling the click-event handler :
على سبيل المثال : كافة عناصر التحكم تورث المنهج الديناميكي المدعو Click لمالجة أحداث الضغط (Click)على هذه العناصر :
procedure Click; dynamic;
إن التصريح عن المنهج Click يقوم بإستدعاء معالج حدث الضغط إن وجد , وذلك إذا كان المستخدم قد قام بتعيين معالج لحدث عنصر التحكم OnClick . إن الضغط على عنصر التحكم يتسبب بإستدعاء المنهج المعين لمعالجة هذا الحدث , وفي حال لم يتم تعيين معالج لهذا الحدث فإن لاشيء سيحصل.
الأحداث هي عبارة عن خصائص Events are properties:
تقوم العناصر بإستخدام خصائصها لتنفيذ أحداثها, على عكس الخصائص فإن الأحداث لا تستخدم مناهج للتصريح عن القسمين read و write وبدلاً من ذلك فإن خصائص الأحداث تستخدم حقول أصناف خاصة من نفس نوع الخاصية .
بالمناسبة فأن إسم الحقل عبارة عن أسم خاصية يبدأ بالحرف F . فعلى سبيل المثال : فإن مؤشر المنهج OnClick مخزن في الحقل FOnClick من النوع TNotifyEvent . والتصريح عن خاصية الحدث OnClick يبدو بالتالي كما يلي :
type
TControl = class(TComponent(
private
FOnClick: TNotifyEvent; // التصريح عن حقل لإمساك مؤشر المنهج
...
protected
property OnClick: TNotifyEvent read FOnClick write FOnClick;// لا نصرح عن مناهج للقراءة أو الكتابة
end;
ملاحظة هامة: الغاية من جعل الأحداث كالخصائص هو جعلها متوافرة ضمن مفتش الكائنات في دلفي وبالتالي تعيين معالجات لهذه الأحداث آثناء وقت التصميم .
أنواع الأحداث هي أنواع مؤشرات مناهج Event types are method-pointer types :
كافة مناهج معالجات الأحداث هي إجرائيات , ولكي تكون متطابقة مع النوع المعطى للحدث , فإن منهج معالج الحدث ينبغي أن يمتلك نفس عدد الوسطاء وبنفس ترتيب تمرير هذه الوسطاء .
أنواع معالجات الأحداث هي إجرائيات Event handler types are procedures :
على الرغم من أن المترجم يسمح لك بأن تقوم بالتصريح عن أنواع مؤشرات المناهج كتوابع (functions) لكن ينبغي عليك عدم فعل ذلك من أجل معالجة الأحداث وذلك لأن تابع فارغ (بدون وسطاء ) يعيد نتيجة غير معرفة , ولهذا السبب ينبغي أن تكون جميع أحداثك و معالجاتها المرتبطة بها إجرائيات وليست توابع .
على الرغم من كون معالج الحدث لا يمكن أن يكون تابع فأنه يمكنك الحصول على معلومات من (application developer’s code) حول إستخدام الوسطاء المسبوقة بعبارة var , قم بالتأكد من أنك قمت بتعيين قيمة موجودة (متوافرة) للوسيط قبل أن تقوم بإستدعاء المعالج(معالج الحدث).
كمثال على تمرير الوسطاء المسبوقة بعبارة ال var لمعالج الحدث هو الحدث OnKeyPress وهو من النوع TKeyPressEvent أن TKeyPressEvent يعرف بارمترين (وسيطين): الأول(Sender) لتحديد الكائن الذي قام بتوليد الحدث والوسيط الثاني(Key) لتحديد المفتاح الذي تم ضغطه :
type
TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;
عادة فإن الوسيط Key يحتوي على المحرف الذي قام المستخدم بضغطه .تحت ضروف خاصة , مستخدم العناصر ريما يريد تغيير المحارف , فعلى سبيل المثال إذا قام المستخدم بالضغط على محرف معين وأردنا أن تظهر المحارف بحالتها الكبيرة (uppercase) في المحرر (أي محرر نصوص ) في هذه الحالة فأننا نعرف المعالج التالي لحدث ضغط المفتاح :
procedure TForm1.Edit1KeyPressed(Sender: TObject; var Key: Char);
begin
Key := UpCase(Key);
End;
ملاحظة : يمكنك أن تستخدم الوسطاء المسبوقة ب var وذلك لكي تسمح للمستخدمين بتجاوز(override) المعالجة الإفتراضية للحدث.