التحكم اكثر في البرنامج

تحكم اكثر في البرنامج


 

import java.applet.Applet;

import java.awt.*;

public class HelloWorld extends Applet

  {

public void init()

  {

     super.init();

     setLayout(new BorderLayout());

     add("North",mousePositionLbl);

  }

شفرة البرنامج على اليسار

 

كما ترى شفرة البرنامج  كاملا لهذا الدرس في الجهة اليسرى. ولا تدعها تخيفك من الوهلة الأولى. لأني آمل ان تراها غاية في السهولة مع نهاية هذا الدرس.

 

public void paint(Graphics g)

   {

    Font fnt;

    fnt = new Font("Tahoma", Font.PLAIN, 40);

    g.setFont(fnt);

    g.drawString("Hello World!",100,100);

   }

في هذا الدرس سوف نرى كيف نحصل على تحكم اكثر في طريقة توزيع الشفرة البرمجية.

public boolean mouseUp(Event e, int x, int y)

  {

  setBackground(Color.red);

  repaint();

  returntrue

  }

كذلك في هذا الدرس سوف نقوم بالنظر لكيفية استخدام الأبناط التي نريدها للكتابة.

private Label mousePositionLbl = new Label();

public boolean mouseMove(Event e, int x,int y)

  {

     mousePositionLbl.setText("Cursor is at "+x+","+y);

     repaint();

     returntrue;

  }                                                                         

}

في هذا الدرس ايظا سوف نرى كيف نستطيع استغلال الفأرة لنحصل على المعلومات المطلوبة والقيام ببعض المهام كتغيير لون الخلفية ومراقبة مكان وحركة اشارة الفأرة.

توزيع المهام المختلفة في البرنامج لوظائف مختلفة

 

كما نتصور في هذه النقطة من الشرح ان البرنامج سوف يقوم بمهام مختلفة كإختيار بنط معين ثم عرضة على الشاشة ثم مراقبة إشارة الفأرة ..الخ. واحسن طريقة للقيام بهذه المهام هي وضعها في وظائف مختلفة كما سنرى.

 

 

في هذا الدرس سنستخدم البرنامج 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;

   }

 

الخلاصة

في الحقيقة اذا فهمت هذا الدرس فأنا أؤكد لك بأن لغة جافا ستكون من اللغات السهلة للتعلم لديك. لأننا مع بساطة العملية التي قمنا بها هنا إلا انها تمثل عناصر حيوية في تركيب هذه اللغة وجميع برامج جافا مطابقة لهذا المثال ولكن طبعا بتشعب وحجم اكبر حسب البرنامج المكتوب وضخامته.


©جميع حقوق الطبع والنشر محفوضه لموقع انترنت كلنك 2000-2001

. copyright © 2000 internet clinic. All rights reserved

If you have any remarks, please email to web_clinic@hotmail.comاذا كان لديك أي ملاحظة الرجاء الكتابة