الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماهي المشكلة في هذا الكود أو ماهو النقص

مغلق
بدأه ha98 في 22 أغسطس 2004 · 7 رد · 834 مشاهدة · في JavaME
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ياأعزائي كالعادة أنا محتاج لديكم

عملت تطبيق بسيط يحتوي على قائمة بها عنصرين كالتالي

التوحيد

الكوثر

على اعتبار أن المستخدم يحدد السورة ثم يضغط اختيار

فيفتح له نموذج مكتوب به السورة

على العموم عملته ثم جربته على المحاكي فعمل معي تمام

ولكن لما ركبته على الجوال ظهرت لي القائمة

لكن لما جيت اختار السورة لاينفتح معي نموذج العرض

ماهي المشكلة ياإخواني الكود في الملف المرفق

code.rar

#2

الخطا هو التالي

else if (s == form )
   	 if (c == cmdBack)
      mainList.setCommandListener(this);
 	 display.setCurrent(mainList);

  }
  else if (s == form2 )
 	 if (c == cmdBack2)
    mainList.setCommandListener(this);
  display.setCurrent(mainList);

والصحيح هو

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Thank extends MIDlet implements CommandListener
{
	private Display display;

	Command cmdExit = new Command("خروج", Command.EXIT, 0);
	Command cmdBack = new Command("عودة", Command.BACK, 0);


	List mainList;
	Form form;
	Form form2;
	Ticker ticker;

	public Thank  ()
	{
  display =Display.getDisplay(this);
  mainList = new List("القائمة الرئيسية",List.IMPLICIT);
  ticker = new Ticker (" السلام عليكم "); 

	}

	public void startApp()
	{
  mainList.append("التوحيد",null);
  mainList.append("الكوثر",null);
  mainList.addCommand(cmdExit);
  mainList.setTicker(ticker);
  mainList.setCommandListener(this);
  display.setCurrent(mainList);
	}

	public void pauseApp(){ }
	public void destroyApp(boolean unconditional){}

	/************* implements CommandListener ****************/
	public void commandAction(Command c, Displayable s)
	{
  if (  s == mainList )
  {
 	 if (c == cmdExit)
 	 {
    destroyApp(false);
    notifyDestroyed();
 	 }
                                       else if(c==cmdBack)
                                       {
                                          mainList.setCommandListener(this);
                 display.setCurrent(mainList);


                                       }
 	 else if ( c == List.SELECT_COMMAND )
    if ( mainList.getSelectedIndex() == 0 )
    {
   	 form = new Form("التوحيد");
   	 form.append("قل هو الله أحد الله الصمد  \n");  
   	 form.addCommand(cmdBack);
   	 form.setCommandListener(this);
   	 display.setCurrent(form);
    }
    else if (mainList.getSelectedIndex() == 1)
    {
   	 form2 = new Form("الكوثر");
   	 form2.append("إنا أعطيناك الكوثر \n"); 
   	 form2.addCommand(cmdBack);
   	 form2.setCommandListener(this);
      display.setCurrent(form2);          
    }
                                         
}
    


	}  // end commandAction
}  // end Class

لم اجربه ولكن اتطلعت عليه بسرعة

لست متواجد بشكل يومي

#3

السلام عليكم

أخي العزيز مجدي

انحلت مشكلة فتح نموذج عرض السورة

ولكن هناك مشكلة زر العودة إلى القائمة الرئيسية لايعمل

ولكن أيضا لم ألاحظ إضافتك زر العودة إلى أي من النموذجين

form أو form2

يعني لم ألاحظ الكود التالي مثلا

form.addCommand(cmdBack);

لماذا ياترى؟

تم تعديل هذه المشاركة بواسطة ha98 في 23 أغسطس 2004 في 19:51

#4

السلام عليكم

أخي العزيز مجدي أبشرك حاولت إصلاح المشكلة ونجحت بفضل من الله ومن مساعدتك لي استفدت وعرفت أصلحها

وإصلاحها في الملف المرفق

تحياتي

code.rar

#5

الحمد لله انها انصلحت

كنت حاولت حل السؤال الاول لكن وجدت ان الاخ مجدي قام بحله وعندما اعطيت السؤال الثاني روحت للبيت لادقق في الكود وبعد ان جئت بالحل اجدك قد حليته

انا طبعا مرتاح جدا لانك استطعت حله بنفسك وانشاء لمزيد من التطور

وهذا هو الكود الذي كنت سأضعه

/************* implements CommandListener ****************/
public void commandAction(Command c, Displayable s)
{
 if (  s == mainList )
 {
  if (c == cmdExit)
  {
   destroyApp(false);
   notifyDestroyed();
  }
  else if ( c == List.SELECT_COMMAND )
   if ( mainList.getSelectedIndex() == 0 )
   {
    form = new Form("التوحيد");
    form.append("قل هو الله أحد الله الصمد  \n");  
    form.addCommand(cmdBack);
    form.setCommandListener(this);
    display.setCurrent(form);
   }
   else if (mainList.getSelectedIndex() == 1)
   {
    form2 = new Form("الكوثر");
    form2.append("إنا أعطيناك الكوثر \n"); 
    form2.addCommand(cmdBack);
    form2.setCommandListener(this);
     display.setCurrent(form2);          
   }
                                        
}
  else if ( s == form || s == form2 )
    {
      if ( c==cmdBack )
        {
          mainList.setCommandListener(this);
          display.setCurrent(mainList);
         }
    }


}  // end commandAction
}  // end Class
#6

إذاً وأنا كذلك لا أريد أن أخسر هذا الجهد الذي بذلته قبل أن أعلم بردودكم

فهذه مشاركتي أرجو أن يكون لها مكان واسع في صدوركم

------------------------------

ملاحظات وتعديلات على الملف لحل المشكلة :

1- لم تضع أقواس تحديد لكل من الجملتين

الشرطيتين ((if (s==form) و (if (s==form2)

ولذلك ينتهي حد كل من الشرطين عند أول فاصلة منقوطة تكون متاحة

مما تسبب في تنفيذ ما بعدها بدون شرط ،

( أي أن البرنامج يعرض النص بسرعة فائقة ثم ينفذ العودة بدون شرط العودة

وهو الضغط على زر العودة) وهذا هو المهم في المشكلة.

2- قوس إغلاق الجملة الشرطية( if (s == mainList

كان في مكان غير مناسب (بعد الجملة الشرطية( if(s==form )

أي أنه يفصل الجملتين الشرطيتين ( ( if(s==form و ( if(s==form2 )

وهما على مستوى واحد (متوازيتان) وفصلهما غير منطقي .

3- الغاء الرابط else في بداية كل من الجملتين

الشرطيتين ( ( if(s==form و ( if(s==form2 ) لأنه يتسبب في ربطهما

مع الشرط السابق لهما بدون داعي لأنه يسبب تعقيدات لا لزوم لها

--------------

أما عن تنفيذ المحاكي للبرنامج فهو غير شرعي لأن المحاكي لا يمكن أن يمثل

القطع الإلكترونية 100/100 لذلك فربما يحدث بعض التجاوزات الغير منطقية.

------------------------------

لا يلزم تكرار عرض الكود هنا

-------------------------------

يحتاج برنامجك أيضا إلى إعادة تنظيم لكي تسهل مراجعته عليك ولكن

سوف تدرك ذلك مستقبلاً إن شاء الله أتمنى لك التوفيق .

----------------------------

أرجو من الإخوه الخبراء تعديل أخطاء هذا التحليل إذا عثرو عليها

لأن خبرتي لا تعتمد على الجافا فأنا حديث العهد بها

والهدف من هذا التحليل المنطقي هو تنمية المواهب لي ولغيري من منهم يرغبون في

التعرف على التصرفات المنطقية للبرامج وشكراً

#7
اقتباس
1- لم تضع أقواس تحديد لكل من الجملتين

الشرطيتين ((if (s==form) و (if (s==form2)

ولذلك ينتهي حد كل من الشرطين عند أول فاصلة منقوطة تكون متاحة

مما تسبب في تنفيذ ما بعدها بدون شرط ،

( أي أن البرنامج يعرض النص بسرعة فائقة ثم ينفذ العودة بدون شرط العودة

وهو الضغط على زر العودة) وهذا هو المهم في المشكلة.

اخ sih الاقواس ليست مهمة المهم الشرط يكون بين اقواس يعني

( s == form || s == form2 )

|| تعني او اي في حالة تحقق احد الشرطين

&& تعني و اي في حالة تحقق الشرطيين معا

ممكن كمان يكون اكثر من شرط مع مراعاة هنا الاقواس عند وجود اكثر من شرط مثل

if((s==form1 && s==form2) || s==form3)

اقتباس
2- قوس إغلاق الجملة الشرطية( if (s == mainList

كان في مكان غير مناسب (بعد الجملة الشرطية( if(s==form )

أي أنه يفصل الجملتين الشرطيتين ( ( if(s==form و ( if(s==form2 )

وهما على مستوى واحد (متوازيتان) وفصلهما غير منطقي .

نعم واوضح كمان

اقتباس
3- الغاء الرابط else في بداية كل من الجملتين

الشرطيتين ( ( if(s==form و ( if(s==form2 ) لأنه يتسبب في ربطهما

مع الشرط السابق لهما بدون داعي لأنه يسبب تعقيدات لا لزوم لها

نعم ولكن لاحظ الملاحظة التالية

عندما نكتب

if( s==form) //do something1
                  //do something2

فانه يفهمها كالاتي

if(s==form) 
{
// do something1
}
else
//do something2

لذلك تو ضع {} للتوضيح والتبسيط

تم تعديل هذه المشاركة بواسطة مجدي محمود في 24 أغسطس 2004 في 18:00

لست متواجد بشكل يومي

#8
اخ sih الاقواس ليست مهمة المهم الشرط يكون بين اقواس يعني 
( s == form || s == form2 )

أخ مجدي أنت قصدك توضح للقارئ عمل العبارة الشرطية المركبة ( if(s==form || s==form2 إضافة من عندك ،

هذه العبارة لم أتعرض لها

ولكن أقصد هذا المقطع التالي من البرنامج الذي طرحه الأخ ha98

else if (s == form2 )
  if (c == cmdBack2)
   mainList.setCommandListener(this);
 display.setCurrent(mainList);

يتتهي الشرط هنا عند أول فاصلة منقوطة

هكذا تكون الجملة الأخيرة غير ملتزمة بالشرط وهذا هو الخطأ الذي يسأل عنه الأخ ha98

لذلك يلزم وضع أقواس لتحديد مجال الشرط هكذا :

 if (s == form2 )
  if (c == cmdBack2)
    {
   mainList.setCommandListener(this);
 display.setCurrent(mainList);
    }

الأقواس بعد التعديل مهمة هنا .

وشكراً على الأضافات المفيدة

هذا الموضوع مغلق.

مواضيع مشابهة