في
هذا الدرس سنستخدم البرنامج HelloWroldوالذي
سبق وكتبناه في الدرس
الثاني. سنقوم بتطويرة قليلا حتى
نحصل على النتيجة التي نريد القيام بها
لهذا الدرس.
أولا
ستلاحظ ان كل عملنا سيكون في الكائن
الرئيسي HelloWorld
(وهو عبارة عن ممثل للكائن Applet)
ولكي نوزع الأعمال في هذا الكائن فإننا
سنقوم بإنشاء وظيفة لكل عمل ، والوظائف
التي استخدمناها في هذا الدرس هي كما
يلي:
1)
public
void
init()
هذه
وظيفة الإعداد.
2)
public
void
paint(Graphics g)
هذه
الوظيفة المسؤلة عن الرسم على الشاشة.
3)
public
boolean
mouseUp(Event e, int
x, int
y) هذه
الوظيفة المسؤوله عن موقع (وإزالة
الضغط عن الزر) للفأرة.
4)
public
boolean
mouseMove(Event e, int
x,int
y)
هذه
الوظيفة المسؤولة عن موقع (وحركة)
الفأرة.
كما
ترى اننا قمنا بتقسيم البرنامج لوظائف
لكل منها عمل معين. واحيانا ترجع
الوظيفة قيمة معينة ولذلك نقوم بتعريف
الوظائف عند بدايتها. مثلا في الوظائف 1
و 2 ترى انها من نوع voidوهو
النوع الذي لا يرجع اي قيمة. وفي
الوظائف 3 و 4 من النوع Booleanوهو
النوع الذي يرجع صحيح trueاو
غير صحيح false
، لذلك ستلاحظ في نهاية كل منها أمر
الإرجاع return.
ماذا
نعني بالوظائف ؟
افرض
انك مدير لشركة معينة. وعندك موظفين
ولكل موظف وظيفة معينة : وظيفة
الحسابات وظيفة الصادرات وظيفة
الواردات ....الخ. فأنت بهذه الطريقة
تقوم بمراقبة عمل الشركة ولكنك لا تقوم
بالعمل نفسة. فالحسابات يقوم بها موظف
الحسابات والصادرات يقوم بها موظف
الصادرات وكذلك الواردات يقوم بها
موظف الواردات. بمعنى آخر انت الكائن
الرئيسي في تلك الشركة وعندك موظفين
لكل منهم وظيفة معينة وأحيانا قد تطلب
منهم ان يعطوك تقرير معين عن عملهم ،
مثلا تطلب من موظف الحسابات ان يخبرك
بقدر الربح والخسارة عند القيام بأي
عملية. كذلك في برنامجنا فتستطيع ان
تتصور انه يعمل كشركة فيها كائن رئيسي
مسؤول عنها وفيها وظائف تقوم بعمل معين
واحينا يتطلب منها ان ترجع تقريرا (قيمة
معينة) للكائن الرئيسي.
شرح
الوظائف حسب ترقيمها:
1)
في
وظيفة الإعداد نقوم بتهيئة البرنامج
وإعداده ببعض الموصفات التي يتميز بها.
مثلا في حالتنا هذه نرى شكل الوظيفة
كما يلي :
public
void
init()
{
super.init();
setLayout(new
BorderLayout());
add("North",mousePositionLbl);
}
نرى
أولا ان نوع الوظيفة voidوتعني
ان الكائن الرئيسي لا يتوقع اي قيمة
ترجع منها. ثم
نقوم بإنشاء الكائن BorderLayoutوالذي
عن طريقة نستطيع ان نضيف توزيع معين
للشاشة بحيث استطعنا في الأمر الأخير
أن نقوم بإضهار قيمة المتغير mousePositionLblفي
شمال الشاشة (لأن الكائن السابق يقوم
بتوزيع الشاشة الى شمال ، جنوب ، شرق
وغرب).
2)
في
الوظيفة الثانية نقوم فيها برسم "او
كتابة" ما نشاء على الشاشة ونراهما
كما يلي:
Public
void
paint(Graphics g)
{
Font fnt;
fnt = new
Font("Tahoma",
Font.PLAIN, 40);
g.setFont(fnt);
g.drawString("Hello
World!",100,100);
}
وقد
شرحناها بالتفصيل في الدرس
الثاني ولكن هنا قمنا بإضافة بسيطة
وهي إضافة ابناط الكتابة. وكما ترى
اننا أنشأنا ممثل لكائن الأبناط في
السطر لأول والثاني ثم أمرنا كائن
الرسم ان يضع البنط الذي اخترناه عند
إنشاء كائن الأبناط في الإعتبار ، ثم
اخير امرنا كائن الرسم بكتابة الجملة Hello
World! ولكن
هذه المرة بستخدام البنط الذي اخترناه
وهو في هذه الحالة "Thaoma"
بحجم اربعين نقطة.
3)
في الوضيفتي الثالثة
والرابعة نقوم بمراقبة والتحكم في
اشارة الفأرة ، ونعبر عن طرق الأدخال
في لغة جافا بالأسم حوادث "Event"
(جمع حدث وليس جمع حادث ، ربنا يبعد
الشر) كما يلي:
Public
boolean
mouseUp(Event e, int
x, int
y)
{
setBackground(Color.red);
repaint();
returntrue;
}
أولا
نوع هذه الوضيفة Boolean ولذلك
سوف ترجع اما صحيح او غير صحيح ، فإذا
ضغط المستعمل على الزر فأن الوضيفة
ترجع صحيح "returntrue"
وكذلك نضع الإحدثي السيني لإشارة
الفأرة في المتغير x والإحداثي
الصادي في المتغير y.
احد
الإضافات الجميلة في هذه الوضيفة هي
تغيير لون الخلفية الى اللون الأحمر عن
طريق الأمر :
setBackground(Color.red);
وبما
اننا قمنا بأمر الكمبيوتر بتغيير لون
الخلفية ، فإنه من المفروض القيام
بإعادة رسم كل ما على الشاشة والأخذ
بهذا التغيير في الإعتبار. ونقوم بذلك
عن طريق الأمر التالي:
repaint();
ولكن
لو لاحظت في هذا البرنامج والشرح في
الدروس السابقة اننا قلنا عندما نريد
من برنامجنا ان يمتلك اية مميزات نشاء
نقوم بإضافة الكائن المسؤول عن تلك
المميزات ، ثم ننشيء ممثل لذلك الكائن
وعن طريق ذلك الممثل نقوم بإعطاء
الأوامر التي نريدها. ولكننا نرى في
هذا المثال شيء مختلف ! كيف ؟ مثلا
عندما اردنا في الوظيفة الثانية
استخدام بنط معين قمنا بإنشاء ممثل
لكائن الأبناط وسميناه fntثم
عن طريقة اخترنا بنط معين وكذلك انشأنا
في الوضيفة الثانية كائن الرسم gوعن
طريقة استخدمنا الأوامر المتوفرة كما
شرحنا سابقا ، ولكن نرى ايظا اوامر في
البرنامج ككل ليس لها كائنات تمثلها
وهي:
add("North",mousePositionLbl);
setLayout(new
BorderLayout());
setBackground(Color.red);
repaint();
لماذا
هذه الأوامر ليس لها كائن يمثلها ؟
وهل هي في الأصل جزء من كائن معين ؟
والجواب نعم هي جزء من كائن معين لان
لغة جافا كما سبق وذكرنا تعتمد على
الكائنات بشكل كلي في أوامرها. اذا ما
هو جواب السؤال الأول ، أين هو هذا
الكائن ؟ طبعا للذين يعرفون البرمجة
الكائنية الجواب بسيط جدا وهو الكائن
الرئيسي HelloWrold
(وهو في الحقيقة مجرد ممثل للكائن Applet)والذي
نحن بداخلة (في مجاله).
بالنسبة
للمبتدئين في البرمجة الكائنية ، سبق
وشرحنا في الدرس
الأول أن الكائن له وظائف خاصة به
وبما اننا نعمل من داخل الكائن Applet
(بمعنى اننا في مجاله) فإننا نستطيع
استخدام اوامرة
مباشرة (أو نستطيع ان نمثلة عن طريق
الأمر thisوالذي
لن نستخدمة هنا). والسبب في اننا نستخدم
ممثلين عن الكائنات الأخرى هو اننا
لسنا في مجالها ولذلك كان لا بد من
إنشاء متغيرات تمثلها حتى نستطيع
الوصول الى اوامرها.
قبل
الدخول في شرح الوظيفة الأخيرة في هذا
البرنامج فإننا نود ان نرى الإحداثي
السيني والصادي لإشارة الفأرة على
الشاشة ولذلك سنقوم بإنشاء ممثل
للكائن المسؤول عن ذلك "Label"
وسنطلق علية الأسم mousePositionLblكما
يلي:
private
Label mousePositionLbl = new
Label();
لاحظ
كذلك اننا استخدمنا الأمر privateبدل
الأمر publicوالذي
استخدمناه مع الوظائف الأخرى. ويعني
بإختصار ان هذا المتغير خاص بهذا
الكائن ولا يمكن استخدامه عن طريق
الممثلين لهذا الكائن (نعم اعرف ان
الكائنات ربما تكون اكبر لغز في هذه
الدروس ولذلك سنخصص شرح اوضح للكائنات
وطرق التعامل معها في الدروس القادمة).
4)
الوظيفة
الرابعة مطابقة للوظيفة الثالثة ،
الفرق الوحيد اننا بدل تغيير لون
الخلفية سنقوم بعرض الإحداثي السيني
والصادي على الشاشة بستخدام الكائن
السابق كما يلي:
public
boolean mouseMove(Event e, int x,int y)
{
mousePositionLbl.setText("Cursor is at
"+x+","+y);
repaint();
return true;
}
في
الحقيقة اذا فهمت هذا الدرس فأنا أؤكد
لك بأن لغة جافا ستكون من اللغات
السهلة للتعلم لديك. لأننا مع بساطة
العملية التي قمنا بها هنا إلا انها
تمثل عناصر حيوية في تركيب هذه اللغة
وجميع برامج جافا مطابقة لهذا المثال
ولكن طبعا بتشعب وحجم اكبر حسب
البرنامج المكتوب وضخامته.
|